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...

123voto

Brian Leahy Punkte 33603

MVP: Der Blick ist das Maß aller Dinge.

In den meisten Fällen erstellt die Ansicht ihren Präsentator. Der Präsentator interagiert mit dem Modell und manipuliert die Ansicht über eine Schnittstelle. Die Ansicht interagiert manchmal mit dem Präsentator, normalerweise über eine Schnittstelle. Hier geht es um die Implementierung: Soll die Ansicht Methoden des Presenters aufrufen oder soll die Ansicht Ereignisse haben, auf die der Presenter hört? Es läuft auf das Folgende hinaus: Die Ansicht weiß über den Präsentator Bescheid. Die Ansicht delegiert an den Präsentator.

MVC: Der Controller hat das Sagen.

Der Controller wird auf der Grundlage eines Ereignisses/einer Anfrage erstellt oder aufgerufen. Der Controller erstellt dann die entsprechende Ansicht und interagiert mit dem Modell, um die Ansicht weiter zu konfigurieren. Es läuft darauf hinaus, dass der Controller den View erstellt und verwaltet; der View ist dem Controller untergeordnet. Der View weiß nichts über den Controller.

3 Stimmen

"Die Ansicht kennt keinen Controller". Ich denke, Sie meinen, dass die Ansicht keinen direkten Kontakt mit dem Modell hat?

2 Stimmen

Ansicht sollte nie etwas über das Modell in der einen oder anderen Ansicht erfahren.

5 Stimmen

@Brian: "The View, in den meisten Fällen, erschafft seinen Moderator". . Ich habe meistens das Gegenteil gesehen, nämlich dass der Presenter sowohl das Model als auch die View startet. Nun, die View kann auch den Presenter starten, aber dieser Punkt ist nicht wirklich der wichtigste. Was am meisten zählt, passiert später während der Lebensdauer.

84voto

AVI Punkte 5346

enter image description here

MVC (Model-View-Controller)

Die Eingabe wird zuerst an den Controller gerichtet, nicht an die Ansicht. Diese Eingabe könnte von einem Benutzer kommen, der mit einer Seite interagiert, sie könnte aber auch einfach durch die Eingabe einer bestimmten URL in einen Browser erfolgen. In jedem Fall handelt es sich um einen Controller, mit dem eine Schnittstelle besteht, um eine bestimmte Funktionalität auszulösen. Zwischen dem Controller und der Ansicht besteht eine Beziehung von mehreren zu einem. Das liegt daran, dass ein einzelner Controller verschiedene Ansichten auswählen kann, die je nach der ausgeführten Operation gerendert werden. Beachten Sie den Einwegpfeil vom Controller zur View. Das liegt daran, dass die View keine Kenntnis vom Controller hat und auch keinen Verweis auf diesen. Der Controller gibt das Model zurück, so dass es eine Verbindung zwischen dem View und dem erwarteten Model gibt, das an ihn übergeben wird, aber nicht dem Controller, der es ausgibt.

MVP (Model View Presenter)

Die Eingabe beginnt mit der Ansicht, nicht mit dem Präsentator. Es besteht eine Eins-zu-Eins-Zuordnung zwischen der Ansicht und dem zugehörigen Präsentator. Die Ansicht enthält einen Verweis auf den Präsentator. Der Präsentator reagiert auch auf Ereignisse, die von der Ansicht ausgelöst werden, so dass er weiß, mit welcher Ansicht er verbunden ist. Der Präsentator aktualisiert die Ansicht auf der Grundlage der angeforderten Aktionen, die er am Modell durchführt, aber die Ansicht kennt das Modell nicht.

Für mehr Referenz

0 Stimmen

Aber in MVP Muster, wenn die Anwendung zum ersten Mal geladen wird, ist dann nicht der Präsentator dafür verantwortlich, die erste Ansicht zu laden? Wenn wir zum Beispiel die Facebook-Anwendung laden, ist dann nicht der Präsentator dafür verantwortlich, die Anmeldeseite zu laden?

2 Stimmen

Eine Verbindung vom Modell zur Ansicht in MVC? Vielleicht möchten Sie Ihre Antwort bearbeiten, um zu erklären, wie dies ein "entkoppeltes" System macht, angesichts dieses Links. Hinweis: Das könnte Ihnen schwer fallen. Wenn Sie nicht glauben, dass der Leser bereit ist, zu akzeptieren, dass er sein ganzes Leben lang falsch gerechnet hat, sollten Sie auch erläutern, warum Aktionen in MVC zuerst den Controller durchlaufen, obwohl der Benutzer mit den "visuellen" Elementen auf dem Bildschirm (d. h. der View) interagiert und nicht mit einer abstrakten Schicht, die dahinter sitzt und die Verarbeitung vornimmt.

5 Stimmen

Dies ist eindeutig falsch... in MVC, Modell spricht nie direkt mit Ansicht und umgekehrt. Sie wissen nicht einmal, dass der andere existiert. Der Controller ist der Klebstoff, der sie zusammenhält.

80voto

Ali Nem Punkte 4656

Es gibt viele Antworten auf diese Frage, aber ich hatte das Gefühl, dass eine wirklich einfache Antwort nötig ist, um die beiden klar zu vergleichen. Hier ist die Diskussion, die ich mir ausgedacht habe, wenn ein Benutzer nach einem Filmnamen in einer MVP- und MVC-App sucht:

Benutzer: Klick klick

Siehe : Wer ist das? [ MVP | MVC ]

Benutzer: Ich habe gerade auf die Suchschaltfläche geklickt

Siehe : Ok, warte kurz . [ MVP | MVC ]

( Siehe Aufruf der Präsentator | Controller ) [ MVP | MVC ]

Siehe : Hallo Präsentator | Controller Was soll ich tun, wenn ein Benutzer gerade auf die Schaltfläche "Suchen" geklickt hat? [ MVP | MVC ]

Präsentator | Controller : Hallo Siehe Gibt es einen Suchbegriff auf dieser Seite? [ MVP | MVC ]

Siehe : Ja, hier ist es "Klavier" [ MVP | MVC ]

Präsentator | Controller : Danke Siehe In der Zwischenzeit suche ich den Suchbegriff in der Modell zeigen Sie ihm/ihr bitte einen Fortschrittsbalken [ MVP | MVC ]

( Präsentator | Controller ruft die Modell ) [ MVP | MVC ]

Präsentator | Controller : Hallo Modell Haben Sie einen Treffer für diesen Suchbegriff?: "Klavier" [ MVP | MVC ]

Modell : Hallo Präsentator | Controller Ich überprüfe das mal [ MVP | MVC ]

( Modell macht 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, Präsentator Hier ist es in JSON "[{"name": "Klavierlehrer", "Jahr":2001},{"name": "Klavier", "Jahr":1993}]" [ MVP ]

Modell : Es liegt ein Ergebnis vor, Controller . Ich habe eine Feldvariable in meiner Instanz erstellt und sie mit dem Ergebnis gefüllt. Ihr Name ist "searchResultsList" [ MVC ]

( Präsentator | Controller danke Modell und kommt zurück zum Siehe ) [ MVP | MVC ]

Präsentator : Danke fürs Warten Siehe habe ich eine Liste mit passenden Ergebnissen für Sie gefunden und sie in ein vorzeigbares Format gebracht: ["Klavierlehrer 2001", "Klavier 1993"]. Bitte zeigen Sie sie dem Benutzer in einer vertikalen Liste an. Bitte blenden Sie auch den Fortschrittsbalken aus [ MVP ]

Controller : Danke fürs Warten Siehe habe ich gefragt Modell über Ihre Suchanfrage. Es sagt, dass es eine Liste der übereinstimmenden Ergebnisse gefunden und sie in einer Variablen namens "searchResultsList" innerhalb seiner Instanz gespeichert hat. Sie können sie von dort abrufen. Blenden Sie bitte auch den Fortschrittsbalken aus [ MVC ]

Siehe : Ich danke Ihnen sehr Präsentator [ MVP ]

Siehe : Vielen Dank "Controller" [ MVC ] (Jetzt ist die Siehe stellt sich selbst in Frage: Wie soll ich die Ergebnisse präsentieren, die ich durch die Modell für den Nutzer? Soll das Produktionsjahr des Films an erster oder letzter Stelle stehen? Soll es in einer vertikalen oder horizontalen Liste stehen? ...)

Falls es Sie interessiert, ich habe eine Reihe von Artikeln geschrieben, die sich mit Architekturmustern für Anwendungen befassen (MVC, MVP, MVVP, saubere Architektur, ...), begleitet von einem Github Repo aquí . Auch wenn das Beispiel für Android geschrieben wurde, können die zugrunde liegenden Prinzipien auf jedes Medium angewendet werden.

0 Stimmen

Im Grunde wollen Sie damit sagen, dass der Controller die Ansichtslogik mikromanagt? Also macht er die Ansicht dümmer, indem er präsentiert, was passiert und wie auf Ansichten?

0 Stimmen

@Radu, Nein, es wird nicht mikromaniert, das macht der Moderator, indem er die Ansicht passiv oder stumm macht

8 Stimmen

In einem richtigen MVC ruft die Ansicht Funktionen auf dem Controller auf und hört auf Datenänderungen im Modell. Der View erhält keine Daten vom Controller, und der Controller sollte dem View NICHT sagen, dass er z. B. eine Ladeanzeige anzeigen soll. Ein richtiges MVC erlaubt es Ihnen, den View-Teil durch einen grundlegend anderen zu ersetzen. Der View-Teil enthält die View-Logik, zu der auch ein Ladeindikator gehört. Der View ruft Anweisungen (im Controller) auf, der Controller ändert Daten im Modell, und das Modell benachrichtigt seine Listener über Änderungen an seinen Daten, einer dieser Listener ist der View.

44voto

Rahul Punkte 2937

Modell-Ansichts-Steuerung

MVC ist ein Muster für die Architektur einer Softwareanwendung. Es trennt die Anwendungslogik in drei separate Teile und fördert so die Modularität und die einfache Zusammenarbeit und Wiederverwendung. Außerdem macht es Anwendungen flexibler und offen für Iterationen:

  • Modelle für die Verarbeitung von Daten und Geschäftslogik
  • Steuerungen für die Handhabung der Benutzeroberfläche und der Anwendung
  • Ansichten für die Handhabung von Objekten der grafischen Benutzeroberfläche und der Präsentation

Um dies zu verdeutlichen, stellen wir uns eine einfache Einkaufslisten-App vor. Alles, was wir wollen, ist eine Liste mit dem Namen, der Menge und dem Preis der einzelnen Artikel, die wir diese Woche kaufen müssen. Im Folgenden beschreiben wir, wie wir einige dieser Funktionen mit MVC implementieren können.

enter image description here

Modell-Ansicht-Präsentator

  • El Modell sind die Daten, die in der Ansicht (Benutzeroberfläche) angezeigt werden sollen.
  • El siehe ist eine Schnittstelle, die Daten (das Modell) anzeigt und Benutzerbefehle (Ereignisse) an den Presenter weiterleitet, um auf diese Daten einzuwirken. Die Ansicht hat normalerweise einen Verweis auf ihren Präsentator.
  • El Präsentator ist der "Mittelmann" (in MVC vom Controller gespielt) und hat Verweise auf View und Model. Bitte beachten Sie, dass das Wort "Modell" ist irreführend. Es sollte vielmehr heißen Geschäftslogik, die ein Modell abruft oder manipuliert . Zum Beispiel: Wenn Sie eine Datenbank haben, die Benutzer in einer Datenbanktabelle speichert, und Ihre Ansicht eine Liste von Benutzern anzeigen will, dann würde der Presenter einen Verweis auf Ihre Datenbank-Geschäftslogik haben (wie ein DAO), von wo aus der Presenter eine Liste von Benutzern abfragt.

Wenn Sie ein Beispiel mit einer einfachen Implementierung sehen möchten, schauen Sie bitte unter ce GitHub-Beitrag

Ein konkreter Arbeitsablauf für die Abfrage und Anzeige einer Liste von Benutzern aus einer Datenbank könnte folgendermaßen funktionieren: enter image description here

Was ist die Unterschied zwischen MVC y MVP Muster?

MVC-Muster

  • Controller basieren auf Verhaltensweisen und können in verschiedenen Ansichten gemeinsam genutzt werden

  • Kann für die Bestimmung der anzuzeigenden Ansicht verantwortlich sein (Front-Controller-Muster)

MVP-Muster

  • Die Ansicht ist lockerer an das Modell gekoppelt. Der Präsentator ist für die Bindung des Modells an die Ansicht verantwortlich.

  • Einfachere Unit-Tests, da die Interaktion mit der Ansicht über eine Schnittstelle erfolgt

  • In der Regel ist die Zuordnung von Zuschauer zu Moderator eins zu eins. Komplexe Ansichten können mehrere Präsentatoren haben.

4 Stimmen

Nah, es gibt keine direkte Verbindung zwischen Ansicht und Modell in mvc. Ihr Diagramm ist falsch.

0 Stimmen

@Özgür gibt es tatsächlich und das Diagramm ist korrekt.

38voto

Brett Veenstra Punkte 46226
  • MVP = Modell-Ansicht-Präsentator
  • MVC = Model-View-Controller

    1. Beide Präsentationsmuster. Sie trennen die Abhängigkeiten zwischen einem Modell (denken Sie an Domänenobjekte), Ihrem Bildschirm/Ihrer Webseite (der Ansicht) und der Art und Weise, wie sich Ihre Benutzeroberfläche verhalten soll (Präsentator/Controller).
    2. Sie sind vom Konzept her ziemlich ähnlich, die Leute initialisieren den Presenter/Controller je nach Geschmack unterschiedlich.
    3. Ein guter Artikel über die Unterschiede ist aquí . Am bemerkenswertesten ist, dass das MVC-Muster das Modell hat, das die Ansicht aktualisiert.

3 Stimmen

Modell zur Aktualisierung des VIew. Und das ist immer noch ein entkoppeltes System?

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