Чем отличается шаблон проектирования MVC, MVP и MVVM с точки зрения кодирования c #

202

Если мы ищем в Google фразу «Чем отличается шаблон проектирования MVC, MVP и MVVM», мы можем получить несколько URL-адресов, которые теоретически обсуждают разницу между шаблоном проектирования MVC MVP и MVVM :

MVP

Используйте в ситуациях, когда связывание через текстовый код данных невозможно. Windows Forms является прекрасным примером этого. Чтобы отделить представление от модели, нужен докладчик. Поскольку представление не может напрямую привязываться к докладчику, информация должна передаваться в представление через интерфейс (IView).

MVVM

Используйте в ситуациях, когда возможно связывание через текстовый текст. Зачем? Различные интерфейсы IView для каждого представления удалены, что означает меньше кода для обслуживания. Некоторые примеры, где возможен MVVM, включают проекты WPF и javascript, использующие Knockout.

MVC

Используйте в ситуациях, когда связь между представлением и остальной частью программы не всегда доступна (и вы не можете эффективно использовать MVVM или MVP). Это ясно описывает ситуацию, когда веб-API отделяется от данных, отправляемых клиентским браузерам. Microsoft ASP.NET MVC является отличным инструментом для управления такими ситуациями и обеспечивает очень четкую структуру MVC


Но я не нашел ни одной статьи, которая теоретически обсуждала бы разницу, а также пример кода.

Было бы очень хорошо, если бы я получил статью, в которой обсуждается разница между этими 3 шаблонами проектирования (MVC, MVP и MVVM) вместе с кодом.

Я хотел бы получить исходный код 3 похожих приложений CRUD, который был реализован этими тремя шаблонами проектирования (MVC, MVP и MVVM). Так что я могу пройтись по коду и понять, как нужно писать код для этих трех шаблонов проектирования (MVC, MVP & MVVM).

Поэтому, если существует такая статья, в которой обсуждается, как код будет выглядеть по-разному для этих трех шаблонов проектирования (MVC, MVP и MVVM), пожалуйста, перенаправьте меня к этой статье.

Томас
источник
14
В TechEd 2011 была хорошая, но простая презентация об этих трех шаблонах. Докладчик сделал и показал примеры по той же бизнес-модели с использованием C # и Visual Studio. Вот видео на канале 9 MVC, MVP и MVVM: Сравнение архитектурных паттернов
Марко Медрано
2
Вот статья: realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android . Очень хорошо написано и понятно ИМО. Также есть репозиторий Github с веткой для каждого паттерна.
cuddlecheek
Это было интересно: cirw.in/blog/time-to-move-on
Эндрю

Ответы:

100

Некоторые основные отличия можно записать вкратце:

MVC:

Традиционный MVC - это место, где есть

  1. Модель: действует как модель для данных
  2. Представление: имеет дело с представлением пользователю, который может быть пользовательским интерфейсом
  3. Контроллер: контролирует взаимодействие между моделью и представлением, когда представление вызывает контроллер для обновления модели. В случае необходимости View может вызывать несколько контроллеров.

MVP:

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

MVVM

Разница здесь заключается в наличии View Model. Это своего рода реализация шаблона проектирования Observer, где изменения в модели также представлены в представлении виртуальной машиной. Например: если изменен ползунок, обновляется не только модель, но и данные, которые могут быть текстовыми, которые отображаются в представлении. Таким образом, существует двусторонняя привязка данных.

Притам Банерджи
источник
1
Маленькая деталь - вы можете выбрать, является ли это двухсторонняя привязка данных, или вы можете определить также одностороннюю привязку
Jviaches
10
«Вид обычно не вызывает ведущего»? Можете ли вы объяснить больше об этом предложении? Если UI View не позвонит ведущему, который собирается?
Амир Зиарати
3
@AmirZiarati Ведущий следит за событиями. В случае событий ведущий входит в игру и предпринимает необходимые действия.
Притам Банерджи
да, пока он имеет ссылку на просмотр. Я ошибся, я думал, что вы имели в виду, что представлению даже не нужно сначала вызывать докладчика, хотя это должно быть хотя бы один раз. спасибо;)
Амир Зиарати
1
@PritamBanerjee, Из объяснения, как MVP, так и MVVM почти имеют одинаковую функциональность. P или VM обновляют и M & V.
Манохар Редди Поредди
43

MVC, MVP, MVVM

MVC (старый)

MVP (более модульный из-за слабой связи. Presenter является посредником между View и Model)

MVVM (у вас уже есть двусторонняя привязка между виртуальной машиной и компонентом пользовательского интерфейса, поэтому она более автоматизирована, чем MVP) введите описание изображения здесь

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

Уддхав Гаутам
источник
24
Пожалуйста, не просто копируйте изображения, особенно если они не согласны между собой. См. MVC (старый, который вы не видите), браузер говорит для просмотра на верхнем рисунке, но обращается к контроллеру на нижнем рисунке.
peter.fr
1
@UddhavGautam Это немного сбивает с толку, потому что первое изображение показывает View как точку входа, а второе показывает Controller.
everlasto
1
На первой диаграмме, в чем разница между MVVM и MVP? На мой взгляд, это только связи между V и VM / P. Который в одном случае имеет двусторонние сообщения в виде двунаправленной ссылки, а в другом - две однонаправленные ссылки. Я не вижу никакой функциональной разницы между ними. Чего мне не хватает?
iCyberPaul
1
Браузер означает пользователя, откуда происходит взаимодействие между вами и приложением.
Уддхав Гаутам
4
Поворот сюжета: никто на самом деле не знает, что происходит. Они все на самом деле просто одно и то же. Ха - ха. Нет, но на самом деле, даже с этими «полезными» изображениями трудно понять, что происходит. Я думаю, что это часть проблемы / путаницы.
Андрей
34

Отличное объяснение по ссылке: http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

Давайте сначала посмотрим на MVC

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

Между контроллером и представлением существует отношение многие-к-одному. Это связано с тем, что один контроллер может выбирать различные представления для визуализации в зависимости от выполняемой операции.

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

Контроллер действительно передает Модель обратно, так что есть знания между Представлением и ожидаемой Моделью, передаваемой в него, но не Контроллер, подающий его.

MVP - ведущий модельного представления

Теперь давайте посмотрим на шаблон MVP. Это выглядит очень похоже на MVC, за исключением некоторых ключевых отличий:

Ввод начинается с просмотра, а не докладчика.

Существует взаимно-однозначное сопоставление между представлением и связанным докладчиком.

Представление содержит ссылку на докладчика. Ведущий также реагирует на события, запускаемые из представления, поэтому он знает о представлении, с которым он связан.

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

MVVM - Model View View Model

Итак, с шаблонами MVC и MVP перед нами, давайте посмотрим на шаблон MVVM и посмотрим, какие различия он содержит:

Ввод начинается с представления, а не с модели представления.

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

taha027
источник
7
«Это потому, что View не имеет никакого знания или ссылки на контроллер». Это неправда
Адам Вольски
@AmirZiarati ViewModel не является частью MVP, но шаблон MVVM.
Джо
Я был бы хорош, если бы вы приводили примеры, например, где мы могли бы использовать этот шаблон
JKA
3

Изображение ниже взято из статьи, написанной Эрвином ван дер Валком:

изображение, объясняющее MVC, MVP и MVVM - Эрвин Вандервалк

Статья объясняет различия и дает некоторые примеры кода в C #

Jboy Flaga
источник
Приведенные выше изображения не сбивают с толку, как в MVC, почему VIEW напрямую обращается к Model? то же самое для других?
smkrn110
На этих диаграммах не ясно, что означают стрелки. Стрелка означает доступ или манипулирование? На диаграмме MVC не ясно, почему нет стрелки, инициирующей модель
Понтиос