Gibt es einen Unterschied zwischen dem Standardmuster "Model-View-Controller" und dem Model/View/ViewModel-Muster von Microsoft?
Beste Erklärung
Gibt es einen Unterschied zwischen dem Standardmuster "Model-View-Controller" und dem Model/View/ViewModel-Muster von Microsoft?
MVVM
Daten Bindung : Wir erstellen Listener für ViewModel-Eigenschaften, so dass Daten von der Ansicht zum Modell über das Ansichtsmodell fließen können. Während die Referenzen in eine Richtung gehen: View ViewModel Model, müssen die Daten fließen: Ansicht AnsichtModell Modell. Es ist klar, wie die Ansicht Daten aus dem Modell erhält, indem sie ihre eigenen Eigenschaften liest. Data Binding ist die Art und Weise, wie Ereignisse innerhalb der Ansicht erkannt und an das Modell zurückgegeben werden.
class CustomView: UIView { var viewModel = MyViewModel { didSet { self.color = viewModel.viewColor } }
convenience init(viewModel: MyViewModel) { self.viewModel = viewModel } }
struct MyViewModel { var viewColor: UIColor { didSet { colorChanged?() // This is where the binding magic happens. } }
var colorChanged: ((UIColor) -> Void)? }
class MyViewController: UIViewController {
let myViewModel = MyViewModel(viewColor: .green) let customView: CustomView!
override func viewDidLoad() { super.viewDidLoad()
// This is where the binder is assigned.
myViewModel.colorChanged = { [weak self] color in
print("wow the color changed")
}
customView = CustomView(viewModel: myViewModel)
self.view = customView
} }
Unterschiede im Aufbau
Gemeinsame Merkmale
Vorteile von MVVM
Vorteile von MVC
Kurz gesagt: In MVC kennt der Controller die (Controls) View, während in MVVM das ViewModel nicht weiß, wer es konsumiert. Das ViewModel stellt seine beobachtbaren Eigenschaften und Aktionen jedem zur Verfügung, der daran interessiert ist, es zu benutzen. Diese Tatsache macht das Testen einfacher, da es innerhalb des ViewModels keinen Verweis auf die Benutzeroberfläche gibt.
Nun, im Allgemeinen wird MVC in der Web-Entwicklung verwendet und MVVM ist in der WPF/Silverlight-Entwicklung am beliebtesten. Doch manchmal die Web-Architecute könnte eine Mischung aus MVC und MVVM haben.
Zum Beispiel: Sie könnten verwenden knockout.js und in diesem Fall werden Sie MVVM auf Ihrer Client-Seite haben. Und die Serverseite Ihrer MVC kann sich auch ändern. In komplexen Anwendungen verwendet niemand das reine Model. Es könnte sinnvoll sein, ein ViewModel als "Model" von MVC zu verwenden und Ihr echtes Model wird im Grunde ein Teil dieser VM sein. Dies gibt Ihnen eine zusätzliche Abstraktionsschicht.
Der Controller wird in MVVM nicht durch ein ViewModel ersetzt, denn das ViewModel hat eine ganz andere Funktionalität als ein Controller. Sie brauchen immer noch einen Controller, denn ohne einen Controller werden Ihr Model, ViewModel und View nicht viel tun... In MVVM haben Sie auch einen Controller, der Name MVVM ist einfach irreführend.
MVVMC ist meiner bescheidenen Meinung nach die richtige Bezeichnung.
Wie Sie sehen können, ist das ViewModel nur eine Ergänzung zum MVC-Muster. Es verlagert die Konvertierungslogik (z. B. Konvertierung eines Objekts in einen String) vom Controller zum ViewModel.
MVVMC, oder vielleicht MVC+, scheint ein praktikabler Ansatz sowohl für die Unternehmens- als auch für die schnelle Anwendungsentwicklung zu sein. Es ist zwar schön, die Benutzeroberfläche von der Geschäfts- und Interaktionslogik zu trennen, aber das "reine" MVVM-Muster und die meisten verfügbaren Beispiele funktionieren am besten mit einzelnen Ansichten.
Ich weiß nicht, wie es bei Ihnen aussieht, aber die meisten meiner Anwendungen enthalten Seiten und mehrere (wiederverwendbare) Ansichten, so dass die ViewModels bis zu einem gewissen Grad interagieren müssen. Die Seite als Controller zu verwenden, würde den Zweck des MVVM völlig zunichte machen, so dass ein Verzicht auf einen "VM-C"-Ansatz für die zugrunde liegende Logik zu nun ja herausfordernden Konstrukten führen könnte, wenn die Anwendung reift. Selbst in VB-6 haben die meisten von uns wahrscheinlich aufgehört, Geschäftslogik in das Button-Ereignis zu kodieren, und angefangen, Befehle an einen Controller weiterzuleiten, oder? Ich habe mir vor kurzem viele neue Rahmenwerke zu diesem Thema angesehen; mein Favorit ist eindeutig der Magellan-Ansatz (bei codeplex). Viel Spaß beim Kodieren!
http://en.wikipedia.org/wiki/Model_View_ViewModel#References
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.
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.
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/