Що таке MVP і MVC і в чому різниця?


2133

Якщо дивитися за рамки RAD (перетягування та налаштування) способу побудови користувальницьких інтерфейсів, які багато інструментів заохочують, ви, швидше за все, натрапите на три моделі дизайну під назвою Model-View-Controller , Model-View-Presenter та Model-View-ViewModel . Моє запитання має три частини до нього:

  1. Які питання вирішують ці зразки?
  2. Чим вони схожі?
  3. Чим вони відрізняються?


2
IDK, але нібито для оригінального MVC він мав бути використаний у малому. У кожної кнопки, мітки тощо був власний об’єкт перегляду та контролера, або, принаймні, так стверджує дядько Боб. Я думаю, що він говорив про Smalltalk. Подивіться його розмови на YouTube, вони захоплюючі.
still_dreaming_1

MVP додає додатковий шар
непрямості,

2
Основна відмінність полягає в тому, що в MVC Контролер не передає жодних даних від Моделі до Перегляду. Він просто повідомляє Перегляд, щоб отримати дані від самої Моделі. Однак у MVP не існує зв'язку між Вид і Модель. Сам ведучий отримує будь-які дані, необхідні від Моделі, і передає їх у Вигляд для показу. Більше про це разом із зразком андроїд у всіх моделях архітектури можна знайти тут: digigene.com/category/android/android-architecture
Ali Nem

Їх називають архітектурними зразками, а не дизайнерськими візерунками . Якщо ви хочете знати різницю, перевірте це
Хасан Ель-Хефнаві

Відповіді:


1996

Model-View-Presenter

У MVP презентатор містить бізнес-логіку інтерфейсу користувача для представлення даних. Усі виклики від представника перегляду безпосередньо в Presenter. Презентатор також відокремлюється безпосередньо від Погляду та спілкується з ним через інтерфейс. Це дозволяє дозволити знущання з виду в одиничному тесті. Одним загальним атрибутом MVP є те, що повинно бути багато двосторонньої диспетчеризації. Наприклад, коли хтось натискає кнопку "Зберегти", обробник подій делегує методу "OnSave" презентатора. Після того, як збереження завершено, Презентатор передзвонить Перегляд через його інтерфейс, щоб Перегляд міг відобразити, що збереження завершено.

MVP, як правило, є дуже природною схемою для досягнення роздільної презентації у веб-формах. Причина полягає в тому, що Перегляд завжди створюється спочатку під час виконання ASP.NET. Ви можете дізнатися більше про обидва варіанти .

Дві основні варіанти

Пасивний вид: Вид є максимально німим і містить майже нульову логіку. Ведучий - це середня людина, яка розмовляє з Поглядом та Моделлю. Вид і модель повністю захищені одна від одної. Модель може викликати події, але Ведучий підписується на них для оновлення Перегляду. У пасивному перегляді немає прямого прив'язки даних, натомість представлення відкриває властивості сеттера, які Presenter використовує для встановлення даних. Увесь стан керується в Presenter, а не у Перегляді.

  • Pro: максимальна поверховість; чисте розділення виду та моделі
  • Con: більше роботи (наприклад, усіх властивостей програми), оскільки ви виконуєте прив'язку даних.

Контролер контролера: Презентатор обробляє жести користувачів. Вид прив'язується до Моделі безпосередньо за допомогою прив'язки даних. У цьому випадку завдання Ведучого передавати Модель на вид, щоб вона могла прив’язатись до неї. Презентатор також містить логіку для жестів, таких як натискання кнопки, навігація тощо.

  • Про: за допомогою використання прив'язки даних кількість коду зменшується.
  • Con: там менш тестова поверхня (через зв’язування даних), і менше виду капсуляції у Перегляді, оскільки він спілкується безпосередньо з Модель.

Модель-перегляд-контролер

У MVC контролер відповідає за визначення того, який вид відображати у відповідь на будь-яку дію, в тому числі, коли програма завантажується. Це відрізняється від MVP, коли дії рухаються через Перегляд до Презентатора. У MVC кожна дія у Перегляді співвідноситься з викликом до контролера разом із дією. У Інтернеті кожна дія включає виклик до URL-адреси, з іншого боку якої є Контролер, який відповідає. Після того як цей контролер завершить обробку, він поверне правильний вигляд. Послідовність продовжується таким чином протягом усього життя програми:

    Дія у виду
        -> Виклик контролера
        -> Логіка контролера
        -> Контролер повертає Вид.

Ще одна велика відмінність щодо MVC полягає в тому, що вид не безпосередньо прив'язується до моделі. Вигляд просто видається і є абсолютно бездержавним. У реалізаціях MVC View зазвичай не матиме логіки в коді позаду. Це суперечить MVP, коли це абсолютно необхідно, тому що, якщо Перегляд не делегує Презентатору, він ніколи не зателефонує.

Презентаційна модель

Ще одна модель, на яку слід звернути увагу - це Презентаційна модельвізерунок. У цій схемі немає презентації. Натомість перегляд пов'язується безпосередньо з презентаційною моделлю. Модель презентації - це модель, створена спеціально для представлення. Це означає, що ця Модель може виявити властивості, які ніколи не було б застосовано до доменної моделі, оскільки це було б порушенням роз'єднаності проблем. У цьому випадку презентаційна модель прив'язується до доменної моделі і може підписатися на події, що надходять із цієї моделі. Потім "Перегляд" підписується на події, що надходять із презентаційної моделі, та оновляється відповідно. Модель презентації може розкривати команди, які подання використовує для виклику дій. Перевага такого підходу полягає в тому, що ви можете по суті видалити код позаду, оскільки PM повністю інкапсулює всю поведінку для перегляду.Model-View-ViewModel .

Є стаття MSDN про модель презентації та розділ у складеному Посібнику щодо застосування WPF (колишня призма) про розділені шаблони презентації.


27
Чи можете ви уточнити цю фразу? Це відрізняється від MVP, коли дії рухаються через Перегляд до Презентатора. У MVC кожна дія у Перегляді співвідноситься з викликом до контролера разом із дією. Для мене це звучить як те саме, але я впевнений, що ви описуєте щось інше.
Panzercrisis

16
@Panzercrisis Я не впевнений, що це мав на увазі автор, але це, на мою думку, вони намагалися сказати. Як і ця відповідь - stackoverflow.com/a/2068/74556 згадує, у MVC методи контролерів засновані на поведінці - іншими словами, ви можете зіставити декілька поглядів (але однакову поведінку) на один контролер. У MVP презентатор з'єднаний ближче до виду і, як правило, призводить до картографування, яке наближається до одного, тобто перегляд дій, що відображаються на відповідний метод презентатора. Зазвичай дії іншого подання не відображатимуться з методом іншого (у іншому представленні) презентатора.
Дастін Кендалл

2
Зауважте, що MVC часто використовується в таких веб-кадрах Laravel, де отримані запити URL-адреси (можливо, зроблені користувачами) обробляються, Controllerа HTML, що генерується, Viewнадсилається клієнтові. Отже, це Viewє частиною резервного і Користувач ніколи не може отримати доступ до нього безпосередньо, і якщо у вас виникне навпаки, то розгляньте це як розширення MVC (або навіть порушення). @Panzercrisis, це відрізняється від MVP(як, що використовується в AndroidОС), де actions route through the View to the Presenterі користувач має прямий доступ до View.
Топ-майстер

454

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

MVC

MVC

MVP

введіть тут опис зображення


10
Це відмінне зображення схематичного зображення, що показує абстракцію та повну ізоляцію будь-яких графічних інтерфейсів (перегляд матеріалів) від API презентатора. Один незначний момент: головний презентатор може використовуватися там, де є лише один ведучий, а не один на перегляд, але ваша діаграма є найчистішою. IMO, найбільша відмінність між MVC / MVP полягає в тому, що MVP намагається утримувати подання повністю недійсним, окрім відображення поточного "стану перегляду" (перегляд даних), а також забороняє перегляду будь-які знання про об'єкти Model. Таким чином, інтерфейси, які потребують наявності, вводять цей стан.

4
Гарна картина. Я використовую MVP досить багато, тому хотів би зазначити один момент. На мій досвід, ведучі мають спілкуватися один з одним досить часто. Те саме стосується Моделей (або Бізнес-об'єктів). Через ці додаткові «сині лінії» спілкування, які були б на вашому MVP pic, стосунки Presenter-Model можуть стати досить заплутаними. Тому я схильний підтримувати відносини «один на один» презентатор-модель проти «один-багато». Так, для моделювання потрібні додаткові методи делегування, але це зменшує багато головних болів, якщо API моделі змінюється або потребує рефакторингу.
splungebob

3
Приклад MVC неправильний; існує чітке співвідношення 1: 1 між поглядами та контролерами. За визначенням, контролер інтерпретує введення жестами людини для створення подій для моделі та перегляду однаково для одного елемента керування. Простіше кажучи, MVC призначався для використання лише з окремими віджетами. Один віджет, один перегляд, один елемент керування.
Самуель А. Фальво II

3
@ SamuelA.FalvoII не завжди, є 1: Багато між контролерами і уявлень ASP.NET MVC: stackoverflow.com/questions/1673301 / ...
StuperUser

4
@StuperUser - Не впевнений, що я думав, коли писав це. Ви, звичайно, маєте рацію, і, озираючись на те, що я написав, я маю задуматися, чи мав я на увазі якийсь інший контекст, який я не зміг сформулювати. Дякуємо за виправлення.
Самуель А. Фальво II

421

Я про це блогував деякий час назад, цитуючи чудовий пост Тодда Снайдера про різницю між ними :

Ось ключові відмінності між моделями:

MVP Pattern

  • Вид більш вільно поєднується з моделлю. Ведучий відповідає за прив'язку моделі до перегляду.
  • Легше перевірити блок, оскільки взаємодія з представленням здійснюється через інтерфейс
  • Зазвичай перегляд карти ведучого один на один. Складні перегляди можуть мати кілька презентантів.

MVC Шаблон

  • Контролер базується на поведінці та може бути поділений у різних поглядах
  • Може нести відповідальність за визначення того, який вид відображати

Це найкраще пояснення в Інтернеті, яке я міг знайти.


15
Я не розумію, як на думку можна зв'язати більш-менш тісно з моделлю, коли в обох випадках вся справа в тому, щоб повністю їх розв’язати. Я не маю на увазі, що ти сказав щось не так - просто переплутав, що ти маєш на увазі.
Білл К

18
@pst: з MVP це дійсно 1 перегляд = 1 ведучий. За допомогою MVC контролер може управляти кількома видами перегляду. Ось і справді. У моделі "вкладки" уявіть, що кожна вкладка має власний презентатор на відміну від одного контролера для всіх вкладок.
Джон Лім’яп

4
Спочатку існує два типи контролерів: той, який, як ви сказали, ділиться на декілька переглядів, і такий, який є переглядом конкретного, в основному призначений для адаптації інтерфейсу спільного контролера.
Acsor

1
@JonLimjap Що це означає під одним поглядом? Чи є в контексті програмування iOS це одне екранне? Це робить контролер iOS більше схожим на MVP, ніж MVC? (З іншого боку, ви також можете мати кілька контролерів iOS на екран)
huggie

2
Ну діаграматична ілюстрація MVC Тодда повністю суперечить ідеї роз'єднання Погляду та Моделі. Якщо ви подивитеся на діаграму, на ній написано View Model updates (стрілка від Model to View). У якій Всесвіті є система, де Модель безпосередньо взаємодіє з Поглядом, нерозділеним ???
Еш

260

Ось ілюстрації, які представляють потік зв'язку

введіть тут опис зображення

введіть тут опис зображення


43
У мене питання щодо діаграми MVC. Я не отримую тієї частини, де вигляд виходить для отримання даних. Я думаю, що контролер переправить до перегляду потрібні дані.
Брайан Різо

54
Якщо користувач натискає кнопку, як це не взаємодіє з поданням? Мені здається, що в MVC користувач взаємодіє з поданням більше, ніж контролер
Джонатан

5
Я знаю, що це стара відповідь - але чи могла хтось відповісти на точку @JonathanLeaders? Я надходжу з фону winforms, якщо ви не зробили дуже унікальне кодування, коли ви натискаєте користувальницький інтерфейс / View отримує знання про цей клік раніше, ніж будь-що інше. Принаймні, наскільки я знаю?
Роб П.

6
@RobP Я думаю, що такі види графіків завжди є занадто складними або занадто простими. Якщо потік діаграми MVP також справедливий для програми MVC. Можуть бути різні варіанти, залежно від мовних особливостей (прив'язка даних / спостерігач), але врешті-решт ідея полягає в тому, щоб відокремити погляд від даних / логіки програми.
Лука Фюльб'є

15
@JonathanLeaders Люди мають на увазі справді різні речі, коли вони говорять "MVC". Людина, яка створила цю діаграму, мабуть, мав на увазі класичний веб-MVC, де "введення користувача" - це HTTP-запити, а "перегляд повертається користувачеві" - відображена HTML-сторінка. Отже, будь-яка взаємодія між користувачем та представленням "не існує" з точки зору автора класичного додатка MVC Web.
cubuspl42

170

MVP - це не обов'язково сценарій, коли перегляд відповідає (див. Наприклад MVP Taligent).
Мені прикро, що люди все ще проповідують це як зразок (Перегляд відповідальності) на відміну від анти-зразка, оскільки він суперечить "Це просто погляд" (Прагматичний програміст). "Це просто перегляд" зазначає, що остаточний вигляд, показаний користувачеві, є другорядним питанням програми. Модель MVP від ​​Microsoft значно ускладнює повторне використання поглядів та зручно виправдовує дизайнера Microsoft від заохочення до поганої практики.

Якщо бути абсолютно відвертим, я думаю, що основні проблеми MVC справедливі для будь-якого впровадження MVP, і відмінності майже повністю семантичні. Поки ви дотримуєтесь розгляду проблем між представленням (який відображає дані), контролером (який ініціалізує та керує взаємодією користувача) та моделлю (базовими даними та / або послугами)), то ви досягаєте переваг MVC . Якщо ви досягаєте переваг, то кого насправді цікавить, чи є ваш зразок MVC, MVP чи контрольований контролер? Єдиним справжнім малюнком залишається MVC, решта - це просто різні смаки.

Розглянемо цю надзвичайно захоплюючу статтю, яка всебічно перераховує ряд цих різних реалізацій. Ви можете зауважити, що всі вони роблять те саме, але трохи інакше.

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


28
Я прочитав кілька відповідей та блогів про відмінності між MVC / MVP / MVVM / тощо. Насправді, коли ви переходите до справи, все одно. Не важливо, чи є у вас інтерфейс чи ні, і ви використовуєте сеттер (або будь-яку іншу мовну функцію). Здається, що різниця між цими зразками породжувалась від різниці в реалізації різних фреймворків, а не від концепції.
Майкл

6
Я б не назвав MVP анти-шаблоном , як пізніше у публікації ".. решта [включаючи MVP] - це просто різні смаки [MVC] ..", що означатиме, що якби MVP був анти-шаблоном, був MVC ... це просто аромат для іншого підходу до рамки. (Тепер деякі конкретні реалізації MVP можуть бути більш-менш бажаними, ніж деякі конкретні реалізації MVC для різних завдань ...)

@Quibblsome: "Я особисто думаю, що MVP був нещодавно введений знову як привабливий термін, щоб зменшити аргументи між семантичними фанатиками, які аргументують, чи є щось справді MVC чи ні [...] Жодна з цих причин у моїх книгах не виправдовує його існування як окремий шаблон дизайну ». . Він досить відрізняється, щоб зробити його виразним. У MVP представлення може бути будь-яким, що відповідає заздалегідь заданому інтерфейсу (View in MVP - це окремий компонент). У MVC контролер створений для певного виду (якщо артерії відносин можуть змусити когось відчути, що варто іншого терміну).
Hibou57

6
@ Hibou57, ніщо не заважає MVC посилатися на погляд як на інтерфейс або створювати загальний контролер для декількох різних поглядів.
Дивовижна

1
Самуїл, будь ласка, поясни, про що ти говориш. Якщо ви не розкажете мені історію команди, яка "винайшла" MVC, тоді я неймовірно сумнівний щодо вашого тексту. Якщо ви просто говорите про WinForm, то є й інші способи вчинити справи, і я створив проекти WinForm, де прив'язки управління керує контролером, а не "індивідуальними елементами управління".
Дивовижний

110

MVP: перегляд відповідає.

Перегляд, у більшості випадків, створює його ведучий. Ведучий буде взаємодіяти з моделлю та керувати поданням через інтерфейс. Перегляд іноді взаємодіє з ведучим, як правило, через якийсь інтерфейс. Це зводиться до впровадження; чи хочете вигляд виклику методів виклику презентатора чи ви хочете, щоб у перегляді були події, які слухач ведучого слухає? Це зводиться до цього: Погляд знає про ведучого. Вид переглядає ведучого.

MVC: контролер відповідає.

Контролер створюється або отримує доступ до нього на основі якоїсь події / запиту. Потім контролер створює відповідний вигляд і взаємодіє з моделлю для подальшого налаштування подання. Він зводиться до: контролер створює та управляє поданням; погляд є рабом контролера. Погляд не знає про контролер.


3
"Перегляд не знає про контролер." Я думаю, ти маєш на увазі, що погляд не контактує безпосередньо з моделлю?
Lotus Notes

2
погляд ніколи не повинен знати про модель в ефірі.
Брайан Ліхі

4
@Brian: "Перегляд у більшості випадків створює його Presenter." . Я в основному бачив навпаки, коли Presenter запускав і модель, і вигляд. Добре, що View також може запустити Presenter, але ця точка насправді не є найбільш відмінною. Найголовніше, що відбувається пізніше протягом життя.
Hibou57

2
Ви можете відредагувати свою відповідь, щоб пояснити далі: Оскільки представлення даних не знає про контролер, яким чином дії користувача, які виконуються на «візуальних» елементах, які користувач бачить на екрані (тобто перегляд), передаються контролеру. ...
Еш

77

введіть тут опис зображення

MVC (контролер перегляду моделі)

Вхід спрямовується спочатку на контролер, а не на вигляд. Цей вхід може надходити від користувача, який взаємодіє зі сторінкою, але це може бути і просто введенням певного URL-адреса в браузер. У будь-якому випадку, це контролер, з яким пов'язаний, щоб розпочати деяку функціональність. Між контролером і видом існує взаємозв'язок між собою. Це тому, що один контролер може вибрати різні подання для відображення на основі операції, що виконується. Зверніть увагу на стрілку в одну сторону від Controller to View. Це пояснюється тим, що представлення даних не має жодних знань про контролер або посилання на нього. Контролер передає Модель назад, тому є знання між Переглядом і очікуваною моделлю, що передається в неї, але не Контролером, який її обслуговує.

MVP (презентатор подання моделі)

Введення починається з представлення даних, а не з презентатора. Існує відображення «один на один» між Переглядом та пов’язаним з ним презентатором. Перегляд містить посилання на ведучого. Ведучий також реагує на події, викликані з Перегляду, тому він усвідомлює Перегляд, з яким пов'язаний. Презентатор оновлює Перегляд на основі запитуваних дій, які він виконує на Моделі, але Перегляд не відомий моделі.

Для отримання більш докладної посилання


Однак MVP, коли програма завантажується вперше, хіба ведучий не несе відповідальність за завантаження першого перегляду? Як, наприклад, коли ми завантажуємо програму facebook, чи не ведучий відповідає за завантаження сторінки входу?
гадюка

2
Посилання від Model to View у MVC? Ви можете відредагувати свою відповідь, щоб пояснити, як це робить її системою "роз'єднаної", враховуючи це посилання. Підказка: Вам може бути важко. Крім того, якщо ви не думаєте, що читач із задоволенням прийме, що все життя вони невірно обчислювали, ви, можливо, захочете детальніше пояснити, чому дії проходять через контролер спочатку в MVC, незважаючи на те, що користувач взаємодіє з "візуальними" елементами на екрані (тобто Перегляд), а не якийсь абстрактний шар, який сидить за обробкою.
Зола

2
Це явно неправильно ... в MVC модель ніколи не спілкується безпосередньо з видом і навпаки. Вони навіть не знають, що існує інший. Контролер - це клей, який тримає їх разом
MegaManX

1
Я погоджуюся з Ash та MegaManX. На діаграмі MVC стрілка повинна бути від представлення, що вказує на модель (або ViewModel, або DTO), а не від моделі до перегляду; тому що Модель не знає про Вид, але погляд може знати про Модель.
Jboy Flaga

57

Відповідей на це питання багато, але я відчув, що потрібна справді проста відповідь, чітко порівнюючи обидві. Ось дискусія, яку я підготував, коли користувач шукає ім’я фільму в додатках MVP та MVC:

Користувач: натисніть кнопку ...

Вид : Хто це? [ МВП | MVC ]

Користувач: Я просто натиснув кнопку пошуку ...

Перегляд : Гаразд, зачекай на секунду…. [ МВП | MVC ]

( Переглянути виклик презентатора | Контролер ...) [ MVP |MVC ]

Вид : Ей, ведучий | Контролер , Користувач щойно натиснув на кнопку пошуку, що робити? [ МВП |MVC ]

Ведучий | Контролер : Гей Подивитися , чи є термін пошуку на цій сторінці? [ МВП | MVC ]

Вид : Так,… ось воно… “фортепіано” [ MVP | MVC ]

Ведучий : Дякую Перегляд ,… тим часом я шукаю пошуковий термін на Моделі , покажіть його, будь ласка, панель прогресу [ MVP | MVC ]

( Ведучий | Контролер викликає модель …) [ MVP | MVC ]

Ведучий | Контролер : Ей, модель , чи є у вас відповідність для цього пошукового терміна ?: "фортепіано" [ MVP | MVC ]

Модель : Hey Presenter | Контролер , дозвольте мені перевірити… [ MVP |MVC ]

( Модель робить запит до бази даних фільмів…) [ MVP | MVC ]

( Невдовзі ... )

-------------- Тут MVP і MVC починають розходитися ---------------

Модель : Я знайшов список для вас, ведучий , ось він у JSON "[{" ім'я ":" Вчитель фортепіано "," рік ": ​​2001}, {" ім'я ":" Піаніно "," рік ": ​​1993} ] ”[ MVP ]

Модель : Є деякий результат, контролер . Я створив змінну поля у своєму екземплярі і заповнив її результатом. Його назва - "searchResultsList" [ MVC ]

( Ведучий | Контролер дякує Моделі та повертається до Перегляду ) [ MVP | MVC ]

Ведучий : Дякую за очікування Перегляду , я знайшов список відповідних результатів для вас і організував їх у презентабельному форматі: ["Вчитель фортепіано 2001", "Фортепіано 1993"]. Покажіть його користувачеві у вертикальному списку. Також, будь ласка, прихойте панель прогресу зараз [ MVP ]

Контролер : Дякуємо, що чекали Перегляд , я поцікавився в моделі щодо вашого пошукового запиту. У ньому йдеться про те, що він знайшов список відповідних результатів і зберігав їх у змінній під назвою "searchResultsList" всередині свого примірника. Ви можете отримати його звідти. Також, будь ласка, прихойте панель прогресу зараз [ MVC ]

Перегляд : Дуже дякую презентатору [ MVP ]

Перегляд : Дякую "Контролер" [ MVC ] (Тепер Погляд ставить перед собою питання: Як я повинен представити користувачеві результати, отримані від Моделі ? Чи повинен рік виробництва фільму прийти першим чи останнім ...? Чи повинен він бути у вертикальному чи горизонтальному списку? ...)

Якщо вам цікаво, я написав низку статей, що стосуються архітектурних моделей додатків (MVC, MVP, MVVP, чиста архітектура, ...), які супроводжують тут репортаж Github . Незважаючи на те, що зразок написаний для андроїда, основні принципи можуть бути застосовані до будь-якого середовища.


В основному те, що ви намагаєтесь сказати, це те, що контролер мікромініфікує логіку перегляду? Отже, це робить подання дурніше, представляючи, що відбувається і як на видах?
Раду

@Radu, Ні, це не мікрокоманда, саме це робить ведучий, роблячи погляд пасивним або німим
Ali Nem

4
У правильному MVC представлення викликає функціональність на контролері та слухає зміни даних у моделі. Перегляд не отримує дані від контролера, і контролер НЕ повинен вказувати погляду для відображення, наприклад, індикатора завантаження. Належний MVC дозволяє замінити частину перегляду на ту, яка принципово відрізняється. Частина перегляду містить логіку перегляду, яка включає індикатор завантаження. Перегляд викликає інструкції (в контролері), контролер змінює дані в моделі, а модель сповіщає своїх слухачів про зміни своїх даних, одним таким слухачем є представлення.
Томмі Андерсен

35
  • MVP = Model-View-Presenter
  • MVC = Модель-перегляд-контролер

    1. Обидві моделі презентації. Вони розділяють залежності між Моделлю (об'єктами доменних об'єктів), екраном / веб-сторінкою (Перегляд) та тим, як повинен поводитися ваш інтерфейс користувача (Presenter / Controller)
    2. Вони досить схожі за концепцією, люди ініціалізують Presenter / Controller по-різному, залежно від смаку.
    3. Чудова стаття про відмінності тут . Найбільш помітним є те, що MVC-модель має модель оновлення подання.

2
Модель оновлення VIew. І це все ще є нерозділеною системою?
Еш

34

Модель-перегляд-контролер

MVC - це шаблон для архітектури програмного забезпечення. Він розділяє логіку програми на три окремі частини, сприяючи модульності та простоті співпраці та повторного використання. Це також робить програми більш гнучкими та привітаннями до ітерацій. Він розділяє додаток на наступні компоненти:

  • Моделі обробки даних та бізнес-логіки
  • Контролери для управління користувальницьким інтерфейсом та додатком
  • Перегляди для обробки об’єктів графічного інтерфейсу користувача та презентації

Щоб зробити це трохи більш зрозумілим, давайте уявимо простий додаток із списку покупок. Все, що ми хочемо - це перелік назви, кількості та ціни кожного товару, який нам потрібно придбати на цьому тижні. Нижче ми розповімо, як ми могли реалізувати частину цієї функції за допомогою MVC.

введіть тут опис зображення

Model-View-Presenter

  • модель являє собою дані , які будуть відображатися у вікні перегляду (призначеного для користувача інтерфейсу).
  • вид являє собою інтерфейс , який відображає дані (модель) і команди маршрутів користувачів (події) до виступаючого діяти в відповідності з цими даними. Перегляд зазвичай має посилання на його ведучого.
  • Presenter є «середнім людиною» ( в виконанні контролера в MVC) і мають посилання на обидва, вид і модель. Зверніть увагу, що слово "модель" вводить в оману. Це скоріше повинна бути ділова логіка, яка витягує або маніпулює Моделлю . Наприклад: Якщо у вас є база даних, що зберігає користувача в таблиці бази даних, і ваш перегляд хоче відобразити список користувачів, то презентатор матиме посилання на бізнес-логіку вашої бази даних (наприклад, DAO), звідки ведучий запитає список Користувачів.

Якщо ви хочете побачити зразок з простою реалізацією, будь ласка, перегляньте цю публікацію GitHub

Конкретний робочий процес запиту та відображення списку користувачів із бази даних може працювати так: введіть тут опис зображення

Яка різниця між MVC та моделями MVP ?

MVC Шаблон

  • Контролер базується на поведінці та може бути поділений у різних поглядах

  • Може нести відповідальність за визначення того, який вид відображати (шаблон переднього контролера)

MVP Pattern

  • Вид більш вільно поєднується з моделлю. Ведучий відповідає за прив'язку моделі до перегляду.

  • Легше перевірити блок, оскільки взаємодія з представленням здійснюється через інтерфейс

  • Зазвичай перегляд карти ведучого один на один. Складні перегляди можуть мати кілька презентантів.


2
Немає прямого зв’язку між видом і моделлю в mvc. ваша діаграма неправильна
Özgür

33

Також варто пам’ятати, що існують також різні типи MVP. Фоулер розбив схему на два - пасивний контролер і контролер.

Під час використання пасивного перегляду, ваш перегляд зазвичай реалізує тонкозернистий інтерфейс із властивостями, які відображаються більш-менш безпосередньо до віджету інтерфейсу користувача, що лежить нижче. Наприклад, у вас може бути ICustomerView із властивостями, такими як Ім'я та Адреса.

Ваша реалізація може виглядати приблизно так:

public class CustomerView : ICustomerView
{
    public string Name
    { 
        get { return txtName.Text; }
        set { txtName.Text = value; }
    }
}

Ваш клас Presenter поговорить з моделлю та "відобразить" її на вигляд. Такий підхід називається "Пасивний погляд". Перевага полягає в тому, що перегляд легко перевірити, а також легше переходити між платформами інтерфейсу користувача (Web, Windows / XAML тощо). Недоліком є ​​те, що ви не можете використовувати такі речі, як прив'язка даних (що є дуже потужним у таких структурах, як WPF та Silverlight ).

Другий аромат MVP - це контрольний контролер. У такому випадку у Вашого представлення може з’явитися властивість під назвою Клієнт, яка знову-таки пов'язана з віджетами інтерфейсу користувача. Вам не потрібно думати про синхронізацію та мікроуправління поданням, і контрольований контролер може заходити та допомагати, коли це потрібно, наприклад, із доповненою логікою взаємодії.

Третій "аромат" MVP (або хтось, можливо, назве це окремим малюнком) - це презентаційна модель (або іноді її називають Model-View-ViewModel). Порівняно з MVP ви "зливаєте" M і P в один клас. У вас є клієнтський об'єкт, до якого пов’язані дані віджетів вашого інтерфейсу, але ви також маєте додаткові поля, призначені для користувальницького інтерфейсу, наприклад "IsButtonEnabled" або "IsReadOnly" тощо.

Я вважаю, що найкращий ресурс, який я знайшов для архітектури інтерфейсу, - це серія публікацій блогу, яку зробив Джеремі Міллер в розділі Зміст власної CAB серії змісту . Він покрив усі аромати MVP та показав код C # для їх реалізації.

Я також блогував про шаблон Model-View-ViewModel в контексті Silverlight на YouCard Re-Visit: Реалізація схеми ViewModel .


25

Кожен з них вирішує різні проблеми і навіть може бути об'єднаний разом, щоб мати щось подібне нижче

Комбінований візерунок

Тут також є повне порівняння MVC, MVP та MVVM


1
Замість того, щоб надмірно ускладнювати речі, ви могли б відповісти на питання. Тому більшість із нас тут. Шукали для порівняння між mvp та mvc і перенаправляли тут, і ви говорите про гармонію тих архітектур, які не пов'язані з OP.
Фарид

18

Обидві ці рамки мають на меті вирішити проблеми - наприклад, взаємодія з джерелом даних (моделлю), логікою програми (або перетворенням цих даних у корисну інформацію) (контролер / презентатор) та кодом відображення (Перегляд). В деяких випадках модель також може бути використана для перетворення джерела даних на абстракцію більш високого рівня. Хорошим прикладом цього є проект MVC Storefront .

Існує дискусія тут про відмінності між MVC проти MVP.

Відмінність полягає в тому, що в додатку MVC традиційно представлення зображень і контролер взаємодіють з моделлю, але не один з одним.

Конструкції MVP надають презентатору доступ до моделі та взаємодіють із виглядом.

Сказавши це, ASP.NET MVC є за цими визначеннями рамкою MVP, оскільки Контролер отримує доступ до Моделі для заповнення Перегляду, який, мабуть, не має логіки (просто відображає змінні, надані Контролером).

Щоб отримати уявлення про відмінність ASP.NET MVC від MVP, ознайомтеся з цією презентацією MIX Скоттом Ханзельманом.


7
MVC і MVP - це структури, а не рамки. Якщо ви чесно думаєте, ця тема стосувалася .NET Framework, то це як почути "Інтернет" і подумати про IE.
tereško

Досить впевнений, що питання значно розвинулося з того часу, коли його вперше задали ще у 2008 році. Крім того, озирнувшись на мою відповідь (а це було 4 роки тому, тому у мене не набагато більше контексту, ніж у вас), я б сказав, що я починаю загалом і то використовуйте .NET MVC як конкретний приклад.
Метт Мітчелл

13

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

В архітектурному відношенні MVP - це підхід на базі контролера сторінок, де MVC - це підхід, заснований на передньому контролері. Це означає, що життєвий цикл сторінок веб-форми MVP просто покращується шляхом вилучення бізнес-логіки з коду позаду. Іншими словами, сторінка - це та, яка обслуговує http-запит. Іншими словами, MVP IMHO - це еволюційний тип розширення веб-форми. MVC з іншого боку повністю змінює гру, тому що запит перехоплюється класом контролера перед завантаженням сторінки, там виконується бізнес-логіка, а потім у кінцевому результаті обробка даних контролера щойно скидається на сторінку ("перегляд"). сенс, MVC виглядає (принаймні, на мене) на надзвичайний смак MVP, що підсилюється за допомогою двигуна маршрутизації

Обидва вони включають TDD і мають зворотні сторони.

Рішення щодо вибору одного з них IMHO має ґрунтуватися на тому, скільки часу інвестується у веб-форму веб-форми ASP NET. Якщо хтось вважатиме себе хорошим у веб-формах, я б запропонував MVP. Якби хтось почував себе не так комфортно в таких речах, як життєвий цикл сторінки тощо, MVC може бути способом перейти сюди.

Ось ще одне посилання на допис у блозі, що дає трохи більше деталей на цю тему

http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp-vs-model-view-controller-mvc.aspx


9

Я використовував як MVP, так і MVC, і хоча ми як розробники схиляємось до технічних відмінностей обох моделей, точка MVP в IMHO набагато більше стосується простоти прийняття, ніж будь-що інше.

Якщо я працюю в команді, яка вже є гарним досвідом стилю розробки веб-форм, запровадити MVP набагато простіше, ніж MVC. Я б сказав, що MVP у цьому сценарії - це швидка перемога.

Мій досвід говорить мені, що переміщення команди з веб-форм на MVP, а потім з MVP в MVC порівняно просто; перехід від веб-форм до MVC складніше.

Я залишаю тут посилання на серію статей, які мій друг опублікував про MVP та MVC.

http://www.qsoft.be/post/Building-the-MVP-StoreFront-Gutthrie-style.aspx


8

У MVP подання черпає дані від презентатора, який черпає та готує / нормалізує дані з моделі, тоді як у MVC контролер черпає дані з моделі та встановлює, натискаючи в огляд.

У MVP ви можете мати один перегляд, який працює з декількома видами презентаторів, і один ведучий, що працює з різними кількома переглядами.

MVP зазвичай використовує якусь рамку прив'язки, таку як рамка зв'язування Microsoft WPF або різні рамки прив'язки для HTML5 та Java.

У цих рамках UI / HTML5 / XAML знає, яке властивість презентатора відображає кожен елемент інтерфейсу, тому, коли ви прив'язуєте подання до презентатора, представлення шукає властивості та знає, як отримувати з них дані та як встановити їх, коли користувач змінює значення в інтерфейсі користувача.

Так, якщо, наприклад, модель - це автомобіль, то презентатор - це якась презентація автомобіля, виставляє на вигляд властивості автомобіля (рік, виробник, сидіння тощо). Подання знає, що в текстовому полі під назвою "виробник автомобілів" потрібно відображати властивість Maker презентаторів.

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

Цей прив'язуючий фреймворк, якщо його зняти, це насправді контролер :-)

Отже, ви можете дивитися на MVP як на еволюцію MVC.

MVC чудовий, але проблема полягає в тому, що зазвичай його контролер на огляд. Контролер A знає, як встановити поля View A. Якщо зараз ви хочете, щоб View A відображав дані моделі B, вам потрібен Controller A, щоб знати модель B, або вам потрібен Controller A для отримання об'єкта з інтерфейсом - як MVP тільки без прив’язок, або вам потрібно переписати код набору інтерфейсу в Controller B.

Висновок - MVP і MVC є обоє роз'єднаними шаблонами інтерфейсу, але MVP зазвичай використовує рамку прив'язки, яка знаходиться під MVC. THUS MVP знаходиться на більш високому архітектурному рівні, ніж MVC, і візерунок обгортки вище MVC.


6

Мій скромний короткий погляд: MVP - для великих масштабів, а MVC - для крихітних масштабів. З MVC я колись відчуваю, що V і C можуть бути помічені двома сторонами єдиного нероздільного компонента, безпосередньо пов'язаного з M, і одна неминуче падає на це при спуску на більш короткі масштаби, як елементи управління інтерфейсом та базові віджети. На цьому рівні деталізації MVP має мало сенсу. Коли хтось навпаки переходить до масштабних масштабів, правильний інтерфейс стає важливішим, те саме з однозначним розподілом обов'язків, і ось тут з'являється MVP.

З іншого боку, це правило великого масштабу може мати велику вагу, коли характеристики платформи сприяють певним відносинам між компонентами, як, наприклад, з Інтернетом, де MVC легше реалізувати, ніж MVP.


4

Я вважаю, що цей образ Ервіна Вандервалька (і супроводжуваної статті ) є найкращим поясненням MVC, MVP та MVVM, їх подібності та їх відмінностей. Стаття не відображається в результатах пошуку за запитами на «MVC, MVP і MVVM» , тому що назва статті не містить слова «MVC» і «MVP»; але я думаю, що це найкраще пояснення.

зображення, що пояснює MVC, MVP та MVVM - Ервін Вандервальк

( Стаття також відповідає тому, що сказав дядько Боб Мартін в одному зі своїх бесід: що MVC спочатку був розроблений для невеликих компонентів інтерфейсу, а не для архітектури системи)


3

Існує багато версій MVC, ця відповідь стосується оригіналу MVC у Smalltalk. Якщо коротко, це так зображення mvc проти mvp

Ця розмова droidcon NYC 2017 - чистий дизайн додатків з компонентами архітектури пояснює це

введіть тут опис зображення введіть тут опис зображення


6
У MVC Модель ніколи не викликається безпосередньо з виду
rodi

5
Це неточна відповідь. Не введіть в оману. як пише @rodi, немає взаємодії між Поглядом і Моделью.
Шон Механ

Зображення MVC є неточним або в кращому випадку оманливим, будь ласка, не звертайте уваги на цю відповідь.
Джей

2
@ Jay1b Який MVC ви вважаєте "правильним"? Ця відповідь стосується оригінального MVC. Є багато інших MVC (наприклад, в iOS), які були змінені, щоб адаптуватись до платформи, скажімо, якUIKit
onmyway133

Що означають стрілки?
problemofficer

3

Є це приємне відео від дядька Боба, де він коротко пояснює MVC & MVP наприкінці.

IMO, MVP - це вдосконалена версія MVC, де ви в основному відокремлюєте питання про те, що ви збираєтеся показати (дані), від того, як ви збираєтеся показати (вид). Презентатор включає в себе ділову логіку вашого інтерфейсу, неявно нав'язує, які дані мають бути представлені, і дає вам список моделей, що мають неприємний вигляд. А коли настає час показу даних, ви просто підключите свій перегляд (ймовірно, включає той самий ідентифікатор) у свій адаптер і встановіть відповідні поля перегляду за допомогою тих моделей перегляду, в яких вводиться мінімальна кількість коду (просто за допомогою сетерів). Основна його перевага полягає в тому, що ви можете перевірити свою логіку бізнесу на інтерфейсі на багато / різних видах, як-от показ елементів у горизонтальному або вертикальному списку.

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

Я сподіваюся, що це допомагає краще.


2
Важливий момент від дядька Боба: Коли його спочатку винайшов Тригв Реенскауг, MVC мав на увазі для кожного віджета не всю форму.
Василь Бурк

2

Ви забули про Action-Domain-Responder ( ADR) ).

Як пояснено в деяких графіках вище, в MVC існує пряме відношення / зв'язок між Модель та Вид . Дія виконується на Контролері , який виконує дію на Моделі . Ця дія в моделі , буде викликати реакцію в View . View , постійно оновлюється , коли модель змінюється стан «s.

Деякі люди забувають, що MVC був створений наприкінці 70-х " і що Інтернет був створений лише в кінці 80" / початку 90-х ". MVC спочатку не створювався для Інтернету, а для настільних додатків, де контролер , Модель та Перегляд співіснуватимуть разом.

Оскільки ми використовуємо веб-рамки ( наприклад: Laravel ), які все ще використовують ті ж самі умови іменування ( model-view-controller ), ми схильні думати, що це повинен бути MVC, але насправді це щось інше.

Натомість подивіться на Action-Domain-Responder . У ADR контролер отримує дію , яка виконує операцію в моделі / домені . Поки що те саме. Різниця полягає в тому, що він збирає відповідь / дані операції та передає їх Відповідачеві ( наприклад:.view() ) Для надання. Коли запитується нова дія на тому ж компоненті, контролер знову викликається, і цикл повторюється. В ADR немає зв'язку між Модель / Домен та Переглядом (відповідь Reponser ).

Примітка. У Вікіпедії зазначено, що " Однак кожна АРС-дія представлена ​​окремими класами або закриттями ". Це не так обов'язково правда. Кілька дій може бути в одному контролері, і схема залишається однаковою.


2

Найпростіша відповідь - те, як погляд взаємодіє з моделлю. У MVP подання оновлюється презентатором, який виступає посередником між поданням та моделлю. Презентатор приймає дані з подання, який отримує дані з моделі, а потім виконує будь-яку необхідну бізнес-логіку, а потім оновлює представлення даних. У MVC модель оновлює подання безпосередньо, а не повертається через контролер.


Я заперечував, тому що модель afaik нічого не знає про перегляд у MVC, і немає можливості оновити її безпосередньо під час написання.
problemofficer

1
Подивіться на MVC у Вікіпедії, саме так воно працює.
Клайв Джеффріс

1
Хоча читачам подобається це чи ні, безліч джерел, які можна знайти, гугл, заявляють, що в MVC представлення підписується на оновлення моделі. а в деяких випадках навіть може бути контролером, а отже, викликати такі оновлення. Якщо вам це не подобається, тоді поскаржиться на ті статті, або цитуй, яка «Біблія», на вашу думку, є єдиним законним джерелом, замість того, щоб зволікати відповіді, які просто передають іншу інформацію, наявну там!
підкреслюю_d

1
Формулювання, безумовно, можна було б покращити, але це правда, що погляд переглядає зміни моделі в MVC. Моделі не потрібно знати View в MVC.
пожирав

дякую .. Мені дуже допомогли
Двин Реш

1
  • У MVC, View має частину інтерфейсу, контролер є посередником між представленням та моделлю, а модель містить бізнес-логіку.
  • У MVP, View містить як інтерфейс, так і реалізацію презентатора, оскільки тут презентатор - це просто інтерфейс, а модель - однакова, тобто містить бізнес-логіку.

-1

MVP

MVP розшифровується як Model - View- Presenter. Це з'явилося на початку 2007 року, коли Microsoft представила програми Smart Client Windows.

Ведучий виконує роль наглядової ролі в MVP, яка пов'язує події та бізнес-логіку з моделями.

Прив'язка подій для перегляду буде реалізована в Presenter з інтерфейсу перегляду.

Перегляд є ініціатором для введення користувача, а потім делегує події Presenter, а ведучий обробляє прив'язки подій та отримує дані від моделей.

Плюси: представлення має лише інтерфейс користувача, а не логіку. Високий рівень перевірки

Мінуси: Бітова складна і більше роботи при здійсненні прив'язки подій

MVC

MVC розшифровується як Model-View-Controller. Контролер відповідає за створення моделей та надання представлень з прив'язними моделями.

Контролер є ініціатором і він вирішує, який вид подавати.

Плюси: наголос на принципі єдиної відповідальності Високий рівень перевірки

Мінуси: Іноді занадто велике навантаження для контролерів, якщо спробувати надати кілька переглядів в одному контролері.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.