Codementor Events

Архитектура в Android приложении (MVVM) | by Daniil Pavenko | Feb, 2021 | Medium

Published May 25, 2021
Архитектура в Android приложении (MVVM) | by Daniil Pavenko | Feb, 2021 | Medium

Привет читатель, сегодня поделюсь мыслями на тему использования ясного архитектурного подхода, а так же использования шаблонов проектирования.


MVVM - Model View ViewModel, в подходе где есть явное распределение ответственности по слоям.
Всё очевидно, и вроде бы ничего сложно, но почему-то многие изобретают велосипеды.
Я хочу предложить вариант реализации, с определенным уровнем стандартизации взаимодействий между этими слоями и классами.
1*Crf71kSUQQnoM5xILTkqAg.jpeg


View  -  отображение нашего состояния экрана. Соответственно у нас есть один ViewState для текущего экрана, чтоб разработчик мог на будущее заложить, что могут быть свойства общие для всех экранов, необходимо создать CoreViewState, класс от которого наследуются все наши состояния.

ViewModel  -  часть составления нашего состояния и обработки логики, либо обращения в другие части UseCase, Manager etc, где выполняем логику по действию пользователя, либо состоянию экрана. ViewModel так же должна иметь свой core класс CoreViewModel, общий для приложения. Соотношения ViewModel 1..1 ViewState как в примере кода ниже видим, что для каждого ViewModel, будет один ViewState (заимствовано из MVI, за не использованием DataBinding-а).

1*r1eFooAsLNzc_7UozrVFng.png

Создавая подобный шаблон, мы ограничиваем разработчика от того, чтоб наплодить множество состояний экрана, с различными классами.


Опишем базовый класс слоя View, где будем использовать Fragment класс, для отображения контента, помним, что Fragment может существовать без View, а так же в нашем примере отобразим реализацию с использованием ViewBinding.

1*7zSsUhf0vqw1BMQys_jIWg.png

Пример так же для BottomSheetFragment.
Достаточно тонки базовый класс.
Можно подключать любимый ваш DI, чтоб удобно подключать зависимости.
Фрагменты наследники очень просто инициализируются, и так же декларированы и обязуют создать ViewModel и ViewState соответственно.

С таким подходом, уже реализовал несколько приложений, очень удобно масштабировать, удобно в связке с Koin-ом и Navigation Component, легко отлавливать баги, и в целом их процент снижается, особенно в команде.
GitHub: простой пример

Discover and read more posts from Daniil Pavenko
get started