Разделите HTTP-слой, репозиторий, ViewModel и Compose-экран. Преобразуйте ответ в состояние интерфейса, а правило выбора цвета сделайте явным.
Отображение цвета экрана в зависимости от полученных данных о гражданине
Разделите HTTP-слой, репозиторий, ViewModel и Compose-экран. Преобразуйте ответ в состояние интерфейса, а правило выбора цвета сделайте явным.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Выполняя требования чистой архитектуры, необходимо добавить следующую функциональность:
- Выполнить HTTP‑запрос к бекенду, получить сведения о пользователе. Сервер вернёт JSON следующего формата
{
"id": "string",
"age": "18",
"gender": ["MALE", "FEMALE"]
}
- С помощью Jetpack Compose отрисовать фон всего приложения: если в ответе присутствует значение
FEMALE– задать красный цвет, еслиMALE– черный. - Применить любой подходящий шаблон проектирования.
- Подключить любой контейнер внедрения зависимостей.
- Предполагается, что все необходимые библиотеки (конвертер JSON, Retrofit, Ktor и т.п.) уже включены в проект.
Ответ
Разделите HTTP-слой, репозиторий, ViewModel и Compose-экран. Преобразуйте ответ в состояние интерфейса, а правило выбора цвета сделайте явным.
В условии есть неоднозначность: массив содержит одновременно MALE и FEMALE, но приоритет не задан. На собеседовании это нужно уточнить. Один допустимый вариант — считать такой ответ ошибкой данных и показывать нейтральный экран, а не выбирать цвет случайно.
- DTO принимает строковый age и список gender. Mapper проверяет возраст и допустимые значения.
- Репозиторий скрывает HTTP-клиент за интерфейсом и возвращает доменную модель.
- ViewModel запускает загрузку в своей области корутин и публикует Loading, Content или Error.
- Compose отображает состояние: единственный FEMALE — красный фон, единственный MALE — чёрный; неизвестный или противоречивый набор — согласованный fallback.
- Hilt или Koin связывает интерфейс репозитория с реализацией.
Цвета принадлежат UI-слою, DTO — data-слою. Повторный запрос запускается явным действием, а не при каждой рекомпозиции.