1424 Stimmen

Was ist der Unterschied zwischen MVC und MVVM?

Gibt es einen Unterschied zwischen dem Standardmuster "Model-View-Controller" und dem Model/View/ViewModel-Muster von Microsoft?

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.

739voto

Gone Coding Punkte 90304

MVC/MVVM ist kein entweder/oder Wahl.

Die beiden Muster tauchen in unterschiedlicher Weise sowohl in der ASP.Net- als auch in der Silverlight/WPF-Entwicklung auf.

Für ASP.Net wird MVVM verwendet, um wechselseitige Bindung Daten innerhalb von Ansichten. Dies ist in der Regel eine clientseitige Implementierung (z. B. mit Knockout.js). MVC hingegen ist eine Methode zur Trennung von Anliegen auf der Server-Seite .

Für Silverlight und WPF ist das MVVM-Muster umfassender und kann erscheinen als Ersatz für MVC (oder andere Muster der Organisation von Software in getrennten Verantwortungsbereichen) zu fungieren. Eine Annahme, die häufig aus diesem Muster hervorging, war, dass die ViewModel einfach den Controller in MVC (als ob man das einfach ersetzen könnte durch VM para C in das Akronym und alles wäre vergeben)...

Das ViewModel macht no ersetzen nicht notwendigerweise den Bedarf an separaten Controllern.

Das Problem ist, dass ein View-Modell, um unabhängig testbar* und vor allem wiederverwendbar zu sein, wenn es gebraucht wird, keine Ahnung hat, welcher View es anzeigt, aber was noch wichtiger ist keine Ahnung, woher die Daten stammen .

*Hinweis: In der Praxis entfernen Controller den größten Teil der Logik, die Unit-Tests erfordert, aus dem ViewModel. Die VM wird dann zu einem stummen Container, der wenig, wenn überhaupt, Tests erfordert. Dies ist eine gute Sache, da die VM nur eine Brücke zwischen dem Designer und dem Programmierer ist und daher einfach gehalten werden sollte.

Selbst in MVVM enthalten Controller in der Regel die gesamte Verarbeitungslogik und entscheiden, welche Daten in welchen Ansichten unter Verwendung welcher Ansichtsmodelle angezeigt werden sollen.

Nach dem, was wir bisher gesehen haben, ist der Hauptvorteil des ViewModel-Patterns, Code aus dem XAML-Code-Behind zu entfernen um die XAML-Bearbeitung unabhängiger zu machen . Wir erstellen nach wie vor je nach Bedarf Controller, um die Gesamtlogik unserer Anwendungen zu steuern (kein Wortspiel beabsichtigt).

Die grundlegenden MVCVM-Leitlinien, die wir befolgen, sind:

  • Ansichten eine bestimmte Form von Daten anzeigen . Sie haben keine Ahnung, woher die Daten stammen.
  • AnsichtModelle eine bestimmte Form von Daten und Befehlen enthalten Sie wissen nicht, woher die Daten oder der Code kommen und wie sie angezeigt werden.
  • Modelle die eigentlichen Daten enthalten (verschiedene Kontext-, Speicher- oder andere Methoden)
  • Controller warten auf Ereignisse und veröffentlichen sie. Controller liefern die Logik, die steuert, welche Daten wo zu sehen sind. Controller stellen den Befehlscode für das ViewModel bereit, so dass das ViewModel tatsächlich wiederverwendbar ist.

Wir haben auch festgestellt, dass die Sculpture code-gen framework implementiert MVVM und ein Muster, das dem von Prism ähnelt UND es macht auch ausgiebigen Gebrauch von Controllern, um die gesamte Anwendungsfalllogik zu trennen.

Gehen Sie nicht davon aus, dass Controller durch View-Modelle obsolet werden.

Ich habe einen Blog zu diesem Thema gestartet, den ich nach und nach ergänzen werde (nur Archiv, da das Hosting verloren ging) . Es gibt Probleme bei der Kombination von MVCVM mit den gängigen Navigationssystemen, da die meisten Navigationssysteme nur Views und VMs verwenden, aber darauf werde ich in späteren Artikeln eingehen.

Ein zusätzlicher Vorteil der Verwendung eines MVCVM-Modells ist, dass nur die Controller-Objekte müssen während der gesamten Lebensdauer der Anwendung im Speicher vorhanden sein und die Controller enthalten hauptsächlich Code und nur wenige Zustandsdaten (d. h. ein geringer Speicher-Overhead). Dies führt zu wesentlich weniger speicherintensiven Anwendungen als Lösungen, bei denen View-Modelle beibehalten werden müssen, und ist ideal für bestimmte Arten der mobilen Entwicklung (z. B. Windows Mobile mit Silverlight/Prism/MEF). Dies hängt natürlich von der Art der Anwendung ab, da Sie möglicherweise immer noch gelegentlich zwischengespeicherte VMs für die Reaktionsfähigkeit beibehalten müssen.

Hinweis: Dieser Beitrag wurde mehrfach überarbeitet und zielte nicht speziell auf die gestellte Frage ab, so dass ich den ersten Teil aktualisiert habe, um nun auch diese Frage zu behandeln. Ein Großteil der Diskussion in den Kommentaren unten bezieht sich nur auf ASP.Net und nicht auf das Gesamtbild. Dieser Beitrag sollte die breitere Verwendung von MVVM in Silverlight, WPF und ASP.Net abdecken und versuchen, die Leute davon abzuhalten, Controller durch ViewModels zu ersetzen.

9 Stimmen

@Tomasz Zielinski: Stimmt, aber "wo sie verwendet werden" war nicht die Frage (oder der Punkt meiner Antwort). Mein Punkt ist, dass Controller in MVVM immer noch nützlich sind.

61 Stimmen

Ich bin einverstanden. Mein Kommentar wurde durch plötzliche Erleuchtung verursacht und nicht, weil ich mit Ihnen nicht einverstanden war.

1 Stimmen

Wir haben auch Controller verwendet, um den "Fluss" der Ansichten in einer assistentenähnlichen Benutzeroberfläche zu steuern.

334voto

Lumi Punkte 14158

Ich denke, der einfachste Weg, um zu verstehen, was diese Akronyme bedeuten sollen, ist, sie einen Moment lang zu vergessen. Denken Sie stattdessen an die Software, mit der sie entstanden sind, und zwar jede einzelne. Im Grunde läuft es auf den Unterschied zwischen dem frühen Web und dem Desktop hinaus.

Als diese Mitte der 2000er Jahre immer komplexer wurden, begann man, das MVC-Softwareentwurfsmuster, das erstmals in den 1970er Jahren beschrieben wurde, auch auf Webanwendungen anzuwenden. Denken Sie an Datenbank, HTML-Seiten und den Code dazwischen. Verfeinern wir dies noch ein wenig, um zu MVC zu gelangen: Für "Datenbank" nehmen wir Datenbank plus Schnittstellencode an. Für "HTML-Seiten" nehmen wir HTML-Vorlagen plus Vorlagenverarbeitungscode an. Für den "Code dazwischen" nehmen wir Code an, der Benutzerklicks auf Aktionen abbildet, möglicherweise die Datenbank beeinflusst und definitiv die Anzeige einer anderen Ansicht verursacht. Das war's, zumindest für die Zwecke dieses Vergleichs.

Lassen Sie uns ein Merkmal dieses Webkrams beibehalten, und zwar nicht so, wie es heute ist, sondern so, wie es vor zehn Jahren existierte, als JavaScript noch ein niederes, verachtenswertes Ärgernis war, das echte Programmierer tunlichst meiden sollten: Die HTML-Seite ist im Wesentlichen stumm und passiv. Der Browser ist ein Thin Client, oder wenn man so will, ein armer Client. Es gibt keine Intelligenz im Browser. Vollständige Seitenneuladungen sind die Regel. Die "Ansicht" wird jedes Mal aufs Neue generiert.

Erinnern wir uns daran, dass diese Art des Webs, obwohl sie der letzte Schrei war, im Vergleich zum Desktop furchtbar rückständig war. Desktop-Anwendungen sind Fat Clients oder Rich Clients, wenn Sie so wollen. (Sogar ein Programm wie Microsoft Word kann als eine Art Client betrachtet werden, ein Client für Dokumente.) Es sind Clients voller Intelligenz, voller Wissen über ihre Daten. Sie sind zustandsorientiert. Sie zwischenspeichern die Daten, die sie verarbeiten, im Speicher. Es gibt keinen solchen Mist wie ein vollständiges Neuladen der Seite.

Und aus dieser Rich-Desktop-Methode stammt wahrscheinlich auch das zweite Akronym: MVVM. Lassen Sie sich nicht von den Buchstaben täuschen, vom Weglassen des C. Controller sind immer noch da. Das müssen sie auch sein. Nichts wird entfernt. Wir fügen nur eine Sache hinzu: Zustandsabhängigkeit, Daten, die auf dem Client zwischengespeichert werden (und damit auch die Intelligenz, mit diesen Daten umzugehen). Diese Daten, im Wesentlichen ein Cache auf dem Client, werden nun "ViewModel" genannt. Sie ermöglichen eine reichhaltige Interaktivität. Und das war's.

  • MVC = Model, Controller, View = im Wesentlichen einseitige Kommunikation = geringe Interaktivität
  • MVVM = Modell, Controller, Cache, Ansicht = Zwei-Wege-Kommunikation = umfangreiche Interaktivität

Mit Flash, Silverlight und - vor allem - JavaScript hat das Web MVVM angenommen. Browser können nicht mehr zu Recht als Thin Clients bezeichnet werden. Sehen Sie sich ihre Programmierbarkeit an. Sehen Sie sich ihren Speicherverbrauch an. Sehen Sie sich die ganze Javascript-Interaktivität auf modernen Webseiten an.

Ich persönlich finde, dass diese Theorie und das Akronym Business leichter zu verstehen sind, wenn man sich ansieht, worauf sie sich in der konkreten Realität beziehen. Abstrakte Konzepte sind nützlich, vor allem, wenn sie an einer konkreten Sache demonstriert werden, so dass sich der Kreis schließen kann.

59 Stimmen

MVC ist nicht aus dem Web entstanden. Trygve Reenskaug führte MVC in den 1970er Jahren in Smalltalk-76 ein.

12 Stimmen

Selbst wenn es in "MVC wurde durch das Design von Webanwendungen populär gemacht" geändert würde. Ich würde argumentieren, dass es sich hierbei um eine Spekulation ohne ordnungsgemäße Quellenangabe handelt.

5 Stimmen

Arialdo: Danke, ich wusste nichts von Smalltalk-76. (Habe damals mit anderem Spielzeug gespielt. :) Spaß beiseite, es ist interessant, wie alt einige dieser Konzepte sind. - @Dan, was ich geschrieben habe, ist: "[MVC] gab es vielleicht schon vor [dem Web], aber erst durch das Web wurde es bei der Masse der Webentwickler bekannt." Ich denke immer noch, dass das richtig ist. Ich habe zwar kein Zitat dafür, aber ich glaube auch nicht, dass ich eins brauche, denn die massenhafte Verbreitung von MVC ist Teil meiner persönlichen Erfahrung, als ich Anfang des letzten Jahrzehnts als Webentwickler anfing. Damals war Apache Struts en vogue, mit vielen Beans für MVC.

183voto

TStamper Punkte 29478

MVVM Modell-Ansicht AnsichtModell ist ähnlich wie MVC, Modell-Ansicht-Controller

Der Controller wird ersetzt durch eine ViewModel . Das ViewModel befindet sich unterhalb der UI-Schicht. Das ViewModel stellt die Daten und Befehlsobjekte zur Verfügung, die die Ansicht benötigt. Man könnte es als ein Container-Objekt betrachten, aus dem die View ihre Daten und Aktionen bezieht. Das ViewModel bezieht seine Daten aus dem Model.

Russel Ost führt einen Blog, in dem ausführlicher diskutiert wird Warum ist MVVM ist anders als MVC

95 Stimmen

Der Satz "Der Controller wird durch ein View Model ersetzt" ist nicht korrekt. In MVVM, was die Rolle des Controllers ist die Datenbindung (oder Bindung durch Konvention, wenn Sie das verwenden).

10 Stimmen

MVVM ist nur sinnvoll, wenn die Zwei-Wege-Datenbindung von WPF verwendet wird. Andernfalls MVC/MVP usw. wäre ausreichend.

0 Stimmen

@Jeff würde MVVM nicht auch für JavaFX Script gelten?

102voto

Chris Ballance Punkte 32892

Zum einen ist MVVM eine Weiterentwicklung des MVC-Musters, das XAML für die Darstellung verwendet. Dieser Artikel skizziert einige der Facetten der beiden.

Die Hauptaussage der Model/View/ViewModel-Architektur scheint zu sein, dass es über den Daten ("das Model") eine weitere Schicht nicht-visueller Komponenten ("das ViewModel") gibt, die die Konzepte der Daten genauer auf die Konzepte der Ansicht der Daten ("die View") abbilden. Es ist das ViewModel, an das sich die View bindet, nicht das Model direkt.

25 Stimmen

Ich denke, der von Ihnen zitierte Absatz fasst es IMHO gut zusammen. Ein Aspekt des ViewModel ist, dass es eine abgeflachte/veränderte Version des Modells für die Ansicht ist. Viele andere MV*-Muster binden gegen das real Modell.

2 Stimmen

"Viele andere MV*-Muster binden wieder das echte Modell"? Wirklich? Ich dachte, die Ansicht sollte immer an den Controller in MVC binden, egal was.

10 Stimmen

Nocturne: Im klassischen MVC hat die View nicht viel mit dem Controller zu tun, sie ist hauptsächlich an das Model gebunden. Stellen Sie sich einen Roboter vor - Model repräsentiert die Position der Gelenke des Roboters, View ist ein LCD-Monitor, auf dem Sie den Roboter sehen, Controller ist z.B. eine Tastatur. In einem solchen Setup hängt View vom Model ab, d.h. die räumliche Position des Roboters, die Sie auf dem Monitor sehen können, ist eine direkte Darstellung des Models.

60voto

Mat Punkte 7528

Microsoft lieferte eine Erklärung des MVVM-Musters in der Windows-Umgebung hier .

Hier ist ein wichtiger Abschnitt:

Beim Model-View-ViewModel-Entwurfsmuster besteht eine Anwendung aus drei allgemeinen Komponenten. enter image description here

  • Modell : Dies stellt das Datenmodell dar, das Ihre Anwendung nutzt. In einer App zur gemeinsamen Nutzung von Bildern könnte diese Schicht zum Beispiel die Menge der auf einem Gerät verfügbaren Bilder und die API zum Lesen und in die Bildbibliothek zu lesen und zu schreiben.

  • Siehe : Eine Anwendung besteht in der Regel aus mehreren Seiten der Benutzeroberfläche. Jede Seite, die dem Benutzer angezeigt wird, ist in der MVVM-Terminologie eine Ansicht. Die Ansicht ist der XAML-Code, der zur Definition und Gestaltung dessen, was der Benutzer sieht, verwendet wird. Die Daten aus dem Modell werden dem Benutzer angezeigt, und es ist die Aufgabe des ViewModel, die Benutzeroberfläche mit diesen Daten zu füttern, basierend auf dem aktuellen Zustand der App. In einer App zur gemeinsamen Nutzung von Bildern wären die Views zum Beispiel die UI die dem Benutzer die Liste der Alben auf dem Gerät zeigt, die Bilder in einem Album, und vielleicht eine weitere, die dem Benutzer ein bestimmtes Bild zeigt.

  • ViewModel : Das ViewModel verbindet das Datenmodell, oder einfach das Modell, mit der Benutzeroberfläche oder den Ansichten der Anwendung. Es enthält die Logik Logik, mit der die Daten des Modells verwaltet werden, und stellt die Daten als einen Satz von Eigenschaften, an die sich die XAML-Benutzeroberfläche bzw. die Ansichten binden können. Ein Beispiel, in einer App zur gemeinsamen Nutzung von Bildern würde das ViewModel eine Liste von Alben anzeigen, und für jedes Album eine Liste von Bildern anzeigen. Die UI ist unabhängig davon woher die Bilder kommen und wie sie abgerufen werden. Sie weiß einfach eine Reihe von Bildern, wie sie vom ViewModel bereitgestellt werden, und zeigt sie dem Benutzer an.

8 Stimmen

Beachten Sie, dass, während Artikel referenziert gilt für die Entwicklung mit dem Microsoft Stack - insbesondere Windows Phone - und XAML, es ist nicht zu sein.

3 Stimmen

Diese Antwort verdeutlicht das Problem mit dem Namen "MVVM" - es sollte "VVMM" oder "MVMV" heißen - M-V-VM hat die Beziehungen völlig verkehrt herum!

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