Gibt es einen Unterschied zwischen dem Standardmuster "Model-View-Controller" und dem Model/View/ViewModel-Muster von Microsoft?
Antworten
Zu viele Anzeigen?Vom praktischen Standpunkt aus betrachtet ist MVC (Model-View-Controller) ein Muster. Allerdings ist MVC, wenn es als ASP.net MVC verwendet wird, in Kombination mit Entity Framework (EF) und den "Power Tools" ein sehr leistungsfähiger, teilweise automatisierter Ansatz, um Datenbanken, Tabellen und Spalten auf eine Webseite zu bringen, entweder für vollständige CRUD-Operationen oder nur für R-Operationen (Retrieve or Read). Zumindest bei der Verwendung von MVVM interagierten die Ansichtsmodelle mit Modellen, die von Geschäftsobjekten abhingen, die wiederum "handgemacht" waren, und nach einer Menge Aufwand konnte man froh sein, wenn man Modelle erhielt, die so gut waren wie das, was EF einem "out-of-the-box" bietet. Aus der Sicht der praktischen Programmierung scheint MVC eine gute Wahl zu sein, weil es einem viel Nutzen "out-of-box" bietet, aber es gibt immer noch ein Potenzial für zusätzliche Funktionen.
Ich dachte immer, dass MVC und MVVM dasselbe sind. Jetzt wegen der Existenz von Flux kann ich den Unterschied erkennen:
In MVC haben Sie für jede Ansicht in Ihrer Anwendung ein Modell und einen Controller, also würde ich es Ansicht, Ansichtsmodell, Ansichtscontroller nennen. Das Muster sagt Ihnen nicht, wie eine Ansicht mit einer anderen kommunizieren kann. Daher gibt es in verschiedenen Frameworks unterschiedliche Implementierungen dafür. So gibt es beispielsweise Implementierungen, bei denen Controller miteinander kommunizieren, während bei anderen Implementierungen eine andere Komponente zwischen ihnen vermittelt. Es gibt sogar Implementierungen, bei denen die View-Modelle miteinander kommunizieren, was einen Bruch des MVC-Musters darstellt, da auf das View-Modell nur vom View-Controller zugegriffen werden sollte.
In MVVM haben Sie auch ein View-Modell für jede Komponente. Das Muster gibt nicht an, wie die Ansicht das Ansichtsmodell beeinflussen sollte, so dass die meisten Frameworks die Funktionalität des Controllers einfach in das Ansichtsmodell aufnehmen. MVVM besagt jedoch, dass die Daten des View-Modells aus dem Modell stammen sollten, d.h. aus dem gesamten Modell, das einer bestimmten Ansicht nicht bekannt oder angepasst ist.
Um den Unterschied zu verdeutlichen, nehmen wir das Flux-Muster. Das Flux-Muster legt fest, wie die verschiedenen Ansichten in der App kommunizieren sollen. Jede Ansicht hört auf einen Speicher und feuert Aktionen über den Dispatcher ab. Der Dispatcher wiederum informiert alle Stores über die gerade durchgeführte Aktion, und die Stores aktualisieren sich selbst. Ein Store in Flux entspricht dem (allgemeinen) Modell in MVVM. Er ist nicht an eine bestimmte Ansicht gebunden. Wenn man also React und Flux verwendet, implementiert jede React-Komponente das MVVM-Muster. Wenn eine Aktion auftritt, ruft das View-Modell den Dispatcher auf, und schließlich wird es entsprechend den Änderungen im Speicher, der das Modell ist, aktualisiert. Man kann nicht sagen, dass jede Komponente MVC implementiert, denn in MVC kann nur der Controller das View Model aktualisieren. MVVM kann also mit Flux zusammenarbeiten (MVVM kümmert sich um die Kommunikation zwischen dem View und dem View-Modell, und Flux kümmert sich um die Kommunikation zwischen den verschiedenen Views), während MVC nicht mit Flux zusammenarbeiten kann, ohne ein Schlüsselprinzip zu verletzen.
Ergänzend zu vielen der Antworten möchte ich einige zusätzliche Perspektiven aus der Sicht der Modern clientseitiges Web - oder Reichhaltige Webanwendung Sichtweise.
In der Tat werden heutzutage einfache Websites und größere Webanwendungen in der Regel mit vielen beliebten Bibliotheken wie Bootstrap erstellt. Gebaut von Steve Sanderson, Knockout bietet Unterstützung für das MVVM-Muster, das eines der wichtigsten Verhaltensweisen dieses Musters nachahmt: Datenbindung durch das View Model. Mit ein wenig JavaScript können Daten und Logik implementiert werden, die dann den Seitenelementen mit einfachen data-bind
HTML-Attribute, ähnlich wie bei der Verwendung vieler der Funktionen von Bootstrap . Zusammen bieten diese beiden Bibliotheken allein interaktive Inhalte; in Kombination mit Routing kann dieser Ansatz zu einem einfachen, aber leistungsstarken Konzept für den Aufbau der Einseitige Bewerbung .
Ähnlich verhält es sich mit einem modernen Client-seitigen Framework wie Eckig folgt der Konvention nach dem MVC-Muster, fügt aber auch einen Dienst hinzu. Interessanterweise wird es als Model-View-Whatever (MVW) angepriesen. (Siehe dieser Beitrag auf Stack Overflow .)
Darüber hinaus ist mit dem Aufkommen von Progressiv Web-Frameworks wie Angular 2 sehen wir eine Änderung der Terminologie und vielleicht ein neues Architekturmuster, bei dem Komponenten aus einer Ansicht oder einem Template bestehen und mit einem Dienst interagieren - die alle in einem Modul enthalten sein können; und eine Reihe von Modulen bildet die Anwendung.
Modell-Ansichts-Steuerung (gewöhnlich bekannt als MVC ) ist ein Software-Entwurfsmuster, das häufig für die Entwicklung von Benutzeroberflächen verwendet wird, die die zugehörige Programmlogik in drei miteinander verbundene Elemente unterteilen. Dies geschieht, um die internen Darstellungen von Informationen von der Art und Weise zu trennen, wie die Informationen dem Benutzer präsentiert und von ihm angenommen werden. Durch das MVC-Architekturmuster werden diese Hauptkomponenten entkoppelt, was die Wiederverwendung von Code und die parallele Entwicklung ermöglicht.
Dieses Muster, das traditionell für grafische Desktop-Benutzeroberflächen (GUIs) verwendet wird, ist inzwischen auch für die Gestaltung von Webanwendungen beliebt. Beliebte Programmiersprachen wie JavaScript, Python, Ruby, PHP, Java und C# verfügen über MVC-Frameworks, die bei der Entwicklung von Webanwendungen sofort eingesetzt werden.
Modell
Die zentrale Komponente des Musters. Sie ist die dynamische Datenstruktur der Anwendung, unabhängig von der Benutzeroberfläche. Sie verwaltet direkt die Daten, die Logik und die Regeln der Anwendung.
Siehe
Jegliche Darstellung von Informationen, wie z. B. ein Diagramm, eine Grafik oder eine Tabelle. Es sind mehrere Ansichten derselben Informationen möglich, z. B. ein Balkendiagramm für das Management und eine tabellarische Ansicht für Buchhalter.
Controller
Nimmt Eingaben entgegen und wandelt sie in Befehle für das Modell oder die Ansicht um.
Der Model-View-Controller-Entwurf gliedert die Anwendung nicht nur in diese Komponenten, sondern definiert auch die Interaktionen zwischen ihnen.
Das Modell ist für die Verwaltung der Daten in der Anwendung zuständig. Es erhält Benutzereingaben vom Controller.
Die Ansicht ist eine Darstellung des Modells in einem bestimmten Format.
Der Controller reagiert auf die Benutzereingaben und führt Interaktionen mit den Datenmodellobjekten durch. Der Controller empfängt die Eingabe, validiert sie optional und gibt sie dann an das Modell weiter.
Model-View-ViewModel (MVVM) ist ein Software-Architekturmuster.
MVVM ermöglicht eine Trennung der Entwicklung der grafischen Benutzeroberfläche - sei es über eine Auszeichnungssprache oder GUI-Code - von der Entwicklung der Geschäftslogik oder Backend-Logik (dem Datenmodell). Das View-Modell von MVVM ist ein Wertkonverter, d.h. das View-Modell ist dafür verantwortlich, die Datenobjekte aus dem Modell so darzustellen (zu konvertieren), dass die Objekte einfach verwaltet und präsentiert werden können. In dieser Hinsicht ist das View-Modell eher ein Modell als ein View und übernimmt den Großteil, wenn nicht sogar die gesamte Anzeigelogik des Views. Das Ansichtsmodell kann ein Vermittlungsmuster implementieren, das den Zugriff auf die Backend-Logik um die von der Ansicht unterstützten Anwendungsfälle herum organisiert.
MVVM ist eine Variante des Entwurfsmusters Presentation Model von Martin Fowler. MVVM abstrahiert den Zustand und das Verhalten einer Ansicht auf die gleiche Weise, aber ein Präsentationsmodell abstrahiert eine Ansicht (erstellt ein Ansichtsmodell) auf eine Weise, die nicht von einer bestimmten Benutzeroberflächenplattform abhängig ist.
MVVM wurde von den Microsoft-Architekten Ken Cooper und Ted Peters speziell zur Vereinfachung der ereignisgesteuerten Programmierung von Benutzeroberflächen entwickelt. Das Muster wurde in Windows Presentation Foundation (WPF) (Microsofts .NET-Grafiksystem) und Silverlight (WPFs Internet-Anwendungsderivat) integriert. John Gossman, einer der WPF- und Silverlight-Architekten von Microsoft, kündigte MVVM im Jahr 2005 in seinem Blog an.
Model-View-ViewModel wird auch als Model-View-Binder bezeichnet, insbesondere in Implementierungen, die nicht die .NET-Plattform einbeziehen. ZK (ein in Java geschriebenes Web Application Framework) und KnockoutJS (eine JavaScript-Bibliothek) verwenden Model-View-Binder.
- See previous answers
- Weitere Antworten anzeigen
78 Stimmen
Beachten Sie, dass MVVM zwar von Microsoft geprägt wurde, aber auch viele Entwickler und Projekte außerhalb von Microsoft begonnen haben, dieses Muster zu übernehmen. Dieser Kommentar wurde Ihnen von der Abteilung "spite-the-MS-haters" zur Verfügung gestellt.
3 Stimmen
Nachdem ich lange Zeit mit MVVM gearbeitet habe, war meine erste Begegnung mit MVC frustrierend, bis ich lernte, dass ich ViewModels mit Hilfe von Bindungstechniken, die in MVVM zu finden sind, hin und her an den Browser übergeben kann. Aber wie Joel oben sagte, ist der einzige Weg, um den Zustand vom Browser zurückzubekommen, das Posten der Änderungen in einem Formular (das Name/Wert-Paare verwendet). Wenn Sie diesen Punkt nicht gut verstehen. Sie werden eine harte Zeit in MVC haben. Betrachten Sie den Controller einfach als einen Dependency Injector für die View und Sie sind bereit.
6 Stimmen
Eine solche Frage zu hochrangigen [Entwurfsmustern]. Ich würde gerne die Verwendung von Diagrammen in den Antworten vorschlagen.
1 Stimmen
Außerdem wurde die Frage umformuliert, um der Tatsache Rechnung zu tragen, dass die Frage im Zusammenhang mit Microsoft-Technologien gestellt wird... obwohl die akzeptierte Antwort irgendwie nicht stimmt.
5 Stimmen
Hier ist eine archivierte Version von Joels Artikel: web.archive.org/web/20150219153055/http://joel.inpointform.net/
4 Stimmen
Anders als bei der MVC-Methode ist das ViewModel kein Controller. Stattdessen fungiert es als Binder, der Daten zwischen View und Model bindet. Während das MVC-Format speziell darauf ausgelegt ist, eine Trennung von Modell und Ansicht zu schaffen, ist das MVVM-Format mit Datenbindung speziell darauf ausgelegt, dass Ansicht und Modell direkt miteinander kommunizieren können. hackernoon.com/