Sobes.tech
Назад к вопросам
Junior — Middle
50

Каким образом вы осуществляли взаимодействие и преобразование данных между различными уровнями и слоями архитектурной схемы?

Компании, где спрашивали
Dogma

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Ожидают услышать, что между слоями данные не передавались напрямую как «как есть», а приводились к нужной форме через мапперы или преобразователи. Важно показать, что доменная модель, DTO и UI-модель были разделены. Также важно, чтобы преобразование было централизованным, тестируемым и не размазывалось по экрану.

Определение:

В Android-проектах взаимодействие между слоями обычно строится так, чтобы каждый слой работал со своей моделью данных. Например, сеть возвращает DTO, доменный слой оперирует бизнес-моделями, а UI — моделями, удобными для отображения. Преобразование между ними выполняют отдельные мапперы, расширения или функции преобразования, чтобы не смешивать ответственность слоёв.

Пример использования:

Допустим, API возвращает пользователя в виде UserDto, а экрану нужен UserUiModel. Тогда на уровне репозитория или use case данные преобразуются в доменную модель, а затем — в модель для интерфейса.

data class UserDto(
    val id: String,
    val first_name: String,
    val last_name: String
)

data class UserDomain(
    val id: String,
    val fullName: String
)

data class UserUiModel(
    val title: String
)

fun UserDto.toDomain(): UserDomain =
    UserDomain(
        id = id,
        fullName = "$first_name $last_name"
    )

fun UserDomain.toUi(): UserUiModel =
    UserUiModel(
        title = fullName
    )

Пояснение кода:

UserDto отражает контракт внешнего источника данных, например API.
toDomain() убирает зависимость от структуры ответа сервера и приводит данные к бизнес-формату.
toUi() преобразует бизнес-объект в удобный для отображения вид.
Если меняется формат ответа API, это затрагивает только слой преобразования, а не весь UI.

Ключевые моменты:

  • Каждый слой должен работать со своей моделью, а не с чужими внутренними структурами.
  • Преобразование лучше делать в одном месте: мапперах, extension-функциях или отдельных классах.
  • UI не должен знать о DTO и сетевых деталях.
  • Доменный слой не должен зависеть от Android UI и API-контрактов.
  • Такой подход упрощает тестирование, сопровождение и замену источника данных.
  • Важно не перегружать маппинг логикой: он должен быть предсказуемым и простым.