Чи корисна схема Model-View-Presenter (MVP) для Android?


34

Як відокремити View і Presenter в Android, тоді як реакції на дії користувача (Presenter part of MVP) встановлюються в ті ж дії, що і елементи GUI (Перегляд частини MVP).

"У модельному представнику програми перегляду так, як кажуть Мартін Фаулер або Майкл Перо [2], логіка інтерфейсу користувача розділена на клас, який називається презентатор, який обробляє весь вхід від користувача і який повідомляє" німий "погляд, що і коли робити дисплей "(цитується звідси ).

До цього часу я не думав, що однією з головних особливостей Android є розумна діяльність, яка здійснює дії, реагує на них і показує результати. Чи суперечить схемі MVP з філософією Android? Чи є сенс намагатися реалізувати це на Android? Якщо так, то як це можна зробити?


2
+1 Добре запитання, оскільки я ще не бачив mvp / mvvm у джерелах додатків для Android. Було б цікаво побачити приклади mvp android та скільки коду / lib накладних витрат. Цю проблему не обговорювали на рекомендованих Stackoverflow способах виготовлення-програми-портативної платформи між Android-та-іншими платформами
k3b

Можливо, я міг би вкласти це в Stackoverflow, або це було б проти правил?
Gangnus

Ви можете попросити одного з адміністраторів перенести це питання замість дублювання запитання. Тут на programmersпитання більш суперечливе питання "що ви думаєте .. / це добре чи погано ...", хоча stackoverflowце буде більше схоже на "Чи є приклади mvp в android". Для мене обидва місця в порядку.
k3b

Мені дуже шкода моєї нещасності, але до цих пір я не знайшов способу підключитися до адміністраторів :-(
Gangnus

Це питання НЕ підходить для переповнення стека. BTW - ви можете зв’язатися з модераторами, позначивши свою публікацію, використовуючи посилання "прапор".
ChrisF

Відповіді:


15

Програми для Android принципово побудовані навколо Model-View-Controller (MVC) - MVP звучить як одне і те ж, хоча термін я ще не чув. Діяльність заповнює роль Controller, XML Views - це саме те, що (хоча ви можете побудувати їх програмно в Activity - це просто простіше і простіше зробити це в XML), і модель, яку ви пишете самостійно. Так що так, ця модель цілком практична.

Можлива причина, що ви, можливо, мало чули про цю модель дизайну, полягає в тому, що рамка Android змушує вас відокремити погляд. Оскільки програми на мобільних пристроях, як правило, невеликі, люди не схильні використовувати повноцінний MVC; вони схильні до шарів перегляду та дій, де шар дії виконує більшу частину (невеликої) роботи моделі.

Якщо ви пишете програму на різних платформах, можливо, ви захочете переглянути чотиришаровий підхід: Перегляд, Дія, Бізнес-логіка та Модель. Шари «Перегляд» та «Дія» будуть залежати від платформи, тоді як бізнес-логіка та модель не змінюватимуться. В основному ви розділяєте взаємодію між презентатором та користувачем на рівень Дія, який викликає шар Business Logic для виконання дії, яку хоче користувач.


+1! Скажіть, будь ласка, посилання або дві на якісь хороші тексти?
Gangnus

4
Я думав, що MVP пропонує вам можливість зберегти Action(= презентацію) платформу шарів незалежною - принаймні, коли ваші різні платформи пропонують подібні можливості інтерфейсу користувача.
Док Браун

@DocBrown Теоретично, так. На практиці я не впевнений, що це колись стане можливим, оскільки взаємодія користувачів може вразити або представлення даних, або презентатора. Наприклад, в Android пальцями обробляється активність, але на веб-сторінках обробляється перегляд (браузер).
Майкл К

12
"Програми для Android принципово побудовані навколо Model-View-Controller" - це дуже не так на багатьох рівнях, вибачте. Рамкова архітектура Android побудована навколо класів God, де логіка перегляду / контролера захаращена.
Ігор Філіппов

2
Я б хотів, щоб я міг підтримати коментар @ IgorFilippov не один раз. Ідея, що програми Android реалізують MVC задумом, є поширеною помилковою думкою. На відміну від iOS, жодна архітектура графічного інтерфейсу не застосовується Android, чітко розмежовуючи проблеми та передбачаючи ізольовану, легко тестувану модель. Ви повинні забезпечити себе, будь то MVP, MVC чи щось інше.
Piovezan

6

Я не маю досвіду програмування Android, але, якщо коротко ознайомитися з деякими вступними навчальними посібниками для Android, я не бачу причини, чому MVP має бути менш корисним, як у будь-яких інших рамках, що керуються подіями. ActivityКлас не сильно відрізняється від Dialogабо Formв інших рамках, тому вона повинна бути легко створити клас «Activitity Presenter» для будь-якого підкласу активності вашої програми і поставити основну логіку там.

Події, надіслані вашій "Діяльності", повинні бути делеговані вашому презентатору, і якщо ваш ведучий буде надсилати події самостійно або зателефонувати за іншими функціями, залежними від системи, ваша активність повинна надавати відповідні функції через інтерфейс, яким він ділиться з презентатором. Але це в основному те саме, що і в будь-якому іншому графічному інтерфейсі, про який я знаю.


+1 дякую за ваш час. Але як ви бачите з іншої відповіді, в Android використовується аналогічна, але інша модель. "Я говорив прозою 50 років і не знав про це!" Зараз я спробую розглянути відмінності моделей.
Gangnus

4
@Gangnus: MVP - це особлива форма MVC, тут ви знайдете більше інформації codebetter.com/jeremymiller/2007/07/26/… . І я впевнений, що це не питання "або MVC, або MVP". Діяльність може бути формою "контролера", але вони залежать від платформи. Відокремлення логіки користувальницького інтерфейсу для незалежного майстер-класу платформи для кожного виду діяльності, ймовірно, полегшить їх перевірку на одиниці та більш портативно.
Doc Brown

5

MVP безумовно корисний для Android. Це допомагає впорядкувати та перевірити свій код. І найкраща частина - це те, що нові люди, які читають ваш код, зможуть зрозуміти код і почнуть вносити свій внесок, як тільки вони зрозуміють, що куди піти. Ось дуже корисне посилання для розуміння MVP з прикладами .

Ось коротке пояснення всіх трьох компонентів MVP

Вид

У MVP для android подання містить дві речі Діяльність - ресурс андроїда Перегляд - інтерфейс Java. Діяльність реалізує представлення, і він вводить себе (інтерфейс перегляду) у презентатор, щоб ведучий міг спілкуватися з діяльністю за допомогою інтерфейсу перегляду. Перші три блоки діаграми показують зв'язок між View і Presenter.

Ведучий

Презентатор виступає середнім рівнем між Переглядом та Даними / Модель. Перегляд (Діяльність) командує ведучого представити щось, а ведучий потім бере дані з бази даних / Модель і повертає презентабельну форму даних у Перегляд. Потім View переймається відображенням даних на екрані. І пам’ятайте, що Presenter - це звичайний клас java, він не повинен включати жоден з андроїдних компонентів, інакше це зробить складне тестування оглядача презентатора.

Якщо ви хочете використовувати базу даних у презентаторі, тоді зробіть активність, створіть екземпляр бази даних та вставте її у презентатор. Це допоможе вам знущатися над базою даних під час тестування одиниць та дасть змогу перевірити логіку бізнесу.

Модель

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


1
Інформація корисна, дякую, але вона надається погано. Вам слід не лише цитувати веб-сайт, навіть власний, але давати тут інформацію. Довідкові відповіді не допускаються. Використовуйте замість цього коментарі. Я не позначаю це лише через корисну інформацію на вашому сайті. Будь ласка, змініть його на коментар або укладіть у відповідь якусь ключову інформацію, яка відповідає тілу питання. Тоді напевно ти отримаєш не лише мій плюс, але навіть перевірку відповіді.
Gangnus

@Gangnus Я надав необхідну інформацію у відповіді, оскільки розміщення всього вмісту зробить відповідь дуже великою.
Аджит Сінгх

1
Насправді існує два види MVP. Passive View (те, що ви описали тут) та Supervising Presenter, що дозволяє безпосередньо прив’язувати дані погляду до моделі (подібно до MVVM та багатьох фреймах MVC).
RubberDuck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.