Skip to main content

Сущности приложения

Сетевые и доменные сущности

Почти любое мобильное приложение оперирует данными из сетевых объектов - посылает запрос, получает ответ, и что-то делает с полученными данными. Классы которые используются для отправки и получения данных от сервера называются сетевыми.

Когда приложение работает напрямую с сетевыми сущностями, то в случае, если на сервере что-то изменят, например вложенность объектов или имена некоторых полей, то вам придется изменять все места в приложении, где используются переименованные поля или измененные объекты.

Чтобы этого избежать, используйте доменные сущности - объекты, содержащие только те данные из сетевых сущностей, которые используются в приложении. При получении нового объекта от сервера - преобразуйте (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 ?: ""
)
}

Практическое задание

  • Используйте проект, готовый после раздела Логирование и обработка ошибок
  • Проверьте, что используете доменные сущности в вашем приложении, сетевые сущности должны использоваться только в репозитории