webentwicklung-frage-antwort-db.com.de

Welches MVC-Diagramm ist richtig? (Web-App)

44
Marcus

Sie sind alle.

MVC ist ein vages Muster.

Meine Ansicht zu MVC lautet:

Controller

Object verfügt über eine Sammlung von Modellen sowie über Methoden zum Anzeigen und Bearbeiten der Modelle. Es spricht mit Models und gibt Instanzen von Ansichten mit darauf angewendeten Modellen zurück.

Aussicht

Hat die Definition eines Modells und ist nur eine Reihe von Funktionen zur Anzeige eines bestimmten Modells.

Modell

Verkapselt Daten. Verfügt über Methoden zum Zurückkehren des Status und Ändern des Status.

//Controller
import Views

class Controller
  private Models

//View
import Model

class View

//Model
class Model

Ein Modell muss nichts über den View/Controller wissen. Ein View muss die Definition eines Modells kennen. Ein Controller muss own Models besitzen und Definitionen von Ansichten kennen. 

Sie können sie enger koppeln, das ist optional.

27
Raynos

Genau genommen ist MVC eine Art veraltetes Muster. Grobkörnig gesprochen, führt es Abhängigkeiten zwischen Ansicht und Modell ein, da der Modellstatus direkt aktualisiert wird ( http://www.mimuw.edu.pl/~sl/teaching/00_01/Delfin_EC/Overviews/MVC. htm ), wie in Abbildung 4 gezeigt, wo Sie laut MVC-Originalformulierung eine direkte Interaktion zwischen Modell und Ansicht sehen. Dies ist nicht wünschenswert. Tatsächlich haben wir heute Versionen von MVC modifiziert, und manchmal beschreiben wir MVP und nennen es MVC. Das Akronym "MVC" wurde mit so viel Freiheit verwendet, dass trotz der Implementierungsdetails und Verantwortungsdefinitionen alles, wo Sie drei Elemente namens "Modell", "Ansicht" und "Controller" haben, im Grunde MVC ist. Der Unterschied zwischen MVC und MVP ist wirklich geringfügig, wenn Sie sie beschreiben, und liegt in der Definition der Verantwortlichkeiten von View und Presenter (Controller). Tatsächlich hat Martin Fowler vor einigen Jahren MVP (und MVC) verabschiedet ( http://www.martinfowler.com/eaaDev/ModelViewPresenter.html ), und wir können die Definition von ihm finden eines "neuen" Musters namens Presentation Model (siehe http://martinfowler.com/eaaDev/PresentationModel.html ) oder PM. Microsoft hat für seine WPF- und Silverlight-Technologien ein anderes Muster definiert, das als Model-View-View-Presenter oder MVVM bezeichnet wird (siehe http://msdn.Microsoft.com/de-de/magazine/dd419663.aspx ). welches das Präsentationsmodell als Inspiration hat. Ich denke, man kann sich alle diese Typen ansehen und herausfinden, wie sehr sie sich (und anders) sind. Meiner bescheidenen Meinung nach besteht die grundlegende Idee darin, dass Präsentationsdaten und -verhalten in Presenter verbleiben. Model kennt View nicht (daher ist Diagramm 4 deaktiviert, auch wenn es sich dabei um MVC handelt), und Sie sollten in der Lage sein, View zu wechseln (oder andere View zu unterstützen.) Implementierungen) auf eine schmerzlose Weise, die sowohl von Presenter als auch von Model getrennt ist. Presentation Model kann dies bieten und ist effektiv und gründlich unter Verwendung aktueller Technologien zu implementieren.

7

In der Tat gibt es einen kleinen Unterschied. 

Es gibt zwei Arten von Modellen: Aktives Modell und Passives Modell: Das erste Modell verfügt über einen Benachrichtigungsmechanismus und das zweite Modell weiß nicht, dass es in MVC verwendet wird. 

Erste und vierte Diagramme zeigen MVC mit aktivem Modell.

Mehr darüber erfahren Sie hier .

4
meze

Diagramme 1 und 4 sind korrekte MVC-Muster. Der Rest ist dem MVP-Muster näher.

In einem Web-MVC gibt es zwar ein passives Modell, und Änderungen werden von der Ansicht aus dem Modell gezogen, anstatt vom Modell (Beobachtermuster) gedrückt zu werden.

2
tereško

Diagramm 2, 3 und 5 sind für MVC genau. Wenn Sie eine Anfrage an einen Controller senden, führen Sie den Vorgang unter Verwendung von Modellen aus und antworten dann zurück.

1
Both FM

Keiner von ihnen ist tatsächlich falsch, aber es gibt einen anderen Ansatz für Web (Request/Response) -basierte MVC und clientseitige MVC.

In einer Webumgebung ist ein Controller dafür verantwortlich, mit einer Benutzeranforderung umzugehen, das Modell zu ändern (falls zutreffend), die rechte Ansicht zu finden, diese Modellinformationen der Ansicht zuzuweisen und sie dem Benutzer zurückzugeben.

Bei der direkteren Interpretation des ursprünglichen MVC-Musters (sprich Desktop-Anwendungen) aktualisiert das Modell die Ansicht bei jeder Änderung direkt, und der Controller behandelt Benutzereingaben und Anwendungslogik, um das Modell entsprechend zu aktualisieren. Dies funktioniert jedoch nicht für normale Webanwendungen, da HTTP stateless ist und ohne die Verwendung neuerer Technologien (wie lange Ajax-Abfragen oder Websockets, wie im Kommentar erwähnt) der Server den Client nicht wirklich über Änderungen im Modell informieren kann .

1
Daff

Diagramm 1 ist die korrekte Darstellung des MVC-Musters.

Die durchgezogenen Linien repräsentieren wie in einer Variablen eine tatsächliche Referenz. Das heißt, Sie sollten davon ausgehen, dass eine Instanz des Modells in der Ansicht und im Controller angezeigt wird. 

Die gestrichelten Linien stellen Funktionsaufrufe oder Meldungen von einem zum anderen dar. Die gestrichelte Linie vom Modell zur Ansicht wird über das Observer-Muster implementiert, bei dem sich etwas am Modell geändert hat und es auf die Ansicht verweist (über die Observer-API des Modells), wo es eine Methode aufruft. So etwas wie observer[i].update("name", value, self), das im Modell aufgerufen wird, wenn sich etwas ändert.

Die gestrichelte Linie zwischen der Ansicht und der Steuerung ist die Ansicht, die eine Nachricht an die Steuerung sendet. Stellen Sie sich eine Schaltfläche auf einer angeklickten Benutzeroberfläche vor. Der Controller wartet auf dieses Ereignis und behandelt es.

Ein Beispiel für den Kommunikationsfluss wäre das Klicken auf die Schaltfläche: Ansicht sendet eine Nachricht an den Controller. Der Controller behandelt das Ereignis, wenn es seine Instanz des Modells aktualisiert, beispielsweise model.name. Model hat eine setter-Methode, die name aktualisiert und eine Methode wie changed aufruft, die dann ihre Beobachter durchläuft und .update für jeden Beobachter aufruft. Die vorherige subscribed-Ansicht des Modells erhält die update-Anweisung mit den alten und neuen Werten von name. Eine update-Methode in View aktualisiert den Namenswert in einer label. Erledigt.  MVC Example Sequence

Slide-Deck, das MVC beschreibt: https://pl.csie.ntut.edu.tw/~ctchen/pdf/InsideSmalltalkMVC-public.pdf

C2 Wiki MVC-Artikel: http://wiki.c2.com/?ModelViewController

0
Joey Guerra