Архитектура в Android приложении (MVVM)

Daniil Pavenko
2 min readFeb 15, 2021

--

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

MVVM Model View ViewModel, в подходе где есть явное распределение ответственности по слоям.

Всё очевидно, и вроде бы ничего сложно, но почему-то многие изобретают велосипеды.

Я хочу предложить вариант реализации, с определенным уровнем стандартизации взаимодействий между этими слоями и классами.

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

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

https://pastebin.com/PtQ0T3TH

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

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

https://pastebin.com/f2X7GSvd

Пример так же для BottomSheetFragment.

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

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

GitHub: простой пример

--

--

Daniil Pavenko
Daniil Pavenko

Written by Daniil Pavenko

0 Followers

Senior Android Developer (Kotlin/Java), begin at 2012