Model-View-ViewModel (MVVM)
Architekturpattern zur Trennung von Darstellung, Logik und Zustandsverwaltung in UI-Anwendungen. Fördert Testbarkeit und Wiederverwendbarkeit von Komponenten.
Klassifikation
- KomplexitätMittel
- AuswirkungTechnisch
- EntscheidungstypArchitektur
- OrganisationsreifeFortgeschritten
Technischer Kontext
Prinzipien & Ziele
Use Cases & Szenarien
Kompromisse
- Übermäßige Komplexität durch falsch strukturierte ViewModels
- Verdeckung von Performance-Problemen durch zu viele Bindings
- Falsche Verwendung kann Testing-Überzeugung schwächen (z. B. logik in Views)
- Halte ViewModels schlank: keine direkten UI-Kontexte referenzieren
- Nutze Commands statt Event-Handler in Views
- Führe klare Namenskonventionen für Bindings und Properties ein
I/O & Ressourcen
- Domänenmodell
- UI-Designspezifikation
- Zugriff auf persistente Datenquellen
- ViewModels mit klarer Präsentationslogik
- Bindings und Commands in Views
- Automatisierte Tests für Präsentationsschicht
Beschreibung
MVVM ist ein strukturelles Architekturpattern, das Model, View und ViewModel trennt, um Zustandsverwaltung, Präsentationslogik und UI-Darstellung zu entkoppeln. Es erleichtert Unit-Testing und modularen Aufbau von Benutzerschnittstellen. Gängig in Desktop- und mobilen .NET-Anwendungen sowie plattformübergreifenden UI-Frameworks.
✔Vorteile
- Erhöhte Testbarkeit durch isolierte ViewModel-Logik
- Bessere Modularität und Wiederverwendbarkeit von Komponenten
- Erleichtert parallele Entwicklung von UI und Logik
✖Limitationen
- Erhöhter Boilerplate-Aufwand für Bindings und Property-Implementierung
- Nicht jede UI-Interaktion lässt sich sauber abstrahieren
- Eignet sich schlechter für sehr einfache UIs ohne Zustandslogik
Trade-offs
Metriken
- Abdeckung der ViewModel-Unit-Tests
Prozentsatz der Logikmethoden und Zustände, die durch Unit-Tests abgedeckt sind.
- Anzahl wiederverwendeter ViewModels
Menge von ViewModels, die across multiple views or platforms reused werden.
- Durchschnittliche Bindungs-Latenz
Messung der Zeit, die Bindings benötigen, um UI-Updates zu propagieren.
Beispiele & Implementierungen
Referenzprojekt: WPF To-Do App
Kleine Desktop-App, die MVVM für Bindings, Commands und Persistenz nutzt.
Plattformübergreifende Notizen-App (.NET MAUI)
Beispiel für gemeinsames ViewModel und separaten Views für iOS/Android.
Komplexes Formular-Modul
Modul mit Validierung, Undo/Redo und asynchroner Datensynchronisation via ViewModel.
Implementierungsschritte
Identifiziere Views, extrahiere Zustandslogik in ViewModels und definiere Bindings.
Implementiere Commands und Notification-Mechanismen (INotifyPropertyChanged).
Sorge für Dependency Injection und schreibe Unit-Tests für ViewModels.
⚠️ Technische Schulden & Engpässe
Tech Debt
- Unvollständige Trennung von UI- und Logik-Code im Legacy-ViewModel
- Fehlende Tests für ViewModel-Grenzfälle
- Ad-hoc-Bindings ohne Namenskonventionen erschweren Refactoring
Bekannte Engpässe
Beispiele für Missbrauch
- Verwendung von MVVM in einer App mit einer einzigen statischen View führt zu unnötigem Overhead.
- ViewModel als Repository- oder Persistenzschicht missbrauchen.
- Business-Logik in View-Events verstecken statt in ViewModel kapseln.
Typische Fallen
- Unbedachte Bindings verursachen Speicherlecks oder Performanceprobleme
- Zu feingranulare ViewModels führen zu Overhead und Komplexität
- Ignore platform lifecycle differences when reusing ViewModels
Erforderliche Fähigkeiten
Drivers (Architectural Drivers)
Constraints
- • Benötigt UI-Framework mit Datenbindung oder vergleichbarer API
- • Erfordert Disziplin bei Trennung von UI- und Logik-Code
- • Eingeschränkte Effektivität bei sehr einfachen UIs