Архитектура в Android приложении (MVVM)
Привет читатель, сегодня поделюсь мыслями на тему использования ясного архитектурного подхода, а так же использования шаблонов проектирования.
MVVM — Model View ViewModel, в подходе где есть явное распределение ответственности по слоям.
Всё очевидно, и вроде бы ничего сложно, но почему-то многие изобретают велосипеды.
Я хочу предложить вариант реализации, с определенным уровнем стандартизации взаимодействий между этими слоями и классами.
View — отображение нашего состояния экрана. Соответственно у нас есть один ViewState для текущего экрана, чтоб разработчик мог на будущее заложить, что могут быть свойства общие для всех экранов, необходимо создать CoreViewState, класс от которого наследуются все наши состояния.
ViewModel — часть составления нашего состояния и обработки логики, либо обращения в другие части UseCase, Manager etc, где выполняем логику по действию пользователя, либо состоянию экрана. ViewModel так же должна иметь свой core класс CoreViewModel, общий для приложения. Соотношения ViewModel 1..1 ViewState как в примере кода ниже видим, что для каждого ViewModel, будет один ViewState (заимствовано из MVI, за не использованием DataBinding-а).
Создавая подобный шаблон, мы ограничиваем разработчика от того, чтоб наплодить множество состояний экрана, с различными классами.
Опишем базовый класс слоя View, где будем использовать Fragment класс, для отображения контента, помним, что Fragment может существовать без View, а так же в нашем примере отобразим реализацию с использованием ViewBinding.
Пример так же для BottomSheetFragment.
- Достаточно тонки базовый класс.
- Можно подключать любимый ваш DI, чтоб удобно подключать зависимости.
- Фрагменты наследники очень просто инициализируются, и так же декларированы и обязуют создать ViewModel и ViewState соответственно.
С таким подходом, уже реализовал несколько приложений, очень удобно масштабировать, удобно в связке с Koin-ом и Navigation Component, легко отлавливать баги, и в целом их процент снижается, особенно в команде.
GitHub: простой пример