Построение MVP архитектуры Android приложения: советы и технологии

mvp architecture Построение MVP архитектуры Android приложения: советы и технологии
2.6/5 - (5 голоса)

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

Заложенная программистами архитектура напрямую влияет на то, понадобится ли постоянная поддержка и “ремонт” приложения или же все будет работать (и продолжать работать) как надо. Один из главных практических советов, которые мы ходим тут привести, заключается в эффективном планировании времени.

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

Прямо противоположный результат не заставит себя ждать: куча багов, недоработок, трат и “перезаливок”. Поэтому необходимо все правильно спланировать (включая оценку объема работ) еще на начальном этапе проекта.

В этой статье мы поделимся эффективными подходами к созданию архитектуры Android приложений, в частности, принципами построения MVP (Model-View-Presenter) архитектуры.
 

Что такое MVP архитектура

 

Паттерн Model-View-Presenter является одним из шаблонов, используемых для проектирования архитектуры мобильного приложения. Model-View-Presenter имеет три слоя:
 

  • Model — представляет собой интерфейс, отвечающий за управление данными (включая кэширование данных и управление базами данных) приложения и “хранение” его бизнес-логики. В Android приложении роль Model часто выполняет REST API или база данных API.
  • Presenter — выступает посредником между Model и View и отвечает за обновление представления, реагируя на взаимодействие пользователей с обновлением модели. Вся логика представления находится в Presenter, который также контролирует Model и общается с View, что позволяет обновлять конкретный View, когда это нужно.
  • View — отвечает только за представление данных в виде, определяемым Presenter. Представление может быть реализовано с помощью любого Android виджета или всего, что может выполнять такие операции как показ ProgressBar, обновление TextView и заполнение RecyclerView.

 

Преимущества MVP архитектуры в Android приложении

 

MVP архитектура представляет собой эффективную архитектурную модель для разработки Android приложений. Основные преимущества паттерна Model-View-Presenter следующие:
 

  • Более простая отладка. Программистам проще делать отладку в приложении, так как MVP использует три разных слоя абстракций. Проводить модульное тестирование также проще, поскольку бизнес-логика полностью отделена от View.
  • Разрешает повторное использование кода. При построении MVP архитектуры разработчики могут многократно применять уже написанный код. Это становится возможным благодаря множеству представителей, которые контролируют Views. Такой подход более надежен по сравнению с использованием только одного presenter.
  • Эффективное разделение функциональностей приложения — под ним понимается отделение бизнес-логики и других частей от классов активности и фрагментов, которые, в свою очередь, лучше обеспечивают разделение функциональностей.

 

Практические советы по созданию MVP архитектуры

 

1. Улучшите способность Views к тестированию
 
Тестирование Views в Android является достаточно непростой задачей ввиду сложности фреймворка. Для улучшения процесса тестирования вам следует реализовать Passive View.

Данный паттерн представляет собой экран и компоненты со специфичным поведением приложения, выведенным в контроллер, что позволяет ему контролировать состояние виджетов. В рассматриваемой ситуации контроллером будет выступать presenter.

Для примера, если вам нужно реализовать фичу регистрации и отправления какой-либо заявки, включающую такие компоненты как форма с именем и паролем пользователи и кнопка “Отправить”/Отправить на рассмотрение” (“Send”/“Submit”), размещать логику валидации в presenter и только в нем, таким образом не усложняя view.

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

2. Сделайте Presenter независимым от фреймворка
 
Следующий шаг в улучшении тестирования заключается в том, чтобы сделать Presenter независимым от фреймворка. Убедитесь, что он не зависит от Android классов. Если вы создаете ваше приложение на Java, то для написания Presenter используйте только ее зависимости.

Вы отделяете Presenter от деталей реализации (Android framework), благодаря чему можете писать тесты для Presenter без применения Robolectric (платформа для unit-тестирования Android приложений на JVM), а также быстрее запускать тесты на вашей локальной JVM без эмулятора.
 

3. Не создавайте обратные вызовы в интерфейсе Presenter
 
Presenter не должен содержать методы типа Action-lifecycle (onCreate (…), onStart (), onResume () и их двойные методы), так как они значительно усложняют его жизненный цикл активности.

Пользуйтесь случаем упростить жизненный цикл. Так, вместо вызова метода с тем же именем в обратном вызове жизненного цикла у вас есть возможность вызвать действие presenter. Например, (в конце Activity.onCreate (…) вы можете вызвать load () и т.д.).
 

4. Управляйте удаленными и локальными источниками данных в Model
 
Путем управления удаленными и локальными источниками данных в Model вы можете увеличить скорость работы вашего приложения. Например, вам нужно сделать так, чтобы приложение работало даже при отключении соединения с данными (в режиме офлайн).

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

Разместите логику, отвечающую за взаимодействие с presenter, в репозитории данных (data repository). Локальный класс хранения данных (local data storage class) может работать с кэшированными данными, тогда как класс удаленного источника данных (remote data source class) будет обрабатывать все удаленные вызовы API и ответы.
 

5. Используйте Dagger2 и RxJava для минимизации избыточности кода
 
Для того, чтобы свести избыточность кода к нулю и сделать Presenter независимым от жизненного цикла View, используйте такие библиотеки как Dagger2 и RxJava. Применение RxJava или ее аналогов позволит упростить базу кода.

В свою очередь, использование Dagger2 (библиотека внедрения зависимостей) упростит поведение компонентов путем введения зависимости между ними. Теперь рассмотрим внедрение зависимостей на примере его реализации при помощи Kotlin (о самом языке и его преимуществах мы поговорим позднее).

Сначала нужно добавить зависимости библиотеки Dagger2 в файл модуля build.gradle. Поскольку Dagger2 включает в себя обработчик аннотаций, следует применить плагин kotlin-apt к модулю.
 
apply plugin: ‘com.android.application’
apply plugin: ‘kotlin-android’
apply plugin: ‘kotlin-kapt’
apply plugin: ‘kotlin-android-extensions’

// …


dependencies {
   // …

   // Dagger 2
   implementation «com.google.dagger:dagger:2.14.1»
   kapt «com.google.dagger:dagger-compiler:2.14.1»
   compileOnly «org.glassfish:javax.annotation:3.1.1»
}
 

6. Используйте правильные соглашения об именовании методов
 
Правильные соглашения об именовании методов, которые вы используете в своей базе кода, позволяют эффективно распределить обязанности. Как правило, в Presenter у вас есть две разные категории методов — действия (activities) и пользовательские события (user events).

Пользовательские события представляют собой действия, которые запускаются пользователем. Действия — это методы, которые будут содержать логику, с которой будет обновляться представление (View).

Например, load () даст presenter команду загрузить другую страницу в то время как пользователь скроллит страницы приложения.

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

7. Напишите контракт, описывающий взаимодействие между View и Presenter
 
Если вам нужно реализовать новую функцию, будет разумным начать с написания контракта, который детально описывает взаимодействие View и Presenter.

Хорошим практическим примером является решение, предлагаемое Google (в репозитории Android Architecture). Оно состоит из интерфейса с внутренними интерфейсами, один для view и второй для presenter:
 
public interface SearchRepositoriesContract {
 interface View {
   void addResults(List<Repository> repos);
   void clearResults();
   void showContentLoading();
   void hideContentLoading();
   void showListLoading();
   void hideListLoading();
   void showContentError();
   void hideContentError();
   void showListError();
   void showEmptyResultsView();
   void hideEmptyResultsView();
 }
 interface Presenter extends BasePresenter<View> {
   void load();
   void loadMore();
   void queryChanged(String query);
   void repositoryClick(Repository repo);
 }
 

Почему стоит использовать Kotlin для MVP архитектуры

 

Kotlin представляет собой статически типизированный язык программирования, который работает поверх JVM (Java Virtual Machine) полностью совместим с Java, что позволяет программистам использовать два языка в одном проекте. В прошлом году Kotlin был признан официальным языком для разработки Android приложений.

Kotlin создавался для решения нескольких задач, что вполне удалось. Во-первых, он наследует много преимуществ и характеристик Java, при этом убирая многие ее недостатки. Во-вторых, у него есть потенциал полностью заменить Java в будущем.

Несмотря на то что первая версия Kotlin была выпущена сравнительно недавно (в феврале 2016), на данный момент язык очень популярен, а его использование такими компаниями как Uber, Netflix, Coursera и Pinterest только подогревает к нему интерес.
 
По сравнению с Java, разработка мобильных приложений на Kotlin более простая. Код более читабельный и лаконичный, что заметно даже в самом простом примере:
 

Java code:

if (getActivity() instanceof LoginActivity)

((LoginActivity) getActivity ()). register ();
 
Kotlin code:

if (activity is LoginActivity)

   activity. register ()
 

Одной из главных особенностей языка являются extension функции для стандартных Java коллекций. Благодаря ним уменьшается количество кода и снижается риск потенциальных ошибок, а работа с данными становится проще.

Также разработчикам легче осуществить последующую модификацию кода. Другая “полезность” Kotlin — его делегаты, которые способствуют использованию композиции на 100%.

Помимо указанных особенностей данного языка программирования, существуют и многие другие. Более того, JetBrains (российская компания, разработавшая Kotlin) постоянно работает над его улучшением, выпуская обновления и новые версии.

Подводя итоги, MVP архитектура имеет много преимуществ для разработки Android приложений. В статье мы постарались привести практические советы, которые помогут вам при ее построении. Надеемся, они будут вам полезны.)
 
Также спешим сообщить, что Smartum Pro расширяет команду разработчиков мобильных приложений и приглашает вас стать частью нашего дружного коллектива.

На данный момент у нас открыты вакансии Java и Android разработчиков, с которыми вы можете ознакомиться, перейдя по указанным ссылкам. Ждем ваше резюме!

2.6/5 - (5 голоса)
×