Как лучше реализовать доставку данных в классы
Есть репозиторий настроек
interface SettingsRepositiry {
fun get(): Single<Settings> //RxKotlin
}
Есть абстрактный маппер
interface Mapper {
fun map(value: String): String
}
Есть реализация маппера
class MapperImpl(private val settingsRep: SettingsRepositiry) : Mapper {
override fun map(value: String): String {
val settings = settingsRep.get()//необходимо получить настройки
return "$value ${settings.weight}" //условное использование настроек
}
}
Код выше не будет работать..
Или можно было бы сделать такую реализацию
class MapperImpl @Inject constructor(private val settings: Settings) : Mapper {
override fun map(value: String): String {
return "$value ${settings.weight}" //условное использование настроек
}
}
Код выше тоже непонятно как будет работать, т.к. необходимо перед инициализацией асинхронно получить Settings, а инициализация происходит при создании Фрагмента/активити через Dagger.
Другой пример. В одном из маппером используется BitmapDiscriptor, но ему необходимо получать настройки при генерации Bitmap
class MyMapper @Inject constructor(private val bitmapDescriptor: BitmapDescriptor) : Mapper {
override fun map(value: Data): OtherData {
val otherData = OtherData()
otherData.bitmap = bitmapDescriptor.bitmapDescriptorFromVector(R.drawable.photo) //код условный.
//....
return otherData
}
}
class BitmapDescriptor @Inject constructor(private val context: Context, private val settings: Settings) {
fun bitmapDescriptorFromVector(vectorResId: Int): BitmapDescriptor? {
return ContextCompat.getDrawable(context, vectorResId)?.run {
setBounds(0, 0, intrinsicWidth, intrinsicHeight)
var bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888)
draw(Canvas(bitmap))
bitmap = bitmap.scale(width * settings.weight, height * settings.weight, false) //необходимо менять размер bitmap в соответствии с пользовательскими настройками
BitmapDescriptorFactory.fromBitmap(bitmap)
}
}
}
Такой подход работал бы если получение настроек были бы синхронными, но что если они идут асинхронно?
Ну в принципе понятно, что нужно либо поменять на синхронное получение настроек либо нужно переделывать BitmapDescriptor и Mapper"ы чтобы на вход метода приходили параметры Settings.
Как лучше сделать?
Ответы (1 шт):
Если говорить про первый пример, то вы неправильно выстраиваете зависимости и ответственность классов. Маппер не должен зависеть от репозитория, так как его обязанность только преобразование данных. Он по хорошему вообще ничего не должен знать ни о чём и получать на вход метода преобразования все необходимые данные.
Репозиторий должен зависеть от маппера (получать его в конструкторе). Обязанность репозитория получить данные, не важно асинхронно или синхронно и уже после, применив маппер, их преобразовать и передать по назначению.
Во втором примере по сути всё тоже самое. BitmapDescriptor не должен зависеть от настроек, а должен получать их на вход метода bitmapDescriptorFromVector из класса MyMapper. Так же и MyMapper ничто про них знать не должен, а получать их будет на вход метода map из репозитория.
То как получать настройки вы должны решить сами, но уже в репозитории.