c# - unterschied - xamarin mvvm vs mvc




Vorteile von MVVM gegenüber MVC (4)

Es ist eine sehr schlanke Unterscheidung, die ich am besten durch den Vergleich von MVC in ASP.NET und MVVM in WPF erklären kann.

In ASP.NET MVC kommt die Anfrage vom Webserver und wird direkt vom Controller verarbeitet. Der Controller ermittelt die entsprechende Ansicht und füllt sie mit Modellen. Der Controller gibt diese Instanzen dann an das zugrunde liegende System frei, das ein Ergebnis an den Client übermittelt. Sie können sehen, dass der Controller zuerst und zuletzt handelt.

In MVVM steht die Benutzeroberfläche (die Ansicht) dem Benutzer gegenüber und nimmt Benutzereingaben direkt vor. Innerhalb der View werden Befehle innerhalb des ViewModel (der DataContext der View) durch diese Aktivität ausgelöst. Die Steuerung fließt zum ViewModel, das interpretiert, was die View gesendet hat, und bereitet ihre Modelle vor. Nachdem die Kontrolle wieder in die Ansicht zurückkehrt, aktualisiert sie sich entsprechend den Änderungen in den Modellen. Wenn eine neue Ansicht erforderlich ist, kommuniziert das ViewModel diese mit dem NavigationService (oder welcher Navigationsmethode auch immer Ihre Anwendung verwendet), was der Bereich der Window- oder Frame-UI-Komponenten ist. Sie können sehen, dass das ViewModel nicht zuerst und zuletzt aktiv ist. Die Ansicht spielt eine viel größere Rolle als in MVC.

Die Architektur von WPF / Silverlight ist der Grund, warum Dinge so gemacht werden. Die Befehls-, Binde- und Navigationsinfrastrukturen können nicht vom Controller gesteuert / ersetzt werden; Sie sind eng in die Benutzeroberfläche integriert. Daher muss der Controller unter der Ansicht sitzen und eine eher passive Rolle einnehmen.

Endlich habe ich eine Silverlight Entwicklung gemacht und bin auf MVVM gestoßen. Ich bin vertraut mit MVC und der Artikel, den ich gelesen habe, sagte wegen XAML, MVC würde nicht funktionieren. Nicht zu viel Erfahrung in XAML ist der Grund, warum ich diesen Punkt nicht bekommen habe.

Kann jemand erklären, warum MVC nicht geeignet ist und warum MVVM besser für die Entwicklung von Silverlight ist?

Danke JD


Ich denke, MVVM ist besser für XAML als für MVC geeignet. MVC 'ist nicht geeignet' zu sagen ist ein bisschen übertrieben.

Und warum ist MVVM besser? Hauptsächlich wegen der hervorragenden Datenbindung und Befehlsbindung in XAML. Siehe diesen Artikel .


Entkopplungskomponenten

In MVC haben Sie eine Dreiecksbeziehung zwischen den Komponenten. Das heißt: Der Controller besitzt die Ansicht und das Modell. Die Ansicht basiert auf der Definition des Modells. Das Modell muss die Anforderungen der Ansicht erfüllen. Denken Sie an einen Hub (Controller) und eine Spracharchitektur (Ansicht und Modell)

Denken Sie bei MVVM daran, dass sich dieses Dreieck abflacht, wobei jede Komponente nur über eine andere in der Kette weiß. Das heißt: Ansicht-> AnsichtModell-> Modell

Das Modell kennt nichts auf dem Stapel. Das ViewModel kennt nur das Modell. Die View kennt nur das View-Modell - es kennt das Model nicht.

Warum ist das wichtig?

Dies ist der Kern der ursprünglichen Frage.

Der Hauptzweck ist eine weitere Abstraktion Ihrer Architektur. Dies führt normalerweise zu etwas mehr Code, aber weniger Kontaktpunkten zwischen Objekten. Weniger Kontaktpunkte sind wichtig, da dies zu einem agileren Code führt. Je mehr Kupplung / Kontakt Klasse A mit Klasse B hat, desto mehr Einfluss hat eine Änderung der Klasse A. Die Auswirkungen von Veränderungen zu reduzieren, ist einer der Hauptvorteile einer guten Architektur.

Um dies vollständig zu verstehen, ist es hilfreich, darüber nachzudenken, was die Komponenten wirklich darstellen. Was ist eine Ansicht, ein Controller, ein ViewModel oder ein Model? Sind sie wörtliche Definitionen oder eher ein abstrakter Begriff?

Meiner Erfahrung nach war es vorteilhafter, das Modell als ein Cluster von Klassen / Objekten zu betrachten, die sich mit der Konstruktion und Persistenz von Daten befassen. Es ist nicht nur ein einfaches altes Objekt mit Eigenschaften. Es ist eine Klasse, die Datenabruf, Datenspeicherung, eine Fabrik ausführt, die Plain-Old-Objects erstellt. Es ist eine Fassadenschicht, die eine klare API in die Daten liefert. Soll diese Fassadenebene direkt aus der View referenziert werden?

Meiner Meinung nach sollte es nicht so sein. In MVC ist diese Antwort auch "Nein". Der Controller ruft Daten aus dem Modell ab. In dieser Hinsicht erreichen MVC und MVVM das gleiche Ziel. Wo die zwei Architekturen sich unterscheiden, ist, wie die Daten und die Ansicht verknüpft sind.

Wie das Modell kann die Ansicht eine Sammlung von Klassen sein, die in Koordination miteinander eine Präsentationsansicht wiedergeben. Dies könnte bei mobilen Plattformen (View Controller auf iOS, Activity auf Android) aus einem View Controller + View bestehen. In vielen Fällen benötigen Sie eine Klasse, um ein Ansichtsdokument in den Arbeitsspeicher zu laden und die Ansichtseigenschaften zu aktualisieren. Hier gibt es viel zu tun. In MVC wird der Controller schnell zu einer "Küchenspüle" -Klasse - eine Art Mülldeponie für alles, was mit dem aktuellen Benutzerkontext zusammenhängt.

Wenn Sie dies über Dutzende potenzieller Ansichten in Ihrer Anwendung multiplizieren, haben Sie eine große Abhängigkeit zwischen Ihrem Back-End-Modellcode und Ihrem Front-End-View-Code. Bei großen Controller-Klassen sind diese Abhängigkeiten nicht sofort ersichtlich.

Reduzieren Sie Ihre Abhängigkeiten

MVVM flacht die Abhängigkeiten ab. Dies schafft den Fokus. Was ist Fokus? Die Fähigkeit, an einem einzigen Teil der Funktionalität zu arbeiten, ohne von allen anderen Abhängigkeiten abzulenken. Jetzt können Sie Komponententests mit Code beginnen, der zuvor als nicht testbar galt.

Das Ansichtsmodell fungiert als Fassade zwischen der Ansicht und dem Modell. Das Ansichtsmodell entspricht den Anforderungen der Ansicht - technisch sollte die Ansicht das Ansichtsmodell besitzen. Wenn die Ansicht Daten aus mehreren Quellen benötigt, kapselt das Ansichtsmodell die Zusammensetzung separater Datenquellen in ein einzelnes, vereinheitlichtes, nicht normalisiertes Objekt ein. Wenn die Ansicht in das Modell oder andere Ziele zurückrufen muss, stellt das Ansichtsmodell Hooks bereit und leitet den entsprechenden Aufruf weiter.

Überlegen Sie, wie ein Netzwerk-Patch-Panel funktioniert. Auf den ersten Blick scheint dies überflüssig zu sein - warum verdrahten Sie nicht einfach Ihr Ethernet von Punkt A zu Punkt B. Aber mit Erfahrung werden Sie verstehen, dass ein Patch-Panel Ihnen ein Schlüsselstück der Abstraktion bietet, mit dem Sie die Routen von Point ändern können B, ohne den Punkt A zu beeinflussen. Dies ist, was Ihr View-Modell macht.

Jetzt, wo Sie eine saubere Abstraktion zwischen Ihrer Ansicht und Ihrem Modell haben, sollte die Konsequenz sein, dass Ihr View / Controller nur mit der Präsentation befasst ist. Dies bedeutet, dass es sich nicht um Lokalisierung oder Formatierung handeln sollte - es erhält Daten und präsentiert Daten. Ihr View-Modell ist ein idealer Ort, um diese Art von Pre-View-Daten zu massieren. Nehmen wir an, Sie müssen Daten anhand eines Kriteriums filtern. Auch hier ist das View-Modell mit den Modelldaten vertraut (Ihre Ansicht ist es nicht) und eignet sich hervorragend, um diese Art von Code zu platzieren.

Sobald Sie beginnen, Ihre Anwendungsanforderungen auf diese Weise zu organisieren, wird Ihr View / Controller-Code sauberer und wenn sich etwas ändern muss, sind die Auswirkungen offensichtlicher, was zu weniger Fehlern führt.

Testbarkeit

Ein letzter Hinweis zur Testbarkeit: Durch die Abflachung von Abhängigkeiten erleichtert es das Einfügen von Scheinabhängigkeiten in Ihre Tests. Es macht das Testen einfacher und prägnanter. Ihr View-Modell wird zu etwas, für das Sie klare Testfälle definieren können.


MVVM wurde hauptsächlich wegen XAML entwickelt und um Datenbindung noch einfacher zu machen, ist es MVP sehr ähnlich. Die Hauptvorteile sind eine einfachere Möglichkeit, die Benutzeroberfläche zu manipulieren (das ViewModel oder Presenter kümmert sich um diese Aufgabe, anstatt dass das Model Ereignisse in die Ansicht abfeuern muss, nachdem es vom Controller manipuliert wurde).

Die besten zwei Artikel, die ich gefunden habe, die mir geholfen haben zu verstehen, sind die Prinzipien MVC vs MVP MVVM und MVVM für Tatred Folks Like Me oder MVVM und was es für mich bedeutet





silverlight