Сущности приложения
Сетевые и доменные сущности
Почти любое мобильное приложение оперирует данными из сетевых объектов - посылает запрос, получает ответ, и что-то делает с полученными данными. Классы которые используются для отправки и получения данных от сервера называются сетевыми.
Когда приложение работает напрямую с сетевыми сущностями, то в случае, если на сервере что-то изменят, например вложенность объектов или имена некоторых полей, то вам придется изменять все места в приложении, где используются переименованные поля или измененные объекты.
Чтобы этого избежать, используйте доменные сущности - объекты, содержащие только те данные из сетевых сущностей, которые используются в приложении. При получении нового объекта от сервера - преобразуйте (map
) его в доменный.
Тогда, если какая-то сетевая сущность изменится, вам всего лишь нужно будет переделать ее маппер в доменную.
Также, в доменных сущностях должны находиться только те данные, которые используются в приложении. Например, не нужно хранить все 20 полей сетевого объекта, если в приложении нужны только 3.
Пример сетевого класса:
@Serializable
data class StarShipResponse(
val name: String,
val weight: Int,
val length: Int,
val height: Int,
@SerialName("max_speed")
val maxSpeed: Int,
@SerialName("build_date")
val buildDate: String,
val type: String,
val manufacturer: String,
@SerialName("load_capacity")
val loadCapacity: Int,
@SerialName("unique_info")
val uniqueInfo: String? = null
)
Пример доменного класса с учетом того, что в приложении используется только следующая информация о корабле:
- название
- максимальная скорость
- тип (грузовой, боевой, гражданский)
- компания-производитель
- уникальная информация о конкретном корабле.
data class StarShip(
val name: String,
val maxSpeed: Int,
val type: String,
val manufacturer: String,
val uniqueInfo: String
)
При маппинге сетевого объекта в доменный для удобства его использования некоторым полям можно присвоить значения, чтобы не обрабатывать null
.
Пример функции-маппера:
internal fun StarShipResponse.mapToStarShip(): StarShip {
return StarShip(
name = this.name,
maxSpeed = this.maxSpeed,
type = this.type,
manufacturer = this.manufacturer,
uniqueInfo = this.uniqueInfo ?: ""
)
}
Практическое задание
- Используйте проект, готовый после раздела Логирование и обработка ошибок
- Проверьте, что используете доменные сущности в вашем приложении, сетевые сущности должны использоваться только в репозитории