Skip to content

Instantly share code, notes, and snippets.

@TorstenC
Created May 1, 2024 19:01
Show Gist options
  • Save TorstenC/5d70af41475b26a1aef6f8b5ed296779 to your computer and use it in GitHub Desktop.
Save TorstenC/5d70af41475b26a1aef6f8b5ed296779 to your computer and use it in GitHub Desktop.
đŸ‡©đŸ‡Ș Model-View-ViewModel Architektur

Model-View-ViewModel Architektur

Das "Model" im MVVM-Schema enthÀlt die Daten und die Logik, die direkt mit diesen Daten verbunden ist.
Das "ViewModel" transformiert diese Daten in eine Form, die fĂŒr die Darstellung auf der BenutzeroberflĂ€che geeignet ist und verwaltet die Interaktion zwischen der UI und den Modellen. Es verbindet die UI-Anforderungen (wie sie im View geĂ€ußert werden) mit den Datenoperationen, die im Model definiert sind.

  1. Model: Das erste M in MVVM reprĂ€sentiert das "Model". In dieser Rolle fungiert es als die ReprĂ€sentation der Datenstruktur, zusammen mit der GeschĂ€ftslogik, die Daten manipuliert. Das Modell ist verantwortlich fĂŒr:

    • Den Zugriff auf die Datenquelle (z.B. Datenbank, Webdienste).
    • Die Implementierung der GeschĂ€ftsregeln oder Logik, die spezifisch fĂŒr die Daten oder die DomĂ€ne sind.
    • Die Aufrechterhaltung des Zustands der Daten (aber nicht des Zustands der UI).
    • Benachrichtigungen ĂŒber Änderungen in seinen Daten durch Implementierungen wie INotifyPropertyChanged, wenn dies fĂŒr die Anwendung notwendig ist.

    Modelle sind in der Regel unabhÀngig von spezifischen UI-Technologien und können in verschiedenen Anwendungen wiederverwendet werden.

  2. ViewModel: Das zweite M in MVVM steht fĂŒr "ViewModel". Das ViewModel agiert als Mittler zwischen dem View und dem Model. Es ist verantwortlich fĂŒr:

    • Die Transformation von Modellinformationen in Werte, die leicht im View dargestellt werden können (zum Beispiel das Konvertieren von Datumsformaten, die Zusammenstellung von spezifischen Ansichten aus mehreren Datenquellen usw.).
    • Die Reaktion auf Befehle oder Aktionen des Benutzers (z.B. Button-Klicks, AuswahlĂ€nderungen), oft durch Command-Patterns realisiert.
    • Die Verwaltung des Zustands der PrĂ€sentation (UI-spezifische ZustĂ€nde wie z.B. die Sichtbarkeit von Elementen oder die Auswahl in einem Drop-Down-MenĂŒ).
    • Die Weiterleitung von Änderungen an das Modell oder Anfragen von Daten vom Modell, oft ohne spezifisches Wissen ĂŒber die UI selbst.
  3. View Die View (Z.B. die MainWindow-Klasse) sollte sich primĂ€r auf UI-Aspekte konzentrieren, wie z. B. Fenstereigenschaften, die Darstellung und das Event-Handling. Der Code-Behind in der MainWindow sollte möglichst minimal sein und vorwiegend fĂŒr direkte UI-Operationen verwendet werden. Um GeschĂ€ftslogik und die Zustandsverwaltung sollte sich das ViewModel kĂŒmmern.

Details

Die View in der MVVM-Architektur spricht ĂŒber das ViewModel mit dem Model (Schichtentrennung):

  1. Model: Dies ist die niedrigste Ebene und beinhaltet die GeschĂ€ftslogik und die Datenzugriffslogik. Das Model ist verantwortlich fĂŒr die Abfrage, Speicherung und Manipulation der Daten, oft durch Kommunikation mit einer Datenbank oder anderen Diensten.

  2. ViewModel: Das ViewModel fungiert als Bindeglied zwischen der View und dem Model. Es nimmt Daten vom Model auf, transformiert sie in Formate, die leichter von der View genutzt werden können (zum Beispiel durch Aufbereitung von Datumsformaten oder das Kombinieren von Daten aus mehreren Quellen), und stellt diese Daten der View zur VerfĂŒgung. Es nimmt auch Befehle von der View entgegen (zum Beispiel durch Benutzeraktionen wie Klicks) und fĂŒhrt entsprechende Aktionen im Model aus.

  3. View: Die View ist das, was der Benutzer sieht. Es ist die BenutzeroberflÀche, die die vom ViewModel bereitgestellten Daten darstellt und Benutzerinteraktionen einfÀngt und an das ViewModel weiterleitet.

Das ViewModel dient als zentrale Vermittlungsinstanz, durch die alle Kommunikation zwischen der BenutzeroberflĂ€che (View) und den GeschĂ€ftsdaten (Model) fließt. Es ist hilfreich zu denken, dass das ViewModel sowohl zum Model als auch zur View "spricht", um eine klare Trennung der Verantwortlichkeiten zu gewĂ€hrleisten:

  • Die View kennt nur das ViewModel und reagiert auf Benutzereingaben oder stellt Daten dar, ohne die GeschĂ€ftslogik oder Datenquelle zu kennen.
  • Das ViewModel kennt das Model und kann Daten anfordern oder aktualisieren, weiß aber nichts ĂŒber die spezifische Implementierung der UI.
  • Das Model ist völlig unabhĂ€ngig von der Darstellung und fokussiert sich auf die GeschĂ€ftslogik und Daten.

Diese Trennung ermöglicht es, jede Schicht unabhĂ€ngig von den anderen zu entwickeln und zu testen, was insbesondere in großen und komplexen Anwendungen von Vorteil ist.

Aufteilung der GeschÀftslogik

ViewModel kann durchaus GeschĂ€ftslogik enthalten sein, insbesondere Logik, die spezifisch fĂŒr die Darstellung oder die Handhabung von Benutzerinteraktionen ist. Die Aufteilung der GeschĂ€ftslogik zwischen dem Model und dem ViewModel hĂ€ngt von deren spezifischer Funktion innerhalb der Anwendung ab. Hier sind einige Leitlinien, wie du entscheiden kannst, wo GeschĂ€ftslogik platziert werden sollte:

GeschÀftslogik im Model

  • DatenintegritĂ€t und Validierung: Logik, die sicherstellt, dass Daten konsistent und gĂŒltig sind, sollte im Model liegen. Dies umfasst Validierungen, die unabhĂ€ngig von der BenutzeroberflĂ€che gelten, wie z.B. die ÜberprĂŒfung, ob ein Benutzername eindeutig ist oder ob Transaktionsdaten vollstĂ€ndig sind.
  • Datenmanipulation: Operationen, die Daten erstellen, lesen, aktualisieren oder löschen (CRUD-Operationen), gehören ins Model. Dies stellt sicher, dass das Model als einzige Quelle der Wahrheit fĂŒr Daten dient.
  • Wiederverwendbare GeschĂ€ftsprozesse: Wenn ein GeschĂ€ftsprozess in verschiedenen Teilen der Anwendung wiederverwendet wird, sollte er im Model implementiert werden, um Duplikation zu vermeiden und die Wartung zu erleichtern.

GeschÀftslogik im ViewModel

  • DatenprĂ€sentation: Logik, die bestimmt, wie Daten formatiert oder kombiniert werden, um sie fĂŒr die Benutzer ansprechend und verstĂ€ndlich zu machen. Beispiele sind das Formatieren von Datumsangaben, WĂ€hrungen oder die Kombination von Daten aus mehreren Modellen fĂŒr die Darstellung.
  • Zustandsmanagement der UI: Logik, die den Zustand der BenutzeroberflĂ€che verwaltet, wie z.B. welche Elemente sichtbar oder aktiviert sind, basierend auf den Rechten des Benutzers oder anderen Bedingungen.
  • Reaktion auf Benutzeraktionen: Die Logik, die auf Benutzereingaben wie Klicks oder Eingaben reagiert, gehört typischerweise ins ViewModel. Dies umfasst die Entscheidung, welche Aktionen ausgefĂŒhrt werden, wenn Benutzer bestimmte Steuerelemente verwenden.

Kriterien fĂŒr die Aufteilung

  • Trennung von Interessen: GeschĂ€ftslogik, die eng mit der BenutzeroberflĂ€che verbunden ist, gehört ins ViewModel. Logik, die grundlegende GeschĂ€ftsregeln und Datenoperationen definiert, gehört ins Model.
  • Testbarkeit: Model-Logik sollte so gestaltet sein, dass sie unabhĂ€ngig von der UI getestet werden kann. ViewModel-Logik kann auf Interaktion und Darstellung fokussieren und oft mit Mocking-Techniken getestet werden.
  • Wiederverwendbarkeit: Code, der in unterschiedlichen Kontexten oder Projekten wiederverwendet werden könnte, sollte im Model platziert werden, um die Wiederverwendung zu maximieren.

Durch die Beachtung dieser Kriterien kannst du eine saubere Architektur fördern, die leicht zu warten und zu skalieren ist.

( With ♄ by C# XAML Csharp GPT and me. )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment