Wenn Sie über die RAD -Methode (Drag-Drop und Konfiguration) zum Erstellen von Benutzeroberflächen hinausblicken, die von vielen Tools empfohlen wird, stoßen Sie wahrscheinlich auf drei Entwurfsmuster: Model-View-Controller , Model-View-Presenter und Model-View-ViewModel . Meine Frage besteht aus drei Teilen:
- Welche Probleme lösen diese Muster?
- Wie sind sie ähnlich?
- Wie unterscheiden sie sich?
design-patterns
model-view-controller
user-interface
mvp
glossary
Mike Minutillo
quelle
quelle
Antworten:
Model-View-Presenter
In MVP enthält der Presenter die UI-Geschäftslogik für die Ansicht. Alle Aufrufe aus der Ansicht werden direkt an Presenter delegiert. Der Präsentator ist auch direkt von der Ansicht entkoppelt und kommuniziert mit ihm über eine Schnittstelle. Dies soll das Verspotten der Ansicht in einem Komponententest ermöglichen. Ein gemeinsames Merkmal von MVP ist, dass es viel Zwei-Wege-Versand geben muss. Wenn beispielsweise jemand auf die Schaltfläche "Speichern" klickt, delegiert der Ereignishandler an die "OnSave" -Methode des Präsentators. Sobald der Speichervorgang abgeschlossen ist, ruft der Präsentator die Ansicht über seine Benutzeroberfläche zurück, sodass in der Ansicht angezeigt werden kann, dass der Speichervorgang abgeschlossen wurde.
MVP ist in der Regel ein sehr natürliches Muster für die getrennte Darstellung in Web Forms. Der Grund dafür ist, dass die Ansicht immer zuerst von der ASP.NET-Laufzeit erstellt wird. Mehr über beide Varianten erfahren Sie .
Zwei Hauptvarianten
Passive Ansicht: Die Ansicht ist so dumm wie möglich und enthält eine Logik von nahezu Null. Der Moderator ist ein Mittelsmann, der mit der Ansicht und dem Modell spricht. Die Ansicht und das Modell sind vollständig voneinander abgeschirmt. Das Modell kann Ereignisse auslösen, aber der Präsentator abonniert sie, um die Ansicht zu aktualisieren. In der passiven Ansicht gibt es keine direkte Datenbindung. Stattdessen zeigt die Ansicht Setter-Eigenschaften an, mit denen der Presenter die Daten festlegt. Der gesamte Status wird im Presenter und nicht in der Ansicht verwaltet.
Supervising Controller: Der Presenter verarbeitet Benutzergesten. Die Ansicht wird direkt über die Datenbindung an das Modell gebunden. In diesem Fall ist es Aufgabe des Präsentators, das Modell an die Ansicht weiterzugeben, damit es daran gebunden werden kann. Der Präsentator enthält auch Logik für Gesten wie Drücken einer Taste, Navigation usw.
Model View Controller
In der MVC ist der Controller dafür verantwortlich, zu bestimmen, welche Ansicht als Reaktion auf eine Aktion angezeigt werden soll, auch wenn die Anwendung geladen wird. Dies unterscheidet sich von MVP, bei dem Aktionen über die Ansicht an den Präsentator weitergeleitet werden. In MVC korreliert jede Aktion in der Ansicht mit einem Aufruf eines Controllers zusammen mit einer Aktion. Im Web beinhaltet jede Aktion einen Aufruf einer URL, auf deren anderer Seite sich ein Controller befindet, der antwortet. Sobald dieser Controller seine Verarbeitung abgeschlossen hat, gibt er die richtige Ansicht zurück. Die Sequenz wird auf diese Weise während der gesamten Lebensdauer der Anwendung fortgesetzt:
Ein weiterer großer Unterschied zu MVC besteht darin, dass die Ansicht nicht direkt an das Modell gebunden ist. Die Ansicht wird einfach gerendert und ist völlig zustandslos. In Implementierungen von MVC hat die Ansicht normalerweise keine Logik im Code dahinter. Dies steht im Gegensatz zu MVP, wo dies unbedingt erforderlich ist, da die Ansicht niemals aufgerufen wird, wenn sie nicht an den Präsentator delegiert wird.
Präsentationsmodell
Ein weiteres zu betrachtendes Muster ist das PräsentationsmodellMuster. In diesem Muster gibt es keinen Präsentator. Stattdessen wird die Ansicht direkt an ein Präsentationsmodell gebunden. Das Präsentationsmodell ist ein Modell, das speziell für die Ansicht erstellt wurde. Dies bedeutet, dass dieses Modell Eigenschaften offenlegen kann, die man niemals einem Domänenmodell zuweisen würde, da dies eine Verletzung der Trennung von Bedenken darstellen würde. In diesem Fall bindet das Präsentationsmodell an das Domänenmodell und kann Ereignisse abonnieren, die von diesem Modell stammen. Die Ansicht abonniert dann Ereignisse aus dem Präsentationsmodell und aktualisiert sich entsprechend. Das Präsentationsmodell kann Befehle verfügbar machen, die die Ansicht zum Aufrufen von Aktionen verwendet. Der Vorteil dieses Ansatzes besteht darin, dass Sie den Code-Behind im Wesentlichen vollständig entfernen können, da der PM das gesamte Verhalten für die Ansicht vollständig kapselt.Model-View-ViewModel .
Es gibt einen MSDN-Artikel über das Präsentationsmodell und einen Abschnitt in der Composite Application Guidance für WPF (ehemals Prism) über getrennte Präsentationsmuster
quelle
MVC
häufig von Web-Frameworks verwendet wirdLaravel
, bei denen die empfangenen URL-Anforderungen (möglicherweise von Benutzern gestellt) von der verarbeitet werdenController
und der von der generierte HTML-CodeView
an den Client gesendet wird. DiesView
ist also ein Teil des Backends und der Benutzer können niemals direkt darauf zugreifen, und wenn Sie irgendwo das Gegenteil feststellen, betrachten Sie dies als MVC-Erweiterung (oder sogar als Verstoß). @Panzercrisis, Dies unterscheidet sich vonMVP
(wie imAndroid
Betriebssystem verwendet), woactions route through the View to the Presenter
und Benutzer direkten Zugriff auf die habenView
.Dies ist eine übermäßige Vereinfachung der vielen Varianten dieser Entwurfsmuster, aber so denke ich gerne über die Unterschiede zwischen den beiden nach.
MVC
MVP
quelle
Ich habe vor einiger Zeit darüber gebloggt und Todd Snyders hervorragenden Beitrag über den Unterschied zwischen den beiden zitiert :
Es ist die beste Erklärung im Internet, die ich finden konnte.
quelle
Hier sind Abbildungen, die den Kommunikationsfluss darstellen
quelle
MVP ist nicht unbedingt ein Szenario, in dem die Ansicht zuständig ist (siehe beispielsweise das MVP von Taligent).
Ich finde es bedauerlich, dass die Leute dies immer noch als Muster predigen (View in Charge), im Gegensatz zu einem Anti-Pattern, da es "Es ist nur eine Sichtweise" (Pragmatic Programmer) widerspricht. "Es ist nur eine Ansicht" besagt, dass die endgültige Ansicht, die dem Benutzer angezeigt wird, ein sekundäres Anliegen der Anwendung ist. Microsoft MVP - Muster macht die Wiederverwendung von Ansichten viel schwieriger und bequem Ausreden Microsofts Designer von schlechter Praxis zu fördern.
Um ganz ehrlich zu sein, denke ich, dass die zugrunde liegenden Bedenken von MVC für jede MVP-Implementierung gelten und die Unterschiede fast ausschließlich semantisch sind. Solange Sie die Trennung von Bedenken zwischen der Ansicht (die die Daten anzeigt), dem Controller (der die Benutzerinteraktion initialisiert und steuert) und dem Modell (den zugrunde liegenden Daten und / oder Diensten) verfolgen, erzielen Sie die Vorteile von MVC . Wenn Sie die Vorteile erzielen, wen interessiert es dann wirklich, ob Ihr Muster MVC, MVP oder Supervising Controller ist? Das einzige wirkliche Muster bleibt MVC, der Rest sind nur unterschiedliche Geschmacksrichtungen.
Betrachten Sie diesen äußerst spannenden Artikel, in dem einige dieser unterschiedlichen Implementierungen umfassend aufgelistet sind. Sie können feststellen, dass sie alle im Grunde das Gleiche tun, aber etwas anders.
Ich persönlich denke, MVP wurde erst kürzlich als einprägsamer Begriff wieder eingeführt, um entweder die Streitigkeiten zwischen semantischen Bigots zu reduzieren, die darüber streiten, ob etwas wirklich MVC ist oder nicht, oder um Microsoft Rapid Application Development Tools zu rechtfertigen. Keiner dieser Gründe in meinen Büchern rechtfertigt seine Existenz als separates Entwurfsmuster.
quelle
MVP: Die Ansicht ist verantwortlich.
Die Ansicht erstellt in den meisten Fällen ihren Präsentator. Der Präsentator interagiert mit dem Modell und bearbeitet die Ansicht über eine Schnittstelle. Die Ansicht interagiert manchmal mit dem Präsentator, normalerweise über eine Schnittstelle. Dies hängt von der Umsetzung ab. Möchten Sie, dass die Ansicht Methoden für den Präsentator aufruft, oder möchten Sie, dass die Ansicht Ereignisse enthält, die der Präsentator abhört? Es läuft darauf hinaus: Die Ansicht kennt den Moderator. Die Ansicht wird an den Präsentator delegiert.
MVC: Der Controller ist verantwortlich.
Der Controller wird basierend auf einem Ereignis / einer Anforderung erstellt oder darauf zugegriffen. Der Controller erstellt dann die entsprechende Ansicht und interagiert mit dem Modell, um die Ansicht weiter zu konfigurieren. Es läuft darauf hinaus: Der Controller erstellt und verwaltet die Ansicht; Die Ansicht ist Slave der Steuerung. Die Ansicht kennt den Controller nicht.
quelle
MVC (Model View Controller)
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, an den eine Schnittstelle angeschlossen 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. Beachten Sie den 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)
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.
Weitere Informationen
quelle
MVP
der Präsentator beim Laden der Anwendung zum ersten Mal nicht dafür verantwortlich, die erste Ansicht zu laden? Ist der Moderator nicht wie beim Laden der Facebook-Anwendung für das Laden der Anmeldeseite verantwortlich?Es gibt viele Antworten auf die Frage, aber ich hatte das Gefühl, dass eine wirklich einfache Antwort erforderlich ist, um die beiden klar zu vergleichen. Hier ist die Diskussion, die ich erfunden habe, als ein Benutzer in einer MVP- und MVC-App nach einem Filmnamen sucht:
Benutzer: Klicken Sie auf ...
Ansicht : Wer ist das? [ MVP | MVC ]
Benutzer: Ich habe gerade auf die Suchschaltfläche geklickt…
Ansicht : Ok, warte eine Sekunde…. [ MVP | MVC ]
( Ansicht, die den Presenter | Controller aufruft …) [ MVP | MVC ]
Ansicht : Hey Presenter | Controller , ein Benutzer hat gerade auf die Suchschaltfläche geklickt. Was soll ich tun? [ MVP | MVC ]
Moderator | Controller : Hey View , gibt es einen Suchbegriff auf dieser Seite? [ MVP | MVC ]
Ansicht : Ja,… hier ist es… „Klavier“ [ MVP | MVC ]
Moderator : Danke View ,… während ich den Suchbegriff für das Modell nachschlage, zeigen Sie ihm / ihr bitte einen Fortschrittsbalken [ MVP | MVC ]
( Presenter | Controller ruft das Modell auf …) [ MVP | MVC ]
Moderator | Controller : Hey Model , haben Sie eine Übereinstimmung mit diesem Suchbegriff?: "Klavier" [ MVP | MVC ]
Modell : Hey Moderator | Controller , lassen Sie mich überprüfen ... [ MVP | MVC ]
( Model stellt eine Abfrage an die Filmdatenbank…) [ MVP | MVC ]
( Nach einer Weile ... )
-------------- Hier beginnen MVP und MVC zu divergieren ---------------
Modell : Ich habe eine Liste für Sie gefunden, Moderator , hier in JSON "[{" Name ":" Klavierlehrer "," Jahr ": 2001}, {" Name ":" Klavier "," Jahr ": 1993} ] ”[ MVP ]
Modell : Es sind einige Ergebnisse verfügbar, Controller . Ich habe in meiner Instanz eine Feldvariable erstellt und mit dem Ergebnis gefüllt. Der Name lautet "searchResultsList" [ MVC ]
( Presenter | Controller bedankt sich bei Model und kehrt zur Ansicht zurück ) [ MVP | MVC ]
Moderator : Vielen Dank für das Warten View , ich habe eine Liste mit passenden Ergebnissen für Sie gefunden und sie in einem vorzeigbaren Format angeordnet: ["Piano Teacher 2001", "Piano 1993"]. Bitte zeigen Sie es dem Benutzer in einer vertikalen Liste. Bitte verstecken Sie jetzt auch den Fortschrittsbalken [ MVP ]
Controller : Vielen Dank, dass Sie auf View gewartet haben. Ich habe Model nach Ihrer Suchanfrage gefragt . Es heißt, es habe eine Liste übereinstimmender Ergebnisse gefunden und diese in einer Variablen namens "searchResultsList" in seiner Instanz gespeichert. Sie können es von dort bekommen. Bitte verstecken Sie jetzt auch den Fortschrittsbalken [ MVC ]
Ansicht : Vielen Dank Presenter [ MVP ]
Ansicht : Vielen Dank, "Controller" [ MVC ] (Jetzt stellt sich die Ansicht selbst die Frage: Wie soll ich dem Benutzer die Ergebnisse präsentieren, die ich vom Modell erhalte ? Sollte das Produktionsjahr des Films zuerst oder zuletzt kommen ...? Sollte es sein in einer vertikalen oder horizontalen Liste sein? ...)
Falls Sie interessiert sind, habe ich eine Reihe von Artikeln geschrieben, die sich mit Architekturmustern von Apps (MVC, MVP, MVVP, saubere Architektur, ...) befassen, begleitet von einem Github-Repo hier . Obwohl das Beispiel für Android geschrieben wurde, können die zugrunde liegenden Prinzipien auf jedes Medium angewendet werden.
quelle
MVC = Model-View-Controller
quelle
Model View Controller
MVC ist ein Muster für die Architektur einer Softwareanwendung. Es unterteilt die Anwendungslogik in drei separate Teile und fördert so die Modularität sowie die einfache Zusammenarbeit und Wiederverwendung. Es macht Anwendungen auch flexibler und begrüßt Iterationen. Es unterteilt eine Anwendung in die folgenden Komponenten:
Um dies etwas klarer zu machen, stellen wir uns eine einfache Einkaufslisten-App vor. Wir wollen nur eine Liste mit Namen, Menge und Preis jedes Artikels, den wir diese Woche kaufen müssen. Im Folgenden wird beschrieben, wie wir einige dieser Funktionen mit MVC implementieren können.
Model-View-Presenter
Ein konkreter Workflow zum Abfragen und Anzeigen einer Liste von Benutzern aus einer Datenbank könnte folgendermaßen funktionieren:
MVC-Muster
Controller basieren auf Verhaltensweisen und können für mehrere Ansichten freigegeben werden
Kann für die Bestimmung der anzuzeigenden Ansicht verantwortlich sein (Front Controller Pattern)
MVP-Muster
Die Ansicht ist lockerer an das Modell gekoppelt. Der Präsentator ist dafür verantwortlich, das Modell an die Ansicht zu binden.
Einfacher Unit-Test, da die Interaktion mit der Ansicht über eine Schnittstelle erfolgt
Normalerweise wird die Karte eins zu eins angezeigt. Komplexe Ansichten können mehrere Präsentatoren haben.
quelle
Denken Sie auch daran, dass es auch verschiedene Arten von MVPs gibt. Fowler hat das Muster in zwei Teile geteilt - Passive View und Supervising Controller.
Bei Verwendung der passiven Ansicht implementiert Ihre Ansicht normalerweise eine feinkörnige Oberfläche mit Eigenschaften, die mehr oder weniger direkt dem zugrunde liegenden UI-Widget zugeordnet sind. Beispielsweise haben Sie möglicherweise eine ICustomerView mit Eigenschaften wie Name und Adresse.
Ihre Implementierung könnte ungefähr so aussehen:
Ihre Presenter-Klasse spricht mit dem Modell und "ordnet" es der Ansicht zu. Dieser Ansatz wird als "Passive Ansicht" bezeichnet. Der Vorteil besteht darin, dass die Ansicht einfach zu testen ist und sich leichter zwischen UI-Plattformen (Web, Windows / XAML usw.) bewegen lässt. Der Nachteil ist, dass Sie Dinge wie die Datenbindung nicht nutzen können (was in Frameworks wie WPF und Silverlight sehr leistungsfähig ist ).
Die zweite Variante von MVP ist der Supervising Controller. In diesem Fall verfügt Ihre Ansicht möglicherweise über eine Eigenschaft namens "Kunde", die dann wiederum an die UI-Widgets gebunden ist. Sie müssen nicht über das Synchronisieren und Mikromanagement der Ansicht nachdenken, und der Supervising Controller kann bei Bedarf eingreifen und helfen, beispielsweise bei vollständiger Interaktionslogik.
Die dritte "Variante" von MVP (oder jemand würde es vielleicht ein separates Muster nennen) ist das Präsentationsmodell (oder manchmal auch als Model-View-ViewModel bezeichnet). Im Vergleich zum MVP "verschmelzen" Sie das M und das P zu einer Klasse. Sie haben Ihr Kundenobjekt, an das Ihre UI-Widgets datengebunden sind, aber Sie haben auch zusätzliche UI-spezifische Felder wie "IsButtonEnabled" oder "IsReadOnly" usw.
Ich denke, die beste Ressource, die ich für die UI-Architektur gefunden habe, ist die Reihe von Blog-Posts, die Jeremy Miller im Inhaltsverzeichnis der CAB-Serie "Build Your Own" verfasst hat . Er deckte alle Varianten von MVP ab und zeigte C # -Code, um sie zu implementieren.
Ich habe auch über das Model-View-ViewModel-Muster im Kontext von Silverlight bei YouCard erneut gebloggt: Implementierung des ViewModel-Musters .
quelle
Sie befassen sich jeweils mit unterschiedlichen Problemen und können sogar miteinander kombiniert werden, um so etwas wie das Folgende zu erhalten
Hier gibt es auch einen vollständigen Vergleich von MVC, MVP und MVVM
quelle
Beide Frameworks zielen darauf ab, Probleme zu trennen - beispielsweise die Interaktion mit einer Datenquelle (Modell), Anwendungslogik (oder die Umwandlung dieser Daten in nützliche Informationen) (Controller / Presenter) und Anzeigecode (Ansicht). In einigen Fällen kann das Modell auch verwendet werden, um eine Datenquelle in eine übergeordnete Abstraktion umzuwandeln. Ein gutes Beispiel hierfür ist das MVC Storefront-Projekt .
Es gibt eine Diskussion hier in Bezug auf die Unterschiede zwischen MVC vs MVP.
Der Unterschied besteht darin, dass in einer MVC-Anwendung traditionell die Ansicht und der Controller mit dem Modell interagieren, jedoch nicht miteinander.
Bei MVP-Designs kann der Präsentator auf das Modell zugreifen und mit der Ansicht interagieren.
Allerdings ist ASP.NET MVC nach diesen Definitionen ein MVP-Framework, da der Controller auf das Modell zugreift, um die Ansicht zu füllen, die keine Logik haben soll (zeigt nur die vom Controller bereitgestellten Variablen an).
In dieser MIX-Präsentation von Scott Hanselman können Sie sich vielleicht ein Bild von der Unterscheidung zwischen ASP.NET MVC und MVP machen .
quelle
Beides sind Muster, die versuchen, Präsentation und Geschäftslogik zu trennen und Geschäftslogik von UI-Aspekten zu entkoppeln
In der Architektur ist MVP ein auf Page Controller basierender Ansatz, während MVC auf Front Controller basiert. Dies bedeutet, dass der Lebenszyklus von Seiten im MVP-Standardwebformular nur durch Extrahieren der Geschäftslogik aus dem dahinter liegenden Code verbessert wird. Mit anderen Worten, die Seite ist diejenige, die die http-Anforderung bearbeitet. Mit anderen Worten, MVP IMHO ist eine evolutionäre Art der Webform-Verbesserung. MVC hingegen ändert das Spiel vollständig, da die Anforderung von der Controller-Klasse abgefangen wird, bevor die Seite geladen wird, die Geschäftslogik dort ausgeführt wird und dann am Ende der Controller-Verarbeitung die gerade auf die Seite gespeicherten Daten verarbeitet werden ("Ansicht") Sinn, MVC sieht (zumindest für mich) sehr nach Supervising Controller aus, das mit der Routing-Engine erweitert wurde
Beide ermöglichen TDD und haben Vor- und Nachteile.
Die Entscheidung, wie einer von ihnen ausgewählt werden soll, sollte meiner Meinung nach davon abhängen, wie viel Zeit man in die Webentwicklung vom Typ ASP NET Web Form investiert hat. Wenn man sich in Webformularen als gut betrachten würde, würde ich MVP vorschlagen. Wenn man sich in Dingen wie dem Seitenlebenszyklus usw. nicht so wohl fühlt, könnte MVC ein Weg sein, hierher zu kommen.
Hier ist noch ein Blog-Link, der ein bisschen mehr Details zu diesem Thema enthält
http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp-vs-model-view-controller-mvc.aspx
quelle
Ich habe sowohl MVP als auch MVC verwendet, und obwohl wir als Entwickler dazu neigen, uns auf die technischen Unterschiede beider Muster zu konzentrieren, hängt der Punkt für MVP in IMHO viel mehr mit der einfachen Übernahme zusammen als mit irgendetwas anderem.
Wenn ich in einem Team arbeite, das bereits einen guten Hintergrund für den Entwicklungsstil von Webformularen bietet, ist es viel einfacher, MVP einzuführen als MVC. Ich würde sagen, dass MVP in diesem Szenario ein schneller Gewinn ist.
Meine Erfahrung zeigt mir, dass es relativ einfach ist, ein Team von Webformularen zu MVP und dann von MVP zu MVC zu wechseln. Der Wechsel von Webformularen zu MVC ist schwieriger.
Ich hinterlasse hier einen Link zu einer Reihe von Artikeln, die ein Freund von mir über MVP und MVC veröffentlicht hat.
http://www.qsoft.be/post/Building-the-MVP-StoreFront-Gutthrie-style.aspx
quelle
In MVP zeichnet die Ansicht Daten vom Präsentator, der Daten aus dem Modell zeichnet und vorbereitet / normalisiert, während in MVC die Steuerung Daten aus dem Modell zeichnet und durch Drücken in die Ansicht festlegt.
In MVP können Sie eine einzelne Ansicht mit mehreren Arten von Präsentatoren und einen einzelnen Präsentator mit verschiedenen mehreren Ansichten verwenden.
MVP verwendet normalerweise eine Art Bindungsframework, z. B. das Microsoft WPF-Bindungsframework oder verschiedene Bindungsframeworks für HTML5 und Java.
In diesen Frameworks weiß die UI / HTML5 / XAML, welche Eigenschaft des Präsentators jedes UI-Element anzeigt. Wenn Sie also eine Ansicht an einen Präsentator binden, sucht die Ansicht nach den Eigenschaften und weiß, wie und wie Daten daraus gezogen werden um sie festzulegen, wenn der Benutzer einen Wert in der Benutzeroberfläche ändert.
Wenn das Modell beispielsweise ein Auto ist, ist der Präsentator eine Art Automoderator, der die Eigenschaften des Autos (Jahr, Hersteller, Sitze usw.) der Ansicht aussetzt. Die Ansicht weiß, dass das Textfeld "Autohersteller" die Eigenschaft "Moderator-Hersteller" anzeigen muss.
Sie können dann viele verschiedene Arten von Präsentatoren an die Ansicht binden. Alle müssen über die Maker-Eigenschaft verfügen. Es kann sich um ein Flugzeug, einen Zug oder was auch immer handeln, die Ansicht ist egal. Die Ansicht bezieht Daten vom Präsentator - egal welche -, solange sie eine vereinbarte Schnittstelle implementiert.
Wenn Sie dieses Bindungsframework entfernen, ist es tatsächlich der Controller :-)
Sie können MVP also als eine Weiterentwicklung von MVC betrachten.
MVC ist großartig, aber das Problem ist, dass normalerweise der Controller pro Ansicht angezeigt wird. Controller A weiß, wie Felder von Ansicht A festgelegt werden. Wenn Sie nun möchten, dass Ansicht A Daten von Modell B anzeigt, muss Controller A Modell B kennen oder Controller A muss ein Objekt mit einer Schnittstelle empfangen MVP nur ohne die Bindungen, oder Sie müssen den UI-Set-Code in Controller B neu schreiben.
Schlussfolgerung - MVP und MVC sind beide entkoppelt von UI-Mustern, aber MVP verwendet normalerweise ein Bindungsframework, das MVC darunter ist. DIESES MVP befindet sich auf einer höheren architektonischen Ebene als MVC und ein Wrapper-Muster über MVC.
quelle
Meine bescheidene kurze Sichtweise: MVP ist für große Maßstäbe und MVC für kleine Maßstäbe. Bei MVC habe ich manchmal das Gefühl, dass V und C zwei Seiten einer einzelnen unteilbaren Komponente sind, die eher direkt an M gebunden ist, und eine fällt unweigerlich darauf, wenn man auf kürzere Maßstäbe wie UI-Steuerelemente und Basis-Widgets zurückgreift. Bei dieser Granularität macht MVP wenig Sinn. Wenn man im Gegenteil zu größeren Maßstäben übergeht, wird die richtige Schnittstelle wichtiger, ebenso wie die eindeutige Zuweisung von Verantwortlichkeiten, und hier kommt MVP.
Auf der anderen Seite kann diese Skalierungsregel eines Daumens sehr wenig Gewicht haben, wenn die Plattformmerkmale eine Art von Beziehung zwischen den Komponenten begünstigen, wie zum Beispiel im Web, wo es einfacher zu sein scheint, MVC zu implementieren als MVP.
quelle
Ich denke, dieses Bild von Erwin Vandervalk (und dem dazugehörigen Artikel ) ist die beste Erklärung für MVC, MVP und MVVM, ihre Ähnlichkeiten und ihre Unterschiede. Der Artikel wird in Suchmaschinenergebnissen für Abfragen zu "MVC, MVP und MVVM" nicht angezeigt, da der Titel des Artikels nicht die Wörter "MVC" und "MVP" enthält. aber es ist die beste Erklärung, denke ich.
(Der Artikel entspricht auch dem, was Onkel Bob Martin in einem seiner Vorträge gesagt hat: MVC wurde ursprünglich für die kleinen UI-Komponenten entwickelt, nicht für die Architektur des Systems.)
quelle
Es gibt viele Versionen von MVC. Diese Antwort bezieht sich auf die ursprüngliche MVC in Smalltalk. Kurz gesagt, es ist
Dieser Vortrag droidcon NYC 2017 - Sauberes App-Design mit Architekturkomponenten verdeutlicht dies
quelle
UIKit
Es gibt dieses schöne Video von Onkel Bob, in dem er MVC & MVP am Ende kurz erklärt .
IMO, MVP ist eine verbesserte Version von MVC, bei der Sie die Bedenken hinsichtlich der Anzeige (der Daten) von der Darstellung der Ansicht (der Ansicht) grundsätzlich trennen. Der Präsentator enthält ein bisschen die Geschäftslogik Ihrer Benutzeroberfläche, legt implizit fest, welche Daten präsentiert werden sollen, und gibt Ihnen eine Liste von dummen Ansichtsmodellen. Und wenn die Zeit gekommen ist, um die Daten anzuzeigen, schließen Sie einfach Ihre Ansicht (wahrscheinlich mit denselben IDs) an Ihren Adapter an und legen die relevanten Ansichtsfelder mithilfe dieser Ansichtsmodelle fest, wobei eine minimale Menge an Code eingeführt wird (nur mithilfe von Setzern). Der Hauptvorteil besteht darin, dass Sie Ihre UI-Geschäftslogik anhand vieler / verschiedener Ansichten testen können, z. B. anhand von Elementen in einer horizontalen oder vertikalen Liste.
In MVC sprechen wir über Schnittstellen (Grenzen), um verschiedene Schichten zu verkleben. Ein Controller ist ein Plug-In für unsere Architektur, aber es gibt keine solche Einschränkung, um festzulegen, was angezeigt werden soll. In diesem Sinne ist MVP eine Art MVC mit dem Konzept, dass Ansichten über Adapter an den Controller angeschlossen werden können.
Ich hoffe das hilft besser.
quelle
Sie haben Action-Domain-Responder ( ADR ) vergessen .
Wie in einigen Grafiken oben erläutert, besteht eine direkte Beziehung / Verknüpfung zwischen dem Modell und der Ansicht in MVC. Auf dem Controller wird eine Aktion ausgeführt, die eine Aktion auf dem Modell ausführt . Diese Aktion im Modell , wird eine Reaktion auslösen in der Ansicht . Die Ansicht wird immer aktualisiert, wenn sich der Status des Modells ändert.
Einige Leute vergessen immer wieder, dass MVC Ende 70 " und das Web erst Ende 80" / Anfang 90 "erstellt wurde. MVC wurde ursprünglich nicht für das Web erstellt, sondern für Desktop-Anwendungen, bei denen der Controller verwendet wurde , Modell und Ansicht würden zusammen existieren.
Da wir Web-Frameworks ( z. B. Laravel ) verwenden, die immer noch dieselben Namenskonventionen verwenden ( Model-View-Controller ), denken wir, dass es MVC sein muss, aber es ist tatsächlich etwas anderes.
Schauen Sie sich stattdessen Action-Domain-Responder an . In ADR erhält der Controller eine Aktion , die eine Operation im Modell / in der Domäne ausführt . Soweit das gleiche. Der Unterschied besteht darin, dass dann die Antwort / Daten dieser Operation gesammelt und zum Rendern an einen Responder ( z. B.
view()
) übergeben werden. Wenn eine neue Aktion für dieselbe Komponente angefordert wird, wird der Controller erneut aufgerufen und der Zyklus wiederholt sich. In ADR besteht keine Verbindung zwischen dem Modell / der Domäne und der Ansicht ( Antwort des Reponsers ).Hinweis: Wikipedia gibt an, dass " jede ADR-Aktion jedoch durch separate Klassen oder Abschlüsse dargestellt wird ". Dies ist nicht unbedingt wahr. In einem Controller können sich mehrere Aktionen befinden, und das Muster ist immer noch dasselbe.
mvc adr Model View Controller Action-Domain-Responder
quelle
Die einfachste Antwort ist, wie die Ansicht mit dem Modell interagiert. In MVP wird die Ansicht vom Präsentator aktualisiert, der als Vermittler zwischen der Ansicht und dem Modell fungiert. Der Präsentator übernimmt die Eingabe aus der Ansicht, die die Daten aus dem Modell abruft, die erforderliche Geschäftslogik ausführt und anschließend die Ansicht aktualisiert. In MVC aktualisiert das Modell die Ansicht direkt, anstatt über den Controller zurückzukehren.
quelle
quelle
MVP
MVP steht für Model - View-Presenter. Dies ergab sich Anfang 2007, als Microsoft Smart Client-Windows-Anwendungen einführte.
Ein Präsentator fungiert als Aufsichtsfunktion in MVP, die View-Ereignisse und Geschäftslogik aus Modellen bindet.
Die Ansichtsereignisbindung wird im Presenter über eine Ansichtsoberfläche implementiert.
Die Ansicht ist der Initiator für Benutzereingaben und delegiert die Ereignisse an den Präsentator. Der Präsentator verarbeitet Ereignisbindungen und ruft Daten von Modellen ab.
Vorteile: Die Ansicht hat nur eine Benutzeroberfläche, keine Logik. Hohe Testbarkeit
Nachteile: Etwas komplexer und aufwändiger beim Implementieren von Ereignisbindungen
MVC
MVC steht für Model-View-Controller. Der Controller ist für das Erstellen von Modellen und das Rendern von Ansichten mit Bindungsmodellen verantwortlich.
Der Controller ist der Initiator und entscheidet, welche Ansicht gerendert werden soll.
Vorteile: Schwerpunkt auf dem Prinzip der Einzelverantwortung Hohe Testbarkeit
Nachteile: Manchmal zu viel Arbeit für Controller, wenn Sie versuchen, mehrere Ansichten in demselben Controller zu rendern.
quelle