Was ist der Unterschied zwischen MVC-, MVP- und MVVM-Entwurfsmustern in Bezug auf die Codierung von c #?

202

Wenn wir Google mit dem Ausdruck "Was ist der Unterschied zwischen MVC-, MVP- und MVVM-Entwurfsmuster" durchsuchen, erhalten wir möglicherweise einige URLs, die den Unterschied zwischen MVC MVP- und MVVM-Entwurfsmuster theoretisch wie folgt diskutieren :

MVP

Verwendung in Situationen, in denen eine Bindung über einen Datenkontext nicht möglich ist. Windows Forms ist ein perfektes Beispiel dafür. Um die Ansicht vom Modell zu trennen, wird ein Präsentator benötigt. Da die Ansicht nicht direkt an den Präsentator gebunden werden kann, müssen Informationen über eine Schnittstelle (IView) an die Ansicht übergeben werden.

MVVM

Verwendung in Situationen, in denen eine Bindung über einen Datenkontext möglich ist. Warum? Die verschiedenen IView-Schnittstellen für jede Ansicht werden entfernt, was bedeutet, dass weniger Code gewartet werden muss. Einige Beispiele, bei denen MVVM möglich ist, umfassen WPF- und Javascript-Projekte mit Knockout.

MVC

Verwendung in Situationen, in denen die Verbindung zwischen der Ansicht und dem Rest des Programms nicht immer verfügbar ist (und Sie MVVM oder MVP nicht effektiv einsetzen können). Dies beschreibt klar die Situation, in der eine Web-API von den an die Client-Browser gesendeten Daten getrennt ist. Microsoft ASP.NET MVC ist ein großartiges Tool zum Verwalten solcher Situationen und bietet ein sehr klares MVC-Framework


Ich habe jedoch keinen einzigen Artikel gefunden, in dem der Unterschied theoretisch zusammen mit dem Beispielcode erörtert wird.

Es wäre wirklich schön, wenn ich einen Artikel bekommen würde, der den Unterschied zwischen diesen 3 Entwurfsmustern (MVC, MVP & MVVM) zusammen mit Code beschreibt.

Ich möchte den Quellcode von 3 ähnlichen CRUD- Apps in die Hände bekommen , die von diesen drei Entwurfsmustern (MVC, MVP & MVVM) implementiert wurden. Damit ich den Code durchgehen und verstehen kann, wie man Code für diese drei Entwurfsmuster (MVC, MVP & MVVM) schreiben soll.

Wenn es also einen solchen Artikel gibt, in dem erläutert wird, wie Code für diese drei Entwurfsmuster (MVC, MVP und MVVM) anders aussehen würde, leiten Sie mich bitte zu diesem Artikel weiter.

Thomas
quelle
14
In der TechEd 2011 gab es eine gute, aber einfache Präsentation über diese 3 Muster. Der Redner erstellte und zeigte Beispiele über dasselbe Geschäftsmodell mit C # und Visual Studio. Hier ist das Video in Kanal 9 MVC, MVP und MVVM: Ein Vergleich der Architekturmuster
Marco Medrano
2
Hier ist der Artikel: real.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android . Sehr gut geschriebene und klare IMO. Es hat auch ein Github-Repo mit einem Zweig für jedes Muster.
Cuddlecheek
Das war interessant: cirw.in/blog/time-to-move-on
Andrew

Antworten:

100

Einige grundlegende Unterschiede können kurz geschrieben werden:

MVC:

Traditionelle MVC ist, wo es eine gibt

  1. Modell: Dient als Modell für Daten
  2. Ansicht: Behandelt die Ansicht für den Benutzer, die die Benutzeroberfläche sein kann
  3. Controller: Steuert die Interaktion zwischen Modell und Ansicht, wobei die Ansicht den Controller aufruft, um das Modell zu aktualisieren. View kann bei Bedarf mehrere Controller aufrufen.

MVP:

Ähnlich wie bei herkömmlicher MVC, jedoch wird Controller durch Presenter ersetzt. Im Gegensatz zum Controller ist der Präsentator jedoch auch für die Änderung der Ansicht verantwortlich. Die Ansicht ruft normalerweise nicht den Präsentator an.

MVVM

Der Unterschied besteht darin, dass das Ansichtsmodell vorhanden ist. Es ist eine Art Implementierung des Observer Design Pattern, bei der Änderungen im Modell auch in der Ansicht von der VM dargestellt werden. Beispiel: Wenn ein Schieberegler geändert wird, wird nicht nur das Modell aktualisiert, sondern auch die Daten, bei denen es sich möglicherweise um einen Text handelt, der in der Ansicht angezeigt wird, werden aktualisiert. Es gibt also eine bidirektionale Datenbindung.

Pritam Banerjee
quelle
1
Kleines Detail - Sie können wählen, ob es sich um eine bidirektionale Datenbindung handelt, oder Sie können auch eine bidirektionale Bindung definieren.
Jviaches
10
"Die Ansicht ruft normalerweise nicht den Moderator an"? Kannst du mehr über diesen Satz erklären? Wenn UI View den Moderator nicht anruft, wer wird es dann tun?
Amir Ziarati
3
@AmirZiarati Der Moderator behält die Ereignisse im Auge. Bei Ereignissen kommt der Moderator ins Spiel und ergreift die notwendigen Maßnahmen.
Pritam Banerjee
Ja, solange es einen Verweis auf die Ansicht gibt. Ich habe es falsch verstanden. Ich dachte, Sie meinten, View muss anfangs nicht einmal einen Moderator anrufen, solange dies mindestens einmal der Fall sein sollte. danke;)
Amir Ziarati
1
@PritamBanerjee, Aus der Erklärung geht hervor, dass sowohl MVP als auch MVVM nahezu dieselbe Funktionalität haben. P oder VM aktualisieren beide M & V.
Manohar Reddy Poreddy
42

MVC, MVP, MVVM

MVC (alte)

MVP (aufgrund seiner geringen Kopplung modularer. Presenter ist ein Vermittler zwischen Ansicht und Modell)

MVVM (Sie haben bereits eine bidirektionale Bindung zwischen VM und UI-Komponente, daher ist diese automatisierter als MVP.) Geben Sie hier die Bildbeschreibung ein

Ein anderes Bild: Geben Sie hier die Bildbeschreibung ein

Uddhav Gautam
quelle
23
Bitte kopieren Sie nicht nur Bilder - besonders wenn sie sich nicht einig sind. Siehe MVC-Browser (der alte, den Sie nicht sehen), der im oberen Bild angezeigt wird, im unteren Bild jedoch mit dem Controller.
Peter.fr
1
@UddhavGautam Es ist etwas verwirrend, weil das erste Bild Ansicht als Einstiegspunkt und das zweite Controller zeigt.
everlasto
1
Was ist im ersten Diagramm der Unterschied zwischen MVVM und MVP? Aus meiner Sicht sind es nur die Verbindungen zwischen dem V und dem VM / P. In einem Fall werden die Hin- und Her-Nachrichten als bidirektionale Verknüpfung und in dem anderen Fall als zwei unidirektionale Verknüpfungen dargestellt. Ich sehe keinen funktionalen Unterschied zwischen ihnen. Was vermisse ich?
iCyberPaul
1
Browser bezeichnet den Benutzer, von dem aus die Interaktion zwischen Ihnen und der Anwendung stattfindet.
Uddhav Gautam
4
Handlungswechsel: Niemand weiß wirklich, was los ist. Sie sind eigentlich alle gleich. Haha. Nein, aber wirklich, selbst mit diesen "hilfreichen" Bildern ist es schwierig zu verarbeiten, was zum Teufel los ist. Ich denke, das ist Teil des Problems / der Verwirrung.
Andrew
34

Tolle Erklärung vom Link: http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

Schauen wir uns zuerst MVC an

Die Eingabe richtet sich zuerst an den Controller, nicht an die Ansicht. Diese Eingabe kann von einem Benutzer stammen, der mit einer Seite interagiert, aber auch von der einfachen Eingabe einer bestimmten URL in einen Browser. In beiden Fällen handelt es sich um einen Controller, mit dem eine Schnittstelle verbunden ist, um einige Funktionen zu starten.

Zwischen dem Controller und der Ansicht besteht eine Eins-zu-Eins-Beziehung. Dies liegt daran, dass ein einzelner Controller je nach ausgeführter Operation unterschiedliche Ansichten zum Rendern auswählen kann.

Es gibt einen Einwegpfeil vom Controller zur Ansicht. Dies liegt daran, dass die Ansicht keine Kenntnis von oder keinen Verweis auf den Controller hat.

Der Controller gibt das Modell zurück, sodass zwischen der Ansicht und dem erwarteten Modell, das an das Modell übergeben wird, Kenntnisse bestehen, nicht jedoch zwischen dem Controller, der es bereitstellt.

MVP - Model View Presenter

Schauen wir uns nun das MVP-Muster an. Es sieht MVC sehr ähnlich, mit Ausnahme einiger wichtiger Unterschiede:

Die Eingabe beginnt mit der Ansicht, nicht mit dem Präsentator.

Zwischen der Ansicht und dem zugehörigen Präsentator besteht eine Eins-zu-Eins-Zuordnung.

Die Ansicht enthält einen Verweis auf den Präsentator. Der Präsentator reagiert auch auf Ereignisse, die von der Ansicht ausgelöst werden, sodass er die Ansicht kennt, mit der er verknüpft ist.

Der Präsentator aktualisiert die Ansicht basierend auf den angeforderten Aktionen, die er für das Modell ausführt, aber die Ansicht ist nicht modellbewusst.

MVVM - Modellansicht Ansichtsmodell

Schauen wir uns also mit den MVC- und MVP-Mustern vor uns das MVVM-Muster an und sehen Sie, welche Unterschiede es enthält:

Die Eingabe beginnt mit der Ansicht, nicht mit dem Ansichtsmodell.

Während die Ansicht einen Verweis auf das Ansichtsmodell enthält, enthält das Ansichtsmodell keine Informationen zur Ansicht. Aus diesem Grund ist es möglich, eine Eins-zu-Viele-Zuordnung zwischen verschiedenen Ansichten und einem Ansichtsmodell vorzunehmen - auch über Technologien hinweg. Beispielsweise können eine WPF-Ansicht und eine Silverlight-Ansicht dasselbe Ansichtsmodell verwenden.

taha027
quelle
7
"Dies liegt daran, dass die Ansicht keine Kenntnis oder keinen Bezug zum Controller hat." Dies ist nicht wahr
Adam Wolski
@AmirZiarati ViewModel ist nicht Teil des MVP, sondern des MVVM-Musters.
Joe
Ich wäre gut, wenn Sie Beispiele nennen, wie wo wir dieses Muster verwenden könnten
JKA
3

Das Bild unten stammt aus dem Artikel von Erwin van der Valk:

Bild zur Erklärung von MVC, MVP und MVVM - von Erwin Vandervalk

Der Artikel erklärt die Unterschiede und enthält einige Codebeispiele in C #

Jboy Flaga
quelle
Die obigen Bilder sind nicht verwirrend, wie in MVC, warum VIEW direkt auf Model zugreift? das gleiche für andere?
smkrn110
In diesen Diagrammen ist nicht klar, was die Pfeile bedeuten. Bedeutet der Pfeil Zugriff oder Manipulation? Im MVC-Diagramm ist nicht klar, warum kein Pfeil vom Modell
Pontios