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