Frage Was ist der Unterschied zwischen MVC und MVVM?


Gibt es einen Unterschied zwischen dem standardmäßigen "Model View Controller" -Muster und dem Microsoft Model / View / ViewModel-Muster?


1097
2018-03-20 20:09


Ursprung


Antworten:


MVC / MVVM ist kein entweder oder Wahl.

Die beiden Muster treten sowohl bei ASP.Net als auch bei Silverlight / WPF auf unterschiedliche Weise auf.

Für ASP.Net wird MVVM verwendet Zwei-Wege-Bindung Daten in Ansichten. Dies ist normalerweise eine clientseitige Implementierung (z. B. mit Knockout.js). MVC auf der anderen Seite ist eine Möglichkeit, Bedenken zu trennen auf der Serverseite.

Für Silverlight und WPF ist das MVVM-Muster umfassender und kann erscheinen als Ersatz für MVC (oder andere Formen der Organisation von Software in separate Verantwortlichkeiten). Eine Annahme, die häufig aus diesem Muster hervorging, war, dass die ViewModel einfach ersetzt den Controller in MVC (als ob du nur ersetzen könntest) VM zum C im Akronym und alles wäre vergeben) ...

Das ViewModel tut das nicht Ersetzen Sie unbedingt die Notwendigkeit für separate Controller.

Das Problem ist, dass ein View-Modell unabhängig davon, ob es testbar * und vor allem wiederverwendbar ist, wenn es benötigt wird, keine Ahnung hat, welche Ansicht es anzeigt, aber noch wichtiger keine Ahnung, wo seine Daten herkommen.

* Hinweis: In der Praxis entfernen Controller den Großteil der Logik aus dem ViewModel, für die Komponententests erforderlich sind. Die VM wird dann zu einem dummen Container, der nur wenig Tests erfordert. Dies ist eine gute Sache, da die VM nur eine Brücke zwischen dem Designer und dem Programmierer ist, sollte also einfach gehalten werden.

Auch in MVVM enthalten Controller normalerweise die gesamte Verarbeitungslogik und entscheiden, welche Daten in welchen Ansichten mit welchen Ansichtsmodellen angezeigt werden sollen.

Von dem, was wir bisher gesehen haben, ist der Hauptvorteil des ViewModel-Patterns, Code aus XAML-Code-Behind zu entfernen XAML-Bearbeitung eine unabhängigere Aufgabe zu machen. Wir erstellen nach wie vor Controller, um bei Bedarf die Gesamtlogik unserer Anwendungen zu kontrollieren.

Die grundlegenden MVCVM Richtlinien, die wir befolgen, sind:

  • Ansichten zeige eine bestimmte Form von Daten an. Sie haben keine Ahnung, woher die Daten stammen.
  • Ansichtsmodelle Halten Sie eine bestimmte Form von Daten und BefehlenSie wissen nicht, woher die Daten oder der Code stammen oder wie er angezeigt wird.
  • Modelle halte die tatsächlichen Daten (verschiedene Kontexte, Speicher oder andere Methoden)
  • Controller überwachen und veröffentlichen Ereignisse. Controller bieten die Logik, die steuert, welche Daten wo gesehen werden. Controller stellen dem ViewModel den Befehlscode zur Verfügung, sodass das ViewModel tatsächlich wiederverwendbar ist.

Wir haben auch bemerkt, dass der Skulptur Code-Gen-Framework implementiert MVVM und ein ähnliches Muster wie Prism UND verwendet außerdem Controller, um die gesamte Anwendungsfalllogik zu trennen.

Gehen Sie nicht davon aus, dass Controller durch View-Modelle veraltet sind.

Ich habe einen Blog zu diesem Thema gestartet, dem ich hinzufügen werde, wenn ich es kann. Es gibt Probleme bei der Kombination von MVCVM mit den gängigen Navigationssystemen, da die meisten Navigationssysteme nur Ansichten und VMs verwenden, aber ich werde in späteren Artikeln darauf eingehen.

Ein zusätzlicher Vorteil der Verwendung eines MVCVM-Modells ist, dass Nur die Controller-Objekte müssen für die Lebensdauer der Anwendung im Speicher vorhanden sein und die Steuerungen enthalten hauptsächlich Code- und kleine Zustandsdaten (d. h. winzigen Speicheraufwand). Dies macht weniger speicherintensive Apps als Lösungen, in 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 die gelegentlich zwischengespeicherten VMs für die Reaktionsfähigkeit möglicherweise noch behalten müssen.

Hinweis: Dieser Beitrag wurde mehrfach bearbeitet und hat nicht gezielt auf die gestellte Frage abgezielt. Daher habe ich den ersten Teil aktualisiert, um diesen nun auch zu behandeln. Ein Großteil der Diskussion bezieht sich im Folgenden 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 vermeiden, dass Leute Controller mit ViewModels ersetzen.


578
2017-08-22 09:19



Ich denke, der einfachste Weg zu verstehen, was diese Akronyme bedeuten sollen, ist, sie für einen Moment zu vergessen. Denken Sie stattdessen an die Software, mit der sie entstanden sind. Es läuft wirklich nur auf den Unterschied zwischen dem frühen Web und dem Desktop hinaus.

Das erste Akronym, MVC, entstand im Internet. (Ja, es war vielleicht schon einmal da, aber das Web ist, wie es den Massen von Webentwicklern bekannt wurde.) Denken Sie an Datenbanken, HTML-Seiten und Code dazwischen. Lassen Sie uns das ein wenig verfeinern, um zu MVC zu kommen: Für »Datenbank« nehmen wir Datenbank plus Schnittstellencode an. Für »HTML-Seiten« gehen wir von HTML-Templates plus Template-Processing-Code aus. Nehmen wir an, dass Code-Mapping-Benutzer bei »Code dazwischen« auf Aktionen klicken, die sich möglicherweise auf die Datenbank auswirken, wodurch auf jeden Fall eine andere Ansicht angezeigt wird. Das ist es, zumindest für den Zweck dieses Vergleichs.

Lassen Sie uns ein Feature dieses Web-Materials beibehalten, nicht so wie es heute ist, sondern wie es vor zehn Jahren noch existierte, als Javascript eine niederträchtige, abscheuliche Belästigung war, die echte Programmierer gut mieden: Die HTML-Seite ist im Wesentlichen dumm und passiv . Der Browser ist ein Thin-Client oder, wenn Sie so wollen, ein schlechter Client. Es gibt keine Intelligenz im Browser. Vollständige Seite lädt Regel neu. Der »View« wird jedes Mal neu erzeugt.

Erinnern wir uns, dass dieser Web-Weg, trotz aller Wut, im Vergleich zum Desktop furchtbar rückständig war. Desktop-Apps sind Fat Clients oder Rich Clients, wenn Sie so wollen. (Sogar ein Programm wie Microsoft Word kann als eine Art Client, ein Client für Dokumente, angesehen werden.) Sie sind Clients voller Intelligenz, voller Wissen über ihre Daten. Sie sind Stateful. Sie cachen Daten, die sie im Speicher verarbeiten. Kein solcher Mist wie ein kompletter Seiten-Reload.

Und diese reiche Desktop-Art ist wahrscheinlich, wo das zweite Akronym entstand, MVVM. Lassen Sie sich nicht durch die Buchstaben täuschen, durch das Weglassen der C. Controller sind immer noch da. Sie müssen sein. Nichts wird entfernt. Wir fügen nur eine Sache hinzu: Statushaftigkeit, Daten, die auf dem Client zwischengespeichert wurden (und damit Intelligenz, um mit diesen Daten umzugehen). Diese Daten, im Wesentlichen ein Cache auf dem Client, heißen nun »ViewModel«. Es ermöglicht intensive Interaktivität. Und das ist es.

  • MVC = Modell, Controller, Ansicht = im Wesentlichen Einwegkommunikation = schlechte Interaktivität
  • MVVM = Modell, Controller, Cache, Ansicht = Zweiwegkommunikation = reiche Interaktivität

Wir können sehen, dass mit Flash, Silverlight und - am wichtigsten - Javascript, das Web MVVM angenommen hat. Browser können nicht mehr legal als Thin Clients bezeichnet werden. Schau auf ihre Programmierbarkeit. Schau dir ihren Speicherverbrauch an. Betrachten Sie die gesamte Javascript-Interaktivität auf modernen Webseiten.

Persönlich finde ich dieses Theorie- und Akronym-Geschäft leichter zu verstehen, wenn ich mir ansehe, worauf es in der konkreten Realität Bezug nimmt. Abstrakte Konzepte sind nützlich, besonders wenn sie auf konkreter Materie gezeigt werden, so dass das Verständnis den Kreis schließt.


213
2018-02-13 14:11



MVVM  Modellansicht ViewModel ist MVC ähnlich, Model View Controller

Der Controller wird ersetzt durch a Ansichtsmodell. Das ViewModel befindet sich unterhalb der UI-Ebene. Das ViewModel macht die Daten und Befehlsobjekte verfügbar, die die Ansicht benötigt. Sie könnten sich das als ein Containerobjekt vorstellen, von dem die Daten und Aktionen abgerufen werden. Das ViewModel ruft seine Daten aus dem Modell ab.

Russel Osten ein Blog, der ausführlicher diskutiert Warum unterscheidet sich MVVM von MVC?


166
2018-03-20 20:18



Zum einen ist MVVM eine Weiterentwicklung des MVC-Musters, das XAML verwendet, um die Anzeige zu handhaben. Dieser Artikel umreißt einige der Facetten der beiden.

Der Hauptgrund für die Model / View / ViewModel-Architektur scheint zu sein, dass zusätzlich zu den Daten ("das Modell") eine weitere Schicht nicht-visueller Komponenten ("ViewModel") die Konzepte der Daten genauer abbildet zu den Konzepten der Ansicht der Daten ("die Ansicht"). Es ist das ViewModel, an das die Ansicht gebunden ist, nicht das Model direkt.


85
2018-03-20 20:17



Sie können Siehe eine Erklärung des MVVM-Patterns in der Windows-Umgebung:

Im Designmodell "Model-View-ViewModel" besteht eine App aus drei allgemeinen Komponenten. enter image description here

  • Modell: Dies ist das Datenmodell, das Ihre App verwendet. In einer Picture-Sharing-App könnte diese Ebene beispielsweise den Satz von Bildern darstellen, die auf einem Gerät verfügbar sind, und die API, die zum Lesen und Schreiben in die Bildbibliothek verwendet wird.

  • Aussicht: Eine App besteht normalerweise aus mehreren UI-Seiten. Jede Seite, die dem Benutzer angezeigt wird, ist eine Ansicht in der MVVM-Terminologie. Die Ansicht ist der XAML-Code, mit dem definiert und formatiert wird, was der Benutzer sieht. Die Daten aus dem Modell werden dem Benutzer angezeigt, und es ist die Aufgabe des ViewModel, die Benutzeroberfläche anhand des aktuellen Status der App mit diesen Daten zu versorgen. In einer Bildfreigabe-App sind die Ansichten beispielsweise die Benutzeroberfläche, die dem Benutzer die Liste der Alben auf dem Gerät, die Bilder in einem Album und möglicherweise eine andere zeigt, die dem Benutzer ein bestimmtes Bild zeigt.

  • Ansichtsmodell: Das ViewModel verknüpft das Datenmodell oder einfach das Modell mit der Benutzeroberfläche oder den Ansichten der App. Es enthält die Logik, mit der die Daten aus dem Modell verwaltet werden, und legt die Daten als eine Gruppe von Eigenschaften offen, an die die XAML-Benutzerschnittstelle oder die Ansichten binden können. In einer Picture-Sharing-App würde das ViewModel beispielsweise eine Liste von Alben anzeigen und für jedes Album eine Liste mit Bildern bereitstellen. Die Benutzeroberfläche ist unabhängig davon, woher die Bilder stammen und wie sie abgerufen werden. Es kennt einfach eine Reihe von Bildern, die vom ViewModel bereitgestellt werden, und zeigt sie dem Benutzer an.


44
2018-06-12 20:48



Ich dachte einer der Hauptunterschiede war, dass Ihr V in MVC Ihr M direkt liest und über das C die Daten manipuliert, während in MVVM Ihre VM als M-Proxy agiert und Ihnen die verfügbare Funktionalität zur Verfügung stellt V.

Wenn ich nicht voller Junk bin, bin ich überrascht, dass niemand einen Hybrid geschaffen hat, bei dem Ihre VM nur ein M-Proxy ist und C alle Funktionen bietet.


35
2018-05-21 11:38



Einfacher Unterschied: (Inspiriert von Yaakov Coursera AngularJS natürlich)

enter image description here

MVC (Model View Controller)

  1. Modelle: Modelle enthalten Dateninformationen. Aufruf oder Verwendung von Controller und View nicht. Enthält die Geschäftslogik und Möglichkeiten zur Darstellung von Daten. Einige dieser Daten können in irgendeiner Form in der Ansicht angezeigt werden. Es kann auch Logik enthalten, um die Daten von einer Quelle abzurufen.
  2. Regler: Fungiert als die Verbindung zwischen Sicht und Modell. Anrufe anzeigen Controller und Controller rufen das Modell auf. Es informiert im Wesentlichen das Modell und / oder die Sichtweise, um sich entsprechend zu ändern.
  3. Aussicht: Angebote mit UI-Teil. Interagiert mit dem Benutzer.

MVVM (Modellansicht Modell anzeigen)

Ansichtsmodell:

  1. Es ist die Darstellung des Zustandes der Ansicht.
  2. Es enthält die Daten, die in der Ansicht angezeigt werden.
  3. Reagiert auf die Anzeige von Ereignissen, auch bekannt als Präsentationslogik.
  4. Ruft andere Funktionalitäten für die Verarbeitung von Geschäftslogik auf.
  5. Niemals die Ansicht direkt anfragen, um etwas anzuzeigen.

17
2017-12-14 00:20



MVVM ist eine Verfeinerung (diskutabel) der Präsentationsmodell Muster. Ich sage fragwürdig, weil der einzige Unterschied darin besteht, wie WPF die Möglichkeit bietet, Daten zu binden und Befehle zu handhaben.


16
2018-03-27 21:22



Das Viewmodel ist ein "abstraktes" Modell für Ihre Benutzeroberflächenelemente. Es muss Ihnen ermöglichen, die Befehle und Aktionen in Ihrer Ansicht auf nicht-visuelle Weise auszuführen (zum Beispiel um es zu testen).

Wenn Sie mit MVC gearbeitet haben, haben Sie wahrscheinlich irgendwann nützlich gefunden, um Modellobjekte zu erstellen, die den Zustand Ihrer Ansicht widerspiegeln, z. B. um einige Bearbeitungsdialoge usw. ein- und auszublenden. In diesem Fall verwenden Sie ein Ansichtsmodell.

Das MVVM-Muster ist einfach die Verallgemeinerung dieser Praxis auf alle UI-Elemente.

Und es ist kein Microsoft-Muster, was daran liegt, dass WPF / Silverlight-Datenbindungen besonders gut geeignet sind, um mit diesem Muster zu arbeiten. Aber nichts hält Sie davon ab, es zum Beispiel mit Java-Server-Faces zu verwenden.


13
2018-03-23 10:16