itmo_conspects

Лекция 4. Архитектура Android-приложения

Программная архитектура приложения - это то, как приложение устроено на высоком уровне: из каких частей оно состоит, как эти части взаимодействуют и по каким правилам эта система должна развиваться

Цель архитектуры - это уменьшение трудозатрат на создание, содержание и развитие системы

За время развития индустрии в компаниях пришли к многочисленным решениям организации кода, таких как MVC (Model-View-Controller), трехслойная или гексагональная архитектура

Позднее Роберт Мартин сформировал принцип “чистой архитектуры” (Clean Architecture):

Из этого следует, что бизнес-логика не должна зависеть от пользовательского интерфейса, от базы данных или другого внешнего сервиса

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

Обычно выделяют 4 слоя (от внутреннего к внешнему):

Чистая архитектура

Зависимости в таком положении указываются только из внешнего слоя вовнутрь, то есть сущности и их варианты использования не должны зависеть от пользовательского интерфейса

Чтобы элементы какого-либо внешнего слоя общались между собой, они должны взаимодействовать через элемент внутреннего слоя, который имеет два интерфейса: один для запроса и другой для ответа

Взаимодействие элементов


Применительно к Android-приложениям архитектуру делят на три слоя:

Слой пользовательского интерфейса включает элементы интерфейса, которые отображаются на экране, и носителей состояния (State holder). Носители состояния хранят данные, которые получили из другого слоя, и предоставляют их пользовательскому интерфейсу

Слой доменной модели опционален и отвечает за инкапсуляцию сложной бизнес-логики

Слой данных определяет, как приложение получает, хранит и синхронизирует данные

Архитектура Android-приложения

Пример файловой организации проекта может быть таким:

📁 src
    📁 data
        📁 remote
            📁 api
            📁 dto
        📁 local
            📁 db
            📁 dao
            📁 entities
        📁 mapper
        📁 repository
    📁 domain
        📁 model
        📁 repository
        📁 usecase
    📁 presentation
        📁 screen
            📁 main
                📄 MainActivity
                📄 MainViewModel
                📄 MainUiState
        📁 mapper

Также при разработке применяют архитектурные паттерны. Они описывают, как организовать взаимодействие между пользовательским интерфейсом, состоянием и бизнес-логикой приложения.

MVC

Архитектура MVC (Model-View-Controller) состоит из трех компонентов: модели, представления и контроллера.

В Android классическая архитектура MVC встречается редко, потому что активность или фрагмент часто берут на себя слишком много обязанностей и превращаются в перегруженные классы

Преимущества MVC:

Недостатки MVC:

MVC

MVP

Архитектура MVP (Model-View-Presenter) разделяет ответственность между моделью, представлением и презентатором

Главная идея архитектуры MVP состоит в том, что представление должно быть максимально простым, а основная логика взаимодействия переносится в презентатор. Такой подход упрощает тестирование, потому что презентатор можно проверять отдельно от пользовательского интерфейса

Преимущества MVP:

Недостатки MVP:

MVP

MVVM

Архитектура MVVM (Model-View-ViewModel) особенно популярна в Android-разработке. В ней:

В модель представления обычно помещают логику экрана, которая не должна зависеть от жизненного цикла конкретных активности или фрагмента. В Android-разработке этот паттерн часто используют вместе с типами LiveData, StateFlow или во фреймворке Jetpack Compose

Преимущества MVVM:

Недостатки MVVM:

MVVM

MVI

Архитектура MVI (Model-View-Intent) строится вокруг однонаправленного потока данных (Unidirectional Data Flow)

Главное преимущество MVI состоит в том, что состояние экрана хранится в одном месте и изменяется предсказуемо. Такой подход удобен для сложных экранов с большим количеством состояний, но может требовать больше шаблонного кода

Преимущества MVI:

Недостатки MVI:

MVI

MVVM и MVI чаще всего применяются в современных Android-приложениях, потому что они хорошо сочетаются с реактивным подходом и удобны для сопровождения