Какую архитектуру выбрать для Android приложения и почему
Что проверяют
Знаете ли вы современный подход, который рекомендует Google, и можете ли объяснить, какую проблему решает каждый слой. Следом обычно просят рассказать, как состояние доходит от репозитория до экрана и что происходит при повороте.
Как отвечать
Надёжная опора это официальное руководство по архитектуре Android: слои UI, domain и data с однонаправленным потоком данных. На практике это MVVM с элементами MVI:
- UI-слой: экраны на Jetpack Compose,
ViewModelдержит состояние экрана вStateFlowодним неизменяемым классом. События идут от UI к ViewModel, состояние обратно, в Compose его собирают черезcollectAsStateWithLifecycle(); - domain-слой: use case для логики, которую переиспользуют несколько экранов. Руководство называет этот слой необязательным, и это стоит сказать вслух;
- data-слой: репозитории как единый источник правды, под ними Room, Retrofit или Ktor, DataStore для настроек. Данные отдаются через
Flow, и экран обновляется сам после записи в базу; - зависимости: Hilt как стандарт от Google или Koin, если важны простота и KMP;
- модули:
featureиcoreмодули с convention plugins в Gradle, чтобы сборка оставалась быстрой.
Объясните, почему так. ViewModel переживает поворот экрана, корутины в viewModelScope отменяются вместе с ней, единый объект состояния исключает рассинхрон отдельных полей, а слои позволяют тестировать логику без эмулятора через kotlinx-coroutines-test и Turbine. LiveData поддерживается до сих пор, но в новом коде на Kotlin её место занял StateFlow.
Где спотыкаются
Передают в ViewModel ссылку на Activity, View или их Context. ViewModel живёт дольше активности, и при повороте получается утечка памяти. Если нужен контекст, это Application.
Собирают Flow в UI без учёта жизненного цикла. Подписка продолжает работать в фоне и тратит ресурсы, для этого и существуют repeatOnLifecycle и collectAsStateWithLifecycle().
Плодят use case, которые в одну строку вызывают метод репозитория. Это слой ради слоя: интервьюер спросит, что он даёт, и ответить будет нечего.