Какие MVx паттерны используются в Android и их краткое описание
Что проверяют
Понимаете ли вы, какую проблему решает каждый паттерн и как он уживается с жизненным циклом Android. Следом обычно спрашивают, что используете вы и как передаёте одноразовые события вроде навигации или показа Snackbar.
Как отвечать
Идите по эволюции, так видно, зачем появлялся каждый следующий вариант:
- MVC: в Android роли контроллера и представления исторически сливались в
Activity, отсюда активити на тысячи строк, которые невозможно покрыть unit-тестами; - MVP: логика уходит в Presenter, View описывается интерфейсом. Тестируется хорошо, но Presenter держит ссылку на View, и при повороте экрана её нужно отвязывать вручную, иначе утечка или падение;
- MVVM: Jetpack
ViewModelпереживает смену конфигурации и ничего не знает о View. Состояние отдаётся черезStateFlow(в старом кодеLiveData), экран на него подписывается. Data Binding для MVVM не обязателен, в новых проектах его почти не берут; - MVI: одно неизменяемое состояние экрана, действия пользователя приходят как намерения, редьюсер вычисляет новое состояние. Однонаправленный поток данных упрощает отладку и хорошо ложится на Compose.
Добавьте, что официальный гайд Google по архитектуре описывает UI-слой через state holder и однонаправленный поток данных. На практике это MVVM с единым UiState, то есть почти MVI. В Compose состояние собирают через collectAsStateWithLifecycle().
Покажите компромиссы: MVI даёт больше шаблонного кода и требует аккуратности с копированием больших состояний, MVP сейчас встречается в основном в легаси.
Где спотыкаются
Передают в ViewModel ссылку на Activity или View. Это утечка памяти: ViewModel живёт дольше экрана.
Путают Intent из MVI с android.content.Intent. В MVI так называют действие пользователя, к системным интентам это отношения не имеет.
Кладут одноразовые события в StateFlow и получают повторный показ сообщения после поворота. Нужно либо отражать событие в состоянии и сбрасывать его после обработки, либо отдавать через Channel и аккуратно собирать.