Преобразование данных
Из Domain слоя получаю List<Point> в ViewModel.
class Point(val lat: Double, lon: Double, titile: String)
Во ViewModel необходимо из List<Point> получить PolylineOptions, для этого сделал маппер
interface PointsToPolylineMapper : Mapper<List<Point>, PolylineOptions>
и есть реализация
class DefaultPointsToPolylineMapper @Inject constructor(val context: Context):
PointsToPolylineMapper {
override fun transform(value: List<Point>): PolylineOptions {
val polylineOptions = PolylineOptions()
val color = Color.parseColor("#24AEB6")
value.point?.map {
polylineOptions.add(LatLng(it.lat, it.lon))
}
polylineOptions.color(color)
return polylineOptions
}
}
polylineOptions.color(color) - вообще должен быть в маппере или все таки где-то в другом месте? Обязанности маппера ограничить только маппингом или считается нормальным доп настройки внутри маппера?
Сейчас, например, необходимо дать возможность пользователю настраивать цвет и размер линий вручную. Ок, сделал сохранение настроек пользователя, но непонятно в каком месте их использовать.
Ответы (1 шт):
У каждого класса должна быть одна обязанность.
У DefaultPointsToPolylineMapper уже есть четкая обязанность. Имеет смысл добавить UserSettingsAwarePointsToPolylineMapper, который будет декоратором для PointsToPolylineMapper и уже его использовать в ViewModel предварительно завернув в него DefaultPointsToPolylineMapper.
UserSettingsAwarePointsToPolylineMapper должен сначала вызвать того, кого он оборачивает, а потом применить свою логику, т.е. достать значения сохраненных настроек пользователя и применить к polylineOptions. Для этого придется в UserSettingsAwarePointsToPolylineMapper внедрить как зависимость сервис UserSettingsService, который будет позволять доставать настройки.
Есть альтернативный вариант. Создать ParametrizedPointsToPolylineMapper, у которого толщина и цвет задаются в момент создания экземпляра маппера. Далее мы не используем фиксированный маппер в ViewModel, а создаем его динамически с помощью UserSettingsAwarePointsToPolylineMapperProvider.