Zum Inhalt springen

„Model View ViewModel“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[ungesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Unzulässige externe Links aus Fließtext und Liste entfernt (wenn nur als Weblinks im entspr. Abschn. bzw. als EN zulässig); unerwünschte Fettschrift außerhalb Einleitung entfernt
Zeile 36: Zeile 36:
Elemente des MVVM-Musters beinhalten:
Elemente des MVVM-Musters beinhalten:


'''Model:''' Wie im klassischen [[Model View Controller|MVC]]-Muster bezieht sich das Modell entweder auf (a) ein Objektmodell, das den realen Zustandsinhalt repräsentiert (objektorientierter Ansatz), oder (b) die [[Schichtenarchitektur#Datenzugriffsschicht|Datenzugriffsschicht]], welche diesen Inhalt repräsentiert (datenzentrischer Ansatz).
''Model:'' Wie im klassischen [[Model View Controller|MVC]]-Muster bezieht sich das Modell entweder auf (a) ein Objektmodell, das den realen Zustandsinhalt repräsentiert (objektorientierter Ansatz), oder (b) die [[Schichtenarchitektur#Datenzugriffsschicht|Datenzugriffsschicht]], welche diesen Inhalt repräsentiert (datenzentrischer Ansatz).


'''View:''' Wie im klassischen [[Model View Controller|MVC]]-Muster bezieht sich die View auf alle Elemente, die durch die [[GUI]] angezeigt werden, etwa Schaltflächen, Fenster, Grafiken und andere Steuerelemente.
''View:'' Wie im klassischen [[Model View Controller|MVC]]-Muster bezieht sich die View auf alle Elemente, die durch die [[GUI]] angezeigt werden, etwa Schaltflächen, Fenster, Grafiken und andere Steuerelemente.


'''ViewModel:''' Das ViewModel ist ein “Modell der View”, was bedeutet, dass es eine Abstraktion der View ist, die auch der Datenbindung zwischen View und Model dient. Es könnte betrachtet werden als ein spezieller Aspekt eines Controllers (im [[Model View Controller|MVC]]-Muster) für die Datenbindung und -konvertierung, der Information vom Model zu solcher für die View konvertiert und Befehle von der View zum Model reicht. Das ViewModel legt öffentliche Properties, Befehle und Abstraktionen bloß.
''ViewModel:'' Das ViewModel ist ein “Modell der View”, was bedeutet, dass es eine Abstraktion der View ist, die auch der Datenbindung zwischen View und Model dient. Es könnte betrachtet werden als ein spezieller Aspekt eines Controllers (im [[Model View Controller|MVC]]-Muster) für die Datenbindung und -konvertierung, der Information vom Model zu solcher für die View konvertiert und Befehle von der View zum Model reicht. Das ViewModel legt öffentliche Properties, Befehle und Abstraktionen bloß.
Das ViewModel kann mit einem konzeptionellen Zustand der Daten verglichen werden, im Gegensatz zum realen Zustand der Daten im Model.<ref>Pete Weissbrod: [http://www.acceptedeclectic.com/2008/01/model-view-viewmodel-pattern-for-wpf.html Model-View-ViewModel Pattern for WPF: Yet another approach.] {{dead link}}</ref>
Das ViewModel kann mit einem konzeptionellen Zustand der Daten verglichen werden, im Gegensatz zum realen Zustand der Daten im Model.<ref>Pete Weissbrod: [http://www.acceptedeclectic.com/2008/01/model-view-viewmodel-pattern-for-wpf.html Model-View-ViewModel Pattern for WPF: Yet another approach.] {{dead link}}</ref>


'''Controller:''' Manche Referenzen für MVVM enthalten auch eine Controller-Schicht oder illustrieren, dass das ViewModel eine spezielle Funktionsmenge parallel zu einem Controller ist, während [http://karlshifflett.files.wordpress.com/2008/11/wpflobmvvm1.png andere dies nicht tun]. Der Unterschied ist ein Gebiet laufender Diskussionen hinsichtlich der Standardisierung des MVVM-Musters.
''Controller:'' Manche Referenzen für MVVM enthalten auch eine Controller-Schicht oder illustrieren, dass das ViewModel eine spezielle Funktionsmenge parallel zu einem Controller ist, während andere dies nicht tun. Der Unterschied ist ein Gebiet laufender Diskussionen hinsichtlich der Standardisierung des MVVM-Musters.


== Eine Implementierung des ViewModel ==
== Eine Implementierung des ViewModel ==
'''Snippet''': Hier eine simple Implementierung des Musters, die mittels [[Testgetriebene Entwicklung|TDD]] auf [[Windows_Presentation_Foundation|WPF]] [http://code.msdn.microsoft.com/How-to-implement-MVVM-71a65441 How to implement MVVM (Model-View-ViewModel) in TDD] auf [http://code.msdn.microsoft.com Code MSDN] realisiert wurde.
''Snippet'': Hier eine simple Implementierung des Musters, die mittels [[Testgetriebene Entwicklung|TDD]] auf [[Windows_Presentation_Foundation|WPF]] auf Code MSDN realisiert wurde.




Zeile 100: Zeile 100:
== Timeline ==
== Timeline ==


- November 2010 - Das Microsoft Patterns & Practices Team veröffentliche eine Anleitung für die Benutzung von MVVM unter dem Namen [http://microsoft.com/prism Prism v4].
- November 2010 - Das Microsoft Patterns & Practices Team veröffentliche eine Anleitung für die Benutzung von MVVM unter dem Namen Prism v4.


== Kritik ==
== Kritik ==
Zeile 107: Zeile 107:
== Quelloffene MVVM-Frameworks ==
== Quelloffene MVVM-Frameworks ==
<div class="references-1column">
<div class="references-1column">
* IdeaBlade: [http://cocktail.ideablade.com/ Cocktail]
* IdeaBlade: Cocktail
* Josh Smith: [http://mvvmfoundation.codeplex.com MVVM Foundation]
* Josh Smith: MVVM Foundation
* Sacha Barber: [http://cinch.codeplex.com Cinch.]
* Sacha Barber: Cinch.
* Daniel Vaughan: [http://www.calciumsdk.net Calcium SDK]
* Daniel Vaughan: Calcium SDK
* Karl Shifflett: [http://karlshifflett.wordpress.com Ocean]
* Karl Shifflett: Ocean
* Tony Sneed: [http://simplemvvmtoolkit.codeplex.com Simple MVVM Toolkit]
* Tony Sneed: Simple MVVM Toolkit
* Laurent Bugnion: [http://www.galasoft.ch/mvvm/getstarted/ MVVM Light Toolkit]
* Laurent Bugnion: MVVM Light Toolkit
* Eye.Soft: [http://hyperionsdk.codeplex.com Hyperion SDK]
* Eye.Soft: Hyperion SDK
* Lester Lobo: [http://coremvvm.codeplex.com/ CoreMVVM]
* Lester Lobo: CoreMVVM
* Paul Betts: [http://www.reactiveui.net ReactiveUI]
* Paul Betts: ReactiveUI
* Rob Eisenberg: [http://www.caliburnproject.org/ Caliburn}
* Rob Eisenberg: Caliburn
* Rob Eisenberg: [http://caliburnmicro.codeplex.com/ Caliburn Micro]
* Rob Eisenberg: Caliburn Micro
* William e Kempf: {http://wpfonyx.codeplex.com/ Onyx]
* William e Kempf: Onyx
* Peter O’Hanlon: [http://goldlight.codeplex.com/ GoldLight]
* Peter O’Hanlon: GoldLight
* jbe: [http://waf.codeplex.com WPF Application Framework (WAF)]
* jbe: WPF Application Framework (WAF)
* WPF Team: {http://wpf.codeplex.com/wikipage?title=WPF%20Model-View-ViewModel%20Toolkit&referringTitle=Home WPF Model-View-ViewModel Toolkit]
* WPF Team: WPF Model-View-ViewModel Toolkit
* Michael L Perry: [http://updatecontrols.codeplex.com/ Update Controls]
* Michael L Perry: Update Controls
* Steve Sanderson: [http://knockoutjs.com/documentation/observables.html KnockoutJS]
* Steve Sanderson: KnockoutJS
* Geert van Horrik: [http://catel.codeplex.com Catel]
* Geert van Horrik: Catel
* Jeremy Likness: [http://jounce.codeplex.com Jounce]
* Jeremy Likness: Jounce
* Xomega.Net: [http://xomfwk.codeplex.com Xomega Framework]
* Xomega.Net: Xomega Framework
* Marcus Egger, EPS Software: [http://codeframework.codeplex.com/ Code Framework]
* Marcus Egger, EPS Software: Code Framework
</div>
</div>


== Kostenlose MVVM-Frameworks ==
== Kostenlose MVVM-Frameworks ==
<div class="references-1column">
<div class="references-1column">
* Rhea NV (Visual Studio Partner): [http://www.vidyano.com Vidyano]
* Rhea NV (Visual Studio Partner): Vidyano
</div>
</div>


== Kommerzielle MVVM-Frameworks ==
== Kommerzielle MVVM-Frameworks ==
<div class="references-1column">
<div class="references-1column">
* Intersoft Solutions (Visual Studio Partner): [http://www.clientui.com ClientUI]
* Intersoft Solutions (Visual Studio Partner): ClientUI
</div>
</div>



Version vom 9. Juli 2012, 05:04 Uhr

Model View ViewModel (MVVM) ist ein Architekturmuster der Softwaretechnik, das von Microsoft stammt. Es ist eine Spezialisierung des Entwurfsmusters Presentation Model von Martin Fowler.[1] MVVM basiert zum größten Teil auf Model View Controller (MVC) und ist auf moderne UI-Entwicklungsplattformen (HTML5 [2][3], WPF, und Silverlight) ausgerichtet, bei denen es einen User Experience (i.e., User Interface) (UXi) Entwickler mit anderen Anforderungen als jenen eines eher traditionellen Entwicklers gibt (der sich z.B. in Richtung Geschäftslogik- und Back-End-Entwicklung orientiert). Das View-Model von MVVM ist ein Value Converter[4], was bedeutet, dass das View-Model dafür verantwortlich ist, die Datenobjekte des Modells derart bloßzulegen, dass sie einfach verwaltet und benutzt werden können. Insofern ist das View-Model eher Model als View, es wickelt die meiste – wenn nicht alle – Anzeigelogik des Views ab (wobei die Abgrenzung, welche Funktionen von welcher Schicht implementiert werden, ein Gegenstand laufender Diskussionen [5] und Untersuchungen ist).

MVVM wurde entworfen, um mittels der spezifischen Funktionen in WPF durch Entfernung praktisch alles Code-Behind von der View-Schicht[6] eine bessere Trennung der View-Schicht vom Rest zu ermöglichen. Statt View-Code zu schreiben, kann ein Designer die native WPF-Auszeichnungssprache XAML verwenden und Bindungen zum ViewModel erzeugen, die durch Anwendungsentwickler geschrieben und gewartet werden. Diese Rollentrennung erlaubt es Designern, eher einen Fokus auf die UX-Anforderungen zu legen, als auf Programmierung oder Geschäftslogik, wodurch die Schichten einer Anwendung in mehreren Arbeitsgruppen entwickelt werden können.

Geschichte

Microsoft MVP Josh Smith sagte[6]

"In 2005, John Gossman, currently one of the WPF and Silverlight Architects at Microsoft, unveiled the Model-View-ViewModel (MVVM) pattern on his blog. MVVM is identical to Fowler's Presentation Model, in that both patterns feature an abstraction of a View, which contains a View's state and behavior. Fowler introduced Presentation Model as a means of creating a UI platform-independent abstraction of a View, whereas Gossman introduced MVVM as a standardized way to leverage core features of WPF to simplify the creation of user interfaces. In that sense, I consider MVVM to be a specialization of the more general PM pattern, tailor-made for the WPF and Silverlight platforms."

In deutscher Übersetzung:

"2005 hat John Gossman, zurzeit einer der WPF- und Silverlight-Architekten bei Microsoft, das Model-View-ViewModel (MVVM) Muster auf seinem Blog enthüllt. MVVM ist mit Fowler's Presentation Model insofern identisch, als beide Muster eine Abstraktion der View aufweisen, die den Zustand und das Verhalten einer View beinhaltet. Fowler hat das Presentation Model vorgestellt als ein Mittel, um eine UI plattformunabhängige Abstraktion einer View zu erzeugen, wohingegen Gossman das MVVM als einen standardisierten Weg vorgestellt hat, die Kernfunktionen der WPF zu nutzen, um die Erzeugung von Benutzerschnittstellen zu vereinfachen. In diesem Sinne würde ich MVVM als eine Spezialisierung der allgemeineren PM-Muster auffassen, maßgeschneidert für die WPF- und Silverlight-Plattformen."

Das MVVM-Muster wurde erdacht, um WPF und Silverlight zu unterstützen, beides Komponenten, die 2006 mit dem .NET Framework 3.0 eingeführt wurden. Das Muster findet nun in allgemeinerer Form auch in anderen technologischen Bereichen Anwendung, ganz ähnlich wie bei den früheren Mustern MVC und Model View Presenter (MVP).

Mehrere Microsoft-Architekten, die an WPF und Avalon arbeiten, haben in Online-Medien ausführlich über das MVVM geschrieben, einschließlich dessen Schöpfer John Gossman, Microsoft MVP Josh Smith und Microsoft Program Manager Karl Shifflett.

So wie sich das Verständnis des Musters durch die Softwareindustrie verbreitet, dauert auch die Diskussion an, welche Werkzeuge entwickelt werden können um das Muster zu unterstützen, wo verschiedene Arten von unterstützendem Code platziert werden sollen, die beste Methode für die Datenbindung, wie Daten innerhalb des ViewModel bloßgelegt werden sollen, wie angebracht das Muster für Javascript ist, und so weiter.

Beschreibung

Allgemein gesagt[6][7][8] versucht das Model View ViewModel Muster, sowohl die Vorteile einer Trennung funktionaler Entwicklung (bereitgestellt durch MVC) als auch die Vorteile von XAML und der Windows Presentation Foundation zu nutzen, indem es Daten so weit zurück (so nahe am Modell) wie möglich bindet, während es das XAML, ViewModel und die Datenüberprüfungsfunktionen jeder Geschäftsebene benutzt, um jegliche eingehenden Daten zu validieren. Das Ergebnis ist, dass das Model und die Foundation so viel von den Operationen wie möglich antreiben, was den Bedarf nach Code-Behind minimiert, vor allem in der View.

Elemente des MVVM-Musters beinhalten:

Model: Wie im klassischen MVC-Muster bezieht sich das Modell entweder auf (a) ein Objektmodell, das den realen Zustandsinhalt repräsentiert (objektorientierter Ansatz), oder (b) die Datenzugriffsschicht, welche diesen Inhalt repräsentiert (datenzentrischer Ansatz).

View: Wie im klassischen MVC-Muster bezieht sich die View auf alle Elemente, die durch die GUI angezeigt werden, etwa Schaltflächen, Fenster, Grafiken und andere Steuerelemente.

ViewModel: Das ViewModel ist ein “Modell der View”, was bedeutet, dass es eine Abstraktion der View ist, die auch der Datenbindung zwischen View und Model dient. Es könnte betrachtet werden als ein spezieller Aspekt eines Controllers (im MVC-Muster) für die Datenbindung und -konvertierung, der Information vom Model zu solcher für die View konvertiert und Befehle von der View zum Model reicht. Das ViewModel legt öffentliche Properties, Befehle und Abstraktionen bloß. Das ViewModel kann mit einem konzeptionellen Zustand der Daten verglichen werden, im Gegensatz zum realen Zustand der Daten im Model.[9]

Controller: Manche Referenzen für MVVM enthalten auch eine Controller-Schicht oder illustrieren, dass das ViewModel eine spezielle Funktionsmenge parallel zu einem Controller ist, während andere dies nicht tun. Der Unterschied ist ein Gebiet laufender Diskussionen hinsichtlich der Standardisierung des MVVM-Musters.

Eine Implementierung des ViewModel

Snippet: Hier eine simple Implementierung des Musters, die mittels TDD auf WPF auf Code MSDN realisiert wurde.


Eine Implementierung des ViewModel in C#.

public class CustomerViewModel
	: ViewModelBase<CustomerViewModel>
{
	private readonly IDialogService dialogService;
	private Customer currentCustomer;
	private int i;

	public CustomerViewModel()
	{
		CustomerList = new ObservableCollection<Customer>();
		AddNewCustomer = new RelayCommand(PerformAddNewCustomer);
	}

	public CustomerViewModel(IDialogService dialogService)
		: this()
	{
		this.dialogService = dialogService;
	}

	public Customer CurrentCustomer
	{
		get { return currentCustomer; }

		set { SetProperty(ref currentCustomer, value, x => x.CurrentCustomer); }
	}

	public ObservableCollection<Customer> CustomerList
	{
		get;
		private set;
	}

	public ICommand AddNewCustomer { get; private set; }

	private void PerformAddNewCustomer()
	{
		CustomerList.Add(new Customer { Name = "Name" + i });
		i++;

		if (dialogService != null)
		{
			dialogService.Show("Customer added");
		}
	}
}

Timeline

- November 2010 - Das Microsoft Patterns & Practices Team veröffentliche eine Anleitung für die Benutzung von MVVM unter dem Namen Prism v4.

Kritik

Eine Kritik am Muster kommt vom MVVM-Schöpfer John Gossman selbst,[10] welcher darauf hinweist, dass man bei der Implementierung simpler UI-Operationen mittels MVVM mit Kanonen auf Spatzen schießt. Er legt auch dar, dass für große Anwendungen die Verallgemeinerung der View komplizierter wird. Außerdem illustriert er, dass schlecht verwaltete Datenbindung zu einem erheblichen Speicherbedarf der Anwendung führen kann.

Quelloffene MVVM-Frameworks

  • IdeaBlade: Cocktail
  • Josh Smith: MVVM Foundation
  • Sacha Barber: Cinch.
  • Daniel Vaughan: Calcium SDK
  • Karl Shifflett: Ocean
  • Tony Sneed: Simple MVVM Toolkit
  • Laurent Bugnion: MVVM Light Toolkit
  • Eye.Soft: Hyperion SDK
  • Lester Lobo: CoreMVVM
  • Paul Betts: ReactiveUI
  • Rob Eisenberg: Caliburn
  • Rob Eisenberg: Caliburn Micro
  • William e Kempf: Onyx
  • Peter O’Hanlon: GoldLight
  • jbe: WPF Application Framework (WAF)
  • WPF Team: WPF Model-View-ViewModel Toolkit
  • Michael L Perry: Update Controls
  • Steve Sanderson: KnockoutJS
  • Geert van Horrik: Catel
  • Jeremy Likness: Jounce
  • Xomega.Net: Xomega Framework
  • Marcus Egger, EPS Software: Code Framework

Kostenlose MVVM-Frameworks

  • Rhea NV (Visual Studio Partner): Vidyano

Kommerzielle MVVM-Frameworks

  • Intersoft Solutions (Visual Studio Partner): ClientUI

Siehe auch

Einzelnachweise

  1. Presentation Model
  2. Steve Sanderson: KnockoutJS. Abgerufen am 28. Mai 2012.
  3. Rafael Weinstein: Google mdv. Abgerufen am 28. Mai 2012.
  4. Google groups: Thought: MVVM eliminates 99% of the need for ValueConverters. Abgerufen am 28. Mai 2012.
  5. Google groups: Thought: MVVM eliminates 99% of the need for ValueConverters. Abgerufen am 28. Mai 2012.
  6. a b c Josh Smith: WPF Apps With The Model-View-ViewModel Design. Abgerufen am 28. Mai 2012.
  7. John Gossman: Tales from the Smart Client: Introduction to Model/View/ViewModel pattern for building WPF apps. (msdn.com).
  8. Karl Shifflett: Learning WPF M-V-VM. Abgerufen am 28. Mai 2012.
  9. Pete Weissbrod: Model-View-ViewModel Pattern for WPF: Yet another approach. Vorlage:Toter Link/!...nourl (Seite nicht mehr abrufbar.)
  10. John Gossman: Tales from the Smart Client: Advantages and disadvantages of M-V-VM. Abgerufen am 28. Mai 2012.