2346 Stimmen

Was sind MVP und MVC und worin besteht der Unterschied?

Beim Blick über den Tellerrand RAD (Ziehen und Konfigurieren) bei der Erstellung von Benutzeroberflächen, die von vielen Tools unterstützt werden, werden Sie wahrscheinlich auf drei Entwurfsmuster stoßen, die Modell-Ansichts-Steuerung , Modell-Ansicht-Präsentator y Model-View-ViewModel . Meine Frage besteht aus drei Teilen:

  1. Welche Themen werden in diesen Mustern angesprochen?
  2. Inwiefern sind sie sich ähnlich?
  3. Wie unterscheiden sie sich?

6 Stimmen

3 Stimmen

IDK, aber angeblich für die ursprüngliche MVC, war es in der kleinen verwendet werden soll. Jede Schaltfläche, jedes Etikett usw. hatte sein eigenes View- und Controller-Objekt, zumindest behauptet Onkel Bob das. Ich glaube, er hat über Smalltalk gesprochen. Schauen Sie sich seine Vorträge auf YouTube an, sie sind faszinierend.

1 Stimmen

MVP fügt eine zusätzliche Ebene der Indirektion hinzu, indem es den View-Controller in einen View und einen Presenter aufteilt...

2120voto

Glenn Block Punkte 8453

Modell-Ansicht-Präsentator

Sur MVP Der Presenter enthält die UI-Geschäftslogik für die View. Alle Aufrufe der Ansicht werden direkt an den Presenter delegiert. Der Presenter ist auch direkt von der View entkoppelt und kommuniziert mit ihr über eine Schnittstelle. Dies soll das Mocking der View in einem Unit-Test ermöglichen. Ein gemeinsames Merkmal von MVP ist, dass es eine Menge von Zwei-Wege-Dispatching geben muss. Wenn zum Beispiel jemand auf die Schaltfläche "Speichern" klickt, delegiert der Event-Handler an die "OnSave"-Methode des Presenters. Sobald der Speichervorgang abgeschlossen ist, ruft der Präsentator die Ansicht über seine Schnittstelle zurück, so dass die Ansicht anzeigen kann, dass der Speichervorgang abgeschlossen ist.

MVP ist ein sehr natürliches Muster, um eine getrennte Darstellung in WebForms zu erreichen. Der Grund dafür ist, dass die Ansicht immer zuerst von der ASP.NET-Laufzeit erstellt wird. Sie können Erfahren Sie mehr über beide Varianten .

Zwei Hauptvarianten

Passive Ansicht: Die Ansicht ist so dumm wie möglich und enthält fast keine Logik. Ein Presenter ist ein Mittelsmann, der mit der Ansicht und dem Modell spricht. Die Ansicht und das Modell sind vollständig voneinander abgeschirmt. Das Model kann Ereignisse auslösen, aber der Presenter abonniert diese, um die View zu aktualisieren. In der passiven Ansicht gibt es keine direkte Datenbindung, stattdessen stellt die Ansicht Setter-Eigenschaften zur Verfügung, die der Präsentator zum Setzen der Daten verwendet. Der gesamte Zustand wird im Presenter und nicht in der Ansicht verwaltet.

  • Pro: maximale Testbarkeit der Oberfläche; saubere Trennung von View und Model
  • Nachteil: mehr Arbeit (z. B. alle Setter-Eigenschaften), da Sie die gesamte Datenbindung selbst vornehmen.

Aufsichtsführender Controller: Der Presenter verarbeitet Benutzergesten. Die Ansicht bindet sich durch Datenbindung direkt an das Modell. In diesem Fall ist es die Aufgabe des Presenters, das Model an die View weiterzugeben, damit diese sich daran binden kann. Der Presenter enthält auch die Logik für Gesten wie das Drücken einer Schaltfläche, die Navigation usw.

  • Pro: Durch die Nutzung der Datenbindung wird der Umfang des Codes reduziert.
  • Nachteil: Es gibt eine weniger testbare Oberfläche (wegen der Datenbindung), und es gibt weniger Kapselung in der Ansicht, da sie direkt mit dem Modell spricht.

Modell-Ansichts-Steuerung

In der MVC Der Controller ist dafür verantwortlich, zu bestimmen, welche Ansicht als Reaktion auf eine beliebige Aktion angezeigt werden soll, auch wenn die Anwendung geladen wird. Dies unterscheidet sich von MVP, wo Aktionen über die View zum Presenter geleitet werden. In MVC korreliert jede Aktion in der View mit einem Aufruf eines Controllers zusammen mit einer Aktion. Im Web beinhaltet jede Aktion einen Aufruf an eine URL, auf deren anderer Seite ein Controller steht, der darauf antwortet. Sobald dieser Controller seine Verarbeitung abgeschlossen hat, gibt er die richtige Ansicht zurück. Die Abfolge setzt sich während der gesamten Lebensdauer der Anwendung auf diese Weise fort:

    Action in the View
        -> Call to Controller
        -> Controller Logic
        -> Controller returns the View.

Ein weiterer großer Unterschied zu MVC ist, dass die Ansicht nicht direkt an das Modell gebunden ist. Der View rendert einfach und ist völlig zustandslos. In MVC-Implementierungen hat die View normalerweise keine Logik im Code dahinter. Dies steht im Gegensatz zu MVP, wo dies absolut notwendig ist, denn wenn die View nicht an den Presenter delegiert, wird sie nie aufgerufen.

Präsentation Modell

Ein weiteres Muster, das man sich ansehen sollte, ist die Präsentation Modell Muster. Bei diesem Muster gibt es keinen Presenter. Stattdessen bindet sich die Ansicht direkt an ein Präsentationsmodell. Das Präsentationsmodell ist ein Modell, das speziell für die Ansicht erstellt wurde. Das bedeutet, dass dieses Modell Eigenschaften aufweisen kann, die man niemals in ein Domänenmodell einfügen würde, da dies eine Verletzung der Gewaltenteilung darstellen würde. In diesem Fall bindet sich das Präsentationsmodell an das Domänenmodell und kann Ereignisse abonnieren, die von diesem Modell kommen. Die Ansicht abonniert dann Ereignisse, die vom Präsentationsmodell kommen, und aktualisiert sich entsprechend. Das Präsentationsmodell kann Befehle bereitstellen, 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 das PM das gesamte Verhalten des Views vollständig kapselt. Dieses Muster ist ein sehr guter Kandidat für den Einsatz in WPF-Anwendungen und wird auch als Model-View-ViewModel .

Es gibt eine MSDN-Artikel über das Präsentationsmodell und einen Abschnitt in der Anleitung für zusammengesetzte Anwendungen für WPF (ehemals Prism) über Getrennte Darstellungsmuster

39 Stimmen

Können Sie diesen Satz bitte erläutern? Dies unterscheidet sich von MVP, wo Aktionen über die Ansicht zum Präsentator geleitet werden. In MVC korreliert jede Aktion in der View mit einem Aufruf eines Controllers zusammen mit einer Aktion. Für mich hört sich das nach derselben Sache an, aber ich bin mir sicher, dass du etwas anderes beschreibst.

18 Stimmen

@Panzercrisis Ich bin mir nicht sicher, ob der Autor das so gemeint hat, aber ich glaube, dass er das so gemeint hat. Wie diese Antwort - stackoverflow.com/a/2068/74556 In MVC basieren Controller-Methoden auf Verhaltensweisen, d. h. Sie können mehrere Ansichten (aber dasselbe Verhalten) einem einzigen Controller zuordnen. In MVP ist der Presenter enger an die View gekoppelt und führt in der Regel zu einem Mapping, das näher an eins zu eins ist, d.h. eine View-Action wird der entsprechenden Presenter-Methode zugeordnet. Sie würden normalerweise nicht die Aktionen einer anderen Ansicht auf die Methode eines anderen Präsentators (aus einer anderen Ansicht) abbilden.

4 Stimmen

Beachten Sie, dass MVC wird häufig von Web-Frameworks wie Laravel , wo die empfangenen URL-Anfragen (möglicherweise von Nutzern) von der Controller und das HTML, das von der View wird an den Client gesendet - also die View ist ein Teil der Backend und der Benutzer kann nie direkt darauf zugreifen, und wenn Sie irgendwo das Gegenteil erleben, dann betrachten Sie das als eine MVC-Erweiterung (oder sogar Verletzung). @Panzercrisis, Dies unterscheidet sich von MVP (wie das in Android OS), wobei actions route through the View to the Presenter und Nutzer haben direkten Zugang zum View .

512voto

Phyxx Punkte 15108

Dies ist eine grobe Vereinfachung der vielen Varianten dieser Entwurfsmuster, aber so stelle ich mir die Unterschiede zwischen den beiden vor.

MVC

MVC

MVP

enter image description here

11 Stimmen

Dies ist eine großartige Darstellung des Schemas, die die Abstraktion und die vollständige Isolierung aller mit der grafischen Benutzeroberfläche zusammenhängenden Dinge (Ansichten) von der API des Präsentators zeigt. Ein kleiner Punkt: Ein Master Presenter könnte verwendet werden, wenn es nur einen Presenter gibt, anstatt einen pro View, aber Ihr Diagramm ist das sauberste. IMO besteht der größte Unterschied zwischen MVC und MVP darin, dass MVP versucht, den View von allem anderen als der Anzeige des aktuellen "View-Status" (View-Daten) freizuhalten und gleichzeitig dem View jegliche Kenntnis von Model-Objekten zu verweigern. Daher müssen die Schnittstellen vorhanden sein, um diesen Zustand zu injizieren.

0 Stimmen

Awesome Antwort, vor allem für Ihr Bild, das genau die Existenz eines einzelnen Controllers in MVC zeigt.

4 Stimmen

Gutes Bild. Ich verwende MVP recht häufig, daher möchte ich einen Punkt ansprechen. Meiner Erfahrung nach müssen die Präsentatoren ziemlich oft miteinander sprechen. Das Gleiche gilt für die Modelle (oder Geschäftsobjekte). Aufgrund dieser zusätzlichen "blauen Linien" der Kommunikation, die in Ihrem MVP-Bild zu sehen sind, können die Presenter-Model-Beziehungen ziemlich verwickelt werden. Daher tendiere ich zu einer Eins-zu-Eins-Beziehung zwischen Präsentator und Modell im Gegensatz zu einer Eins-zu-Viel-Beziehung. Ja, es erfordert einige zusätzliche Delegatmethoden auf dem Modell, aber es reduziert viele Kopfschmerzen, wenn sich die API des Modells ändert oder ein Refactoring benötigt.

444voto

Jon Limjap Punkte 92084

Darüber habe ich vor einiger Zeit in einem Blog geschrieben, mit einem Zitat von Todd Snyder's ausgezeichneter Beitrag über den Unterschied zwischen den beiden :

Hier sind die wichtigsten Unterschiede zwischen den Mustern:

MVP-Muster

  • Die Ansicht ist lockerer an das Modell gekoppelt. Der Präsentator ist verantwortlich für die Bindung des Modells an die Ansicht.
  • Einfacher zu testen, da die Interaktion mit der Ansicht über eine Schnittstelle
  • In der Regel ist die Zuordnung von Zuschauer zu Moderator eins zu eins. Komplexe Ansichten können mehrere Präsentatoren haben.

MVC-Muster

  • Controller basieren auf Verhaltensweisen und können übergreifend genutzt werden Ansichten
  • Kann für die Bestimmung der anzuzeigenden Ansicht verantwortlich sein

Dies ist die beste Erklärung, die ich im Internet finden konnte.

18 Stimmen

Ich verstehe nicht, wie die Ansicht mehr oder weniger eng an das Modell gekoppelt werden kann, wenn es in beiden Fällen darum geht, sie vollständig zu entkoppeln. Ich will Ihnen nicht unterstellen, dass Sie etwas Falsches gesagt haben - ich bin nur verwirrt, was Sie meinen.

0 Stimmen

Diese Antwort verwirrt mich (ebenso wie die akzeptierte), denn dann MVC (nach "View" gewählt) = MVP? Was ist in diesem Fall der Unterschied zu einem MVP, das eine andere Registerkarte anzeigt (z. B. andere Registerkarten ausblenden); die "Ansicht" ist jetzt eine andere? (Zugegeben, jede Registerkarte könnte ihr eigenes MVP haben, aber warum dann nicht auch jedes Panel? Jede Schaltfläche?)

20 Stimmen

@pst: mit MVP ist es wirklich 1 View = 1 Presenter. Bei MVC kann der Controller mehrere Views steuern. Das war's eigentlich schon. Mit dem "Tabs"-Modell stellen Sie sich vor, dass jeder Tab seinen eigenen Presenter hat, im Gegensatz zu einem Controller für alle Tabs.

283voto

Ashraf Bashir Punkte 9308

Hier sind Abbildungen, die den Kommunikationsfluss darstellen

enter image description here

enter image description here

50 Stimmen

Ich habe eine Frage bezüglich des MVC-Diagramms. Ich verstehe nicht den Teil, wo die Ansicht geht, um Daten zu holen. Ich würde denken, der Controller würde an die Ansicht mit den benötigten Daten weiterleiten.

70 Stimmen

Wenn ein Benutzer auf eine Schaltfläche klickt, inwiefern ist das keine Interaktion mit der Ansicht? Ich habe das Gefühl, dass in MVC der Benutzer mehr mit der Ansicht als mit dem Controller interagiert

5 Stimmen

Ich weiß, dass dies eine alte Antwort ist - aber könnte jemand auf @JonathanLeaders Punkt antworten? Ich komme aus einem Winforms-Hintergrund, es sei denn, Sie haben einige sehr einzigartige Codierung, wenn Sie klicken die UI/Ansicht erhält Wissen über diesen Klick vor allem anderen. Zumindest, so weit ich weiß?

186voto

Quibblesome Punkte 24734

MVP ist pas notwendigerweise ein Szenario, in dem die Ansicht das Sagen hat (siehe z. B. MVP von Taligent).
Ich finde es bedauerlich, dass dies immer noch als Muster (View in charge) und nicht als Anti-Muster gepredigt wird, denn es widerspricht "It's just a view" (Pragmatic Programmer). "It's just a view" besagt, dass die endgültige Ansicht, die dem Benutzer gezeigt wird, für die Anwendung zweitrangig ist. Das MVP-Muster von Microsoft erschwert die Wiederverwendung von Views erheblich und Bequem entschuldigt Microsofts Designer, schlechte Praktiken zu fördern.

Um ganz offen zu sein, denke ich, dass die zugrundeliegenden Anliegen von MVC für jede MVP-Implementierung gelten und die Unterschiede fast ausschließlich semantischer Natur sind. Solange Sie die Trennung der Belange zwischen der Ansicht (die die Daten anzeigt), dem Controller (der die Benutzerinteraktion initialisiert und steuert) und dem Modell (die zugrundeliegenden Daten und/oder Dienste) einhalten, erreichen Sie die Vorteile von MVC. Wenn Sie diese Vorteile erreichen, dann ist es völlig egal, ob Ihr Muster MVC, MVP oder Supervising Controller heißt. Das einzige real Muster bleibt als MVC, der Rest sind nur unterschiedliche Geschmacksrichtungen von ihm.

Erwägen Sie ce hochinteressanter Artikel, der eine Reihe dieser unterschiedlichen Implementierungen umfassend auflistet. Sie werden feststellen, dass sie im Grunde alle das Gleiche tun, nur etwas anders.

Ich persönlich bin der Meinung, dass MVP erst vor kurzem wieder als eingängiger Begriff eingeführt wurde, um entweder die Streitigkeiten zwischen semantischen Fanatikern zu verringern, die darüber streiten, ob etwas wirklich MVC ist oder nicht, oder um Microsofts Rapid Application Development Tools zu rechtfertigen. Keiner dieser beiden Gründe rechtfertigt meiner Meinung nach seine Existenz als eigenständiges Entwurfsmuster.

32 Stimmen

Ich habe mehrere Antworten und Blogs über die Unterschiede zwischen MVC/MVP/MVVM/etc' gelesen. Im Grunde genommen ist es alles dasselbe, wenn es um die Sache geht. Es spielt eigentlich keine Rolle, ob Sie eine Schnittstelle haben oder nicht und ob Sie einen Setter (oder ein anderes Sprachmerkmal) verwenden. Es scheint, dass der Unterschied zwischen diesen Mustern durch die unterschiedlichen Implementierungen der verschiedenen Frameworks entstanden ist und nicht durch eine Frage des Konzepts.

6 Stimmen

Ich würde MVP nicht als einen Anti-Muster wie später in dem Beitrag "... der Rest [einschließlich MVP] sind nur unterschiedliche Geschmacksrichtungen von [MVC]...", was bedeuten würde, dass, wenn MVP ein Anti-Muster war, so war MVC... es ist nur eine Geschmacksrichtung für einen anderen Ansatz des Rahmens. (Nun, einige spezifisch MVP-Implementierungen können mehr oder weniger wünschenswert sein als manche spezifisch MVC-Implementierungen für verschiedene Aufgaben...)

0 Stimmen

@Quibblsome: "Ich persönlich denke, dass MVP erst vor kurzem wieder als eingängiger Begriff eingeführt wurde, um entweder Streitigkeiten zwischen semantischen Fanatikern zu reduzieren, die sich darüber streiten, ob etwas wirklich MVC ist oder nicht [ ] Keiner dieser Gründe rechtfertigt in meinen Büchern seine Existenz als separates Design Pattern." . Der Unterschied ist groß genug, um es zu unterscheiden. In MVP kann die View alles sein, was eine vordefinierte Schnittstelle erfüllt (die View in MVP ist eine eigenständige Komponente). In MVC ist der Controller für eine bestimmte View gemacht (falls die Relationen jemanden dazu bringen, das für einen anderen Begriff zu halten).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X