Какие архитектуры для presentation слоя используются и применялись
Что проверяют
Понимаете ли вы эволюцию подходов и причины, по которым от одних ушли к другим, а не только расшифровку аббревиатур. Следом обычно спрашивают, как вы обрабатываете одноразовые события (навигация, снэкбар) и что поменялось с приходом Jetpack Compose.
Как отвечать
Пройдите по порядку и для каждого подхода назовите, какую проблему он решал:
- MVC: на Android вырождался в «толстую» Activity, которая одновременно View и Controller. Тестировать почти нечего;
- MVP: View описана интерфейсом, Presenter держит логику и тестируется на JVM. Проблемы: ручная привязка к жизненному циклу и утечки при повороте экрана, если Presenter держит ссылку на View;
- MVVM:
ViewModelиз Jetpack переживает смену конфигурации, данные отдаются черезStateFlowилиLiveData, корутины запускаются вviewModelScope. ViewModel не знает про View, поэтому ссылка на Activity не утекает; - MVI: одно неизменяемое состояние экрана, действия пользователя приходят как интенты, редьюсер выдаёт новое состояние. Предсказуемо и удобно отлаживать, цена: больше шаблонного кода.
В Compose естественно ложится однонаправленный поток данных: состояние идёт вниз, события вверх. Официальное руководство по архитектуре Android описывает UI-слой именно так: state holder, обычно ViewModel, отдаёт UiState, экран его рисует. Поток собирают через collectAsStateWithLifecycle(), чтобы подписка не жила в фоне.
Про свой опыт скажите конкретно: какой подход был в проекте, почему, и что меняли при переходе.
Где спотыкаются
Называют двустороннее связывание главным плюсом MVVM. Современный Android ушёл к однонаправленному потоку, а DataBinding в новых проектах почти не встречается.
Кладут Context, View или Activity в ViewModel. После поворота экрана это утечка памяти; если нужен контекст, берут AndroidViewModel с контекстом приложения или выносят зависимость в репозиторий.
Отправляют навигацию и сообщения через SharedFlow без буфера или LiveData, и событие теряется или повторяется после поворота. Стоит знать компромиссы: Google советует моделировать такие события как часть состояния и сбрасывать после обработки, многие используют Channel.