Является ли схема Model-View-Presenter (MVP) полезной для Android?

34

Как разделить View и Presenter в Android, в то время как реакции на действия пользователя (Presenter часть MVP) устанавливаются в те же действия, что и элементы GUI (View part of MVP).

«В представлении модельного представления, как говорят Мартин Фаулер или Майкл Фезерс [2], логика пользовательского интерфейса разделена на класс, называемый презентатор, который обрабатывает все вводимые пользователем данные и сообщает« тупому »виду, что и когда дисплей "(цитируется здесь ).

До сих пор я думал, что одной из основных функций Android является интеллектуальная активность, которая выполняет действия, реагирует на них и показывает результаты. Противоречит ли схема MVP философии Android? Есть ли смысл пытаться реализовать это на Android? Если да, как это можно сделать?

Гангнус
источник
2
+1 Хороший вопрос, потому что я еще не видел mvp / mvvm в источниках приложений для Android. Было бы интересно увидеть примеры mvp android и сколько кода / lib они производят. Эта проблема не обсуждалась в рекомендованных Stackoverflow способах создания приложений, переносимых между платформами Android и другими устройствами
k3b
Может быть, я мог бы положить его в Stackoverflow, или это было бы против правил?
Гангнус
Вы можете попросить одного из администраторов перенести этот вопрос вместо дублирования Вопроса. Здесь по programmersвопросам более спорный вопрос "что вы думаете о ../ это хорошо или плохо ...", хотя stackoverflowбольше будет похоже на "Есть ли примеры mvp в Android". Для меня оба места в порядке.
k3b
Мне очень жаль, что я несчастен, но до сих пор я не нашел способа подключиться к админам :-(
Gangnus
Этот вопрос НЕ подходит для переполнения стека. Кстати, вы можете связаться с модераторами, пометив свой пост, используя ссылку "флаг".
ChrisF

Ответы:

15

Приложения Android основаны на Model-View-Controller (MVC) - MVP звучит как то же самое, хотя я раньше не слышал этого термина. Упражнения выполняют роль контроллера, представления XML являются именно этим (хотя вы можете создавать их программно в действии - все проще и проще делать это в XML), а также моделью, которую вы пишете сами. Так что да, эта модель довольно практична.

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

Если вы пишете кроссплатформенное приложение, вам может понадобиться четырехуровневый подход: представление, действие, бизнес-логика и модель. Слои View и Action будут зависеть от платформы, а Business Logic и Model не изменятся. По сути, вы разделяете взаимодействие докладчика и пользователя с уровнем Action, который вызывает уровень Business Logic для выполнения действия, которое хочет пользователь.

Майкл К
источник
+1! Пожалуйста, не могли бы вы дать ссылку или два на некоторые хорошие тексты на нем?
Гангнус
4
Я думал, что MVP предлагает вам возможность сохранить платформу уровня Action(= Presentation) независимой - по крайней мере, когда ваши разные платформы предлагают схожие возможности пользовательского интерфейса.
Док Браун
@DocBrown В теории да. На практике я не уверен, что это когда-либо будет возможно, потому что пользовательские взаимодействия могут поразить либо представление, либо докладчика. Например, в Android считывания обрабатываются действием, но на веб-страницах обрабатывается представление (браузер).
Майкл К
12
«Приложения Android основаны на Model-View-Controller» - это просто неправильно на многих уровнях, извините. Архитектура фреймворка Android построена вокруг классов Бога, где логика View / Controller загромождена.
Игорь Филиппов
2
Хотелось бы, чтобы я мог поднять комментарий @ IgorFilippov более одного раза. Идея, что приложения Android реализуют MVC по своему дизайну, является распространенным заблуждением. В отличие от iOS, Android не обеспечивает архитектуру графического интерфейса с четким разделением задач и позволяет создавать изолированную, легко тестируемую модель. Вы должны предоставить один, будь то MVP, MVC или что-то еще.
Пиовезан
6

У меня нет никакого опыта в программировании на Android, но, кратко изучая некоторые вводные учебники по программированию на Android, я не вижу причины, почему MVP должен быть менее полезным, чем в любой другой среде, управляемой событиями. ActivityКласс не сильно отличается от Dialogили Formв других рамках, поэтому она должна быть легко создать класс «Activitity Presenter» для любого подкласса активности вашего приложения и поставить основную логику там.

События, отправляемые вашей «Деятельности», должны быть делегированы вашему докладчику, и если ваш докладчик собирается отправлять события самостоятельно или вызывать другие зависящие от системы функции, ваша активность должна предоставлять связанные функции через интерфейс, который она разделяет с докладчиком. Но это в основном то же самое, что и в любой другой среде GUI, о которой я знаю.

Док Браун
источник
+1 спасибо за потраченное время. Но, как видно из другого ответа, в Android используется похожая, но другая модель. «Я говорил прозой 50 лет и не знал об этом!» Сейчас я постараюсь посмотреть на различия моделей.
Гангнус
4
@Gangnus: MVP - это особая форма MVC, здесь codebetter.com/jeremymiller/2007/07/26/… вы найдете больше информации. И я почти уверен, что это не вопрос «MVC или MVP». Действия могут быть формой «контроллера», но они зависят от платформы. Разделение логики пользовательского интерфейса на независимый от платформы класс презентаторов для каждого действия, вероятно, облегчит их тестирование на единицу и сделает их более переносимыми.
Док Браун
5

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

Вот краткое объяснение всех трех компонентов MVP

Посмотреть

В android MVP представление содержит две вещи Activity - представление ресурсов android - интерфейс java Activity Реализует представление и внедряет себя (интерфейс View) в презентатора, чтобы докладчик мог общаться с действием, используя интерфейс представления. Первые три блока диаграммы показывают связь между View и Presenter.

Ведущий

Presenter выступает в качестве промежуточного слоя между View и Data / Model. View (Activity) подает команду Presenter для представления чего-либо, а Presenter затем берет данные из базы данных / Model и возвращает презентабельную форму данных в View. View затем заботится о отображении этих данных на экране. И помните, что Presenter - это простой Java-класс, он не должен включать в себя ни один из компонентов Android, иначе это затруднит модульное тестирование презентатора.

Если вы хотите использовать базу данных в презентаторе, сделайте упражнение, создайте экземпляр базы данных и вставьте его в презентатор. Это поможет вам смоделировать базу данных во время модульного тестирования и позволит вам проверить бизнес-логику.

модель

Модель в MVP - это не что иное, как ваш источник данных. View не обращается к данным напрямую, вместо этого он приказывает Presenter обработать данные для них и вернуть информацию, которая может быть отображена без каких-либо дальнейших изменений.

Аджит Сингх
источник
1
Информация полезна, спасибо, но дается плохо. Вы должны не только ссылаться на сайт, даже собственный, но и давать информацию здесь. Справочные ответы не допускаются. Используйте комментарии вместо. Я не отмечаю это только из-за полезной информации на вашем сайте. Пожалуйста, измените его на комментарий или вставьте в ответ некоторую ключевую информацию, которая отвечает на основной вопрос. Тогда наверняка вы получите не только мой плюс, но даже проверку ответа.
Гангнус,
@Gangnus Я предоставил необходимую информацию в ответе, потому что размещение всего контента сделает ответ очень большим.
Аджит Сингх,
1
На самом деле существует два вида MVP. Passive View (то, что вы описали здесь) и Supervising Presenter, который позволяет напрямую привязывать данные представления к модели (во многом как MVVM и многие веб-фреймворки MVC).
RubberDuck