Преобразование данных

Из 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 шт):

Автор решения: Roman Konoval

У каждого класса должна быть одна обязанность.

У DefaultPointsToPolylineMapper уже есть четкая обязанность. Имеет смысл добавить UserSettingsAwarePointsToPolylineMapper, который будет декоратором для PointsToPolylineMapper и уже его использовать в ViewModel предварительно завернув в него DefaultPointsToPolylineMapper.

UserSettingsAwarePointsToPolylineMapper должен сначала вызвать того, кого он оборачивает, а потом применить свою логику, т.е. достать значения сохраненных настроек пользователя и применить к polylineOptions. Для этого придется в UserSettingsAwarePointsToPolylineMapper внедрить как зависимость сервис UserSettingsService, который будет позволять доставать настройки.

Есть альтернативный вариант. Создать ParametrizedPointsToPolylineMapper, у которого толщина и цвет задаются в момент создания экземпляра маппера. Далее мы не используем фиксированный маппер в ViewModel, а создаем его динамически с помощью UserSettingsAwarePointsToPolylineMapperProvider.

→ Ссылка