1478 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?

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

764voto

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.

350voto

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.

62 Stimmen

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

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

186voto

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

97 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?

104voto

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.

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

67voto

Ali Nem Punkte 4656

Die anderen Antworten sind für jemanden, der mit dem Thema Architekturmuster nicht sehr vertraut ist, vielleicht nicht leicht zu verstehen. Jemand, der neu in der App-Architektur ist, möchte vielleicht wissen, wie sich seine Wahl in der Praxis auf seine App auswirken kann und was es mit dem ganzen Trubel in den Communities auf sich hat.

Um etwas Licht ins Dunkel zu bringen, habe ich mir dieses Drehbuch mit MVVM, MVP und MVC ausgedacht. Die Geschichte beginnt damit, dass ein Benutzer auf die Schaltfläche "FINDEN" in einer Filmsuch-App klickt :

Benutzer: Klicken Sie

Siehe : Wer ist das? [ MVVM|MVP|MVC ]

Benutzer: Ich habe gerade auf die Suchschaltfläche geklickt

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

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

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

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

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

-- Dies ist der wichtigste Unterschied zwischen MVVM UND 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 ]

ViewModel : Danke, ich werde den Suchbegriff im Internet nachschlagen. Modell aber ich werde Sie nicht direkt aktualisieren. Stattdessen werde ich Ereignisse an searchResultsListObservable auslösen, wenn es ein Ergebnis gibt. Sie sollten das also besser beobachten. [ MVVM ]

(Bei der Beobachtung eines beliebigen Auslösers in searchResultsListObservable wird die Siehe ist der Meinung, dass dem Benutzer ein Fortschrittsbalken angezeigt werden sollte, da ViewModel würde nicht mit ihm darüber sprechen)

---------- ---------- ----------

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

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

( Modell macht eine Abfrage an die Filmdatenbank ) [ MVVM | MVP | MVC ]

( Nach einer Weile )

---- Dies ist der Schnittpunkt zwischen MVVM , MVP y MVC -----

Modell : Ich habe eine Liste für Sie gefunden, ViewModel | Präsentator Hier ist es in JSON "[{"name": "Klavierlehrer", "Jahr":2001},{"name": "Klavier", "Jahr":1993}]" [ MVVM | 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 Ich habe eine Liste mit passenden Ergebnissen für Sie gefunden und sie in ein vorzeigbares Format gebracht: ["Klavierlehrer 2001, "Klavier 1993"]. Bitte blenden Sie jetzt auch den Fortschrittsbalken aus [ MVP ]

Controller : Danke fürs Warten Siehe Ich habe Model nach Ihrer Suchanfrage gefragt. Es sagt, dass es eine Liste von übereinstimmenden Ergebnissen gefunden und sie in einer Variablen namens "searchResultsList" innerhalb seiner Instanz gespeichert hat. Sie können sie von dort abrufen. Bitte blenden Sie auch den Fortschrittsbalken aus [ MVC ]

ViewModel : Jeder Beobachter von searchResultsListObservable wird benachrichtigt, dass es diese neue Liste im vorzeigbaren Format gibt: ["Klavierlehrer 2001, "Klavier 1993"].[ MVVM ]

Siehe : Vielen Dank Moderatorin [ MVP ]

Siehe : Dankeschön " 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?)

Siehe : Oh, es gibt einen neuen Trigger in searchResultsListObservable , gut, es gibt eine vorzeigbare Liste, jetzt muss ich sie nur noch in einer Liste anzeigen. Ich sollte auch den Fortschrittsbalken ausblenden, jetzt wo ich das Ergebnis habe. [ MVVM ]

Falls Sie daran interessiert sind, habe ich eine Reihe von Artikeln geschrieben aquí Vergleich von MVVM, MVP und MVC anhand der Implementierung einer Android-Filmsuch-App.

4 Stimmen

Es gibt eine großartige Antwort unter all dem Geschmackstext hier... Mit etwas Formatierung und etwas Smalltalk zwischen den Komponenten könnte dies die beste Antwort auf dieser Seite sein.

1 Stimmen

Gut erklärt und hebt den grundlegenden Unterschied zwischen MVC und MVVM hervor

0 Stimmen

Die beste Erklärung, die ich bis jetzt gefunden habe!

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