Model View Controller
Aus Kefk
Der Begriff Modell-Präsentation-Steuerung (MPS) bzw. englisch Model-View-Controller (MVC) bezeichnet ein Architekturmuster zur Aufteilung von Softwaresystemen in die drei Einheiten: Datenmodell (engl. Model), Präsentation (engl. View) und Programmsteuerung (engl. Controller).
Ziel des Modells ist ein flexibles Programmdesign, um u.a. eine spätere Änderung oder Erweiterung einfach zu halten und die Wiederverwendbarkeit der einzelnen Komponenten zu ermöglichen. Außerdem sorgt das Modell bei großen Anwendungen für eine gewisse Übersicht und Ordnung durch Reduzierung der Komplexität.
Eine Variante des MVC-Modells ist das MVC2-Modell. Es ist eine für Webanwendungen optimierte zustandslose Variante des objektorientierten MVC-Modells.
Inhaltsverzeichnis |
Komponenten
Das MVC-Architekturmuster besteht aus drei Komponenten, die je nach Realisierung unterschiedlich stark voneinander abhängen:
Modell (model)
Das Modell enthält die darzustellenden Daten. Woher die Daten kommen und wie diese zusammenhängen, spielt keine Rolle. So kann es sich hierbei um ein Datenmodell, Geschäftsmodell oder sogar um ein für die Präsentation abstrahiertes Modell handeln. Das Modell kennt weder die Präsentation noch die Steuerung, es weiß also gar nicht, wie, ob und wie oft es dargestellt und verändert wird. Je nach Anwendung müssen jedoch Änderungen im Modell beobachtbar sein. Die Aspektorientierte Programmierung nutzt dies durch s.g. „pointcuts“ (vgl. AspectJ) der Aspekte, die Objektorientierte Programmierung in der Regel durch das Entwurfsmuster „Beobachter“.
Präsentation (view)
Die Präsentation ist für die Darstellung der relevanten Daten aus dem Modell zuständig. Sie ist nicht für die Interaktion mit dem Benutzer verantwortlich (siehe Steuerung), sondern lediglich für die Beschaffung der Daten aus dem Modell, deren Darstellung und, bei Änderungen im Modell, die Darstellung passend zu aktualisieren. Je nach Design leitet sie auch Benutzeraktionen (oder: Events) an die Steuerung weiter.
Steuerung (controller)
Die Steuerung verwaltet die Sicht(en), nimmt von ihnen Benutzeraktionen entgegen, wertet diese aus und agiert entsprechend. Sie enthält die Intelligenz und steuert den Ablauf (engl. Workflow) der Präsentation.
Anmerkungen
- Das MVC-Architekturmuster trifft keine Aussage über die Positionierung der Geschäftslogik innerhalb der MVC-Klassen. Diese kann je nach Anwendungsfall besser im Control-Modul aufgehoben sein oder besser in das Modell verlagert werden (z.B. wenn es mehrere Control-Module gibt).
- Aufgrund diverser Probleme bei der Realisierung in OOP, bedingt durch die Kapselung werden bei der Implementierung von Dialogen und Fenstern häufig die Steuerung und die Präsentation zusammengefasst. Das entstehende Modell wird Document-View Modell genannt, in dem das Document dem MVC-Modell und die View der Vereinigung von Steuerung und Präsentation entspricht.
Analyse
Üblicherweise spielen ein View- und ein Control-Modul zusammen, welche sich gegenseitig kennen und sich auf ein Modell beziehen. Ein Modell kann aber von mehreren View-Control-Paaren gesteuert werden. Beispielsweise kann ein Zahlenwert sowohl über ein Eingabefeld als auch über einen Schieberegler steuerbar sein. Ebenfalls ist denkbar, dass Datenmaterial aus dem Modell durch verschiedene Views dargestellt werden kann (z.B. in Form von Tabellen und Diagrammen). Verändert einer der dazugehörigen Control-Module den Wert, so sendet das Modell einen Event, der dazu führt, dass sich beide grafischen Controls parallel aktualisieren.
Das MVC-Konzept wurde zunächst für Benutzungsoberflächen in Smalltalk durch Trygve Reenskaug beschrieben (Seeheim-Modell), gilt mittlerweile aber als de facto Standard für den Grobentwurf aller komplexen Softwaresysteme (mit diversen Verfeinerungen und oftmals mehreren jeweils nach MVC-Pattern aufgeteilten Modulen).
Die Bedeutung des MVC Entwurfsmuster wird noch klarer, wenn man sich in die Lage der Entwickler von GUI-Frameworks versetzt. Hier besteht die Herausforderung darin, dass zum Entwicklungszeitpunkt der GUI Widgets (View) nicht feststeht, welche fachlichen Daten und Datenstrukturen (Modell) repräsentiert und welche fachlichen Abläufe (Control) realisiert werden sollen. Damit besteht die Aufgabe der Entwickler eines GUI-Frameworks auch darin, eine Abstraktion für das Modell in Form von Schnittstellen bereitzustellen. Darüber hinaus muss die Kommunikation zwischen den einzelnen Komponenten in beide Richtungen gewährleistet sein. Zur Vermeidung von zirkularen Abhängigkeiten zwischen View, Modell und Control wird diese dann vorzugsweise mittels des Listener-Entwurfsmuster realisiert, auch diese Infrastruktur wird von GUI-Frameworks mitgeliefert.
Das MVC Entwurfsmuster definiert damit den Rahmen für die Entwickler von GUI-Frameworks, das fertige GUI-Framework beinhaltet:
- einen View in Form ausimplementierter GUI Widgets,
- den Vertrag für das Modell in Form von Schnittstellen,
- den Vertrag für Benachrichtigungen aufgrund von Nutzerinteraktion in Form von Schnittstellen und ausimplementierten Klassen, sowie
- den Vertrag für Benachrichtigungen aufgrund von Modelländerungen in Form von Schnittstellen und ausimplementierten Klassen.
Umstritten ist, ob es sich hierbei um ein Entwurfsmuster handelt. Nach strenger Auslegung ist das nicht der Fall, da es sich nicht um ein allgemeines, beliebig verwendbares Muster handelt, sondern um einen ganz konkreten Anwendungsfall, nämlich um den der Grafischen Oberfläche.
Beispiel
Bild:Mvc-modell.png Abb. 1
Abbildung 1 zeigt das MVC-Modell für eine einfache Web-Registrierung. Der Benutzer (Client) fragt als erstes die Seite register.jsp an. Er bekommt eine Seite mit einem HTML-Formular als Antwort. Als „Action“ ist im Formular die validate.jsp angegeben. Also schickt der Browser nach dem Ausfüllen des Formulars die eingegebenen Daten an die validate.jsp. Validate.jsp, welches in diesem Fall das Control-Modul ist, prüft die eingegebenen Werte. Es ist nur für die Prüfung und Verarbeitung der Daten zuständig. Selbst gibt validate.jsp dem Benutzer kein Feedback. Das Control-Modul gibt dazu die Kontrolle an die entsprechenden Views weiter. In diesem Fall entweder an register.jsp, wenn die Eingaben ungültig waren, sonst an die ok.jsp. Wird die Kontrolle wieder zurück an die register.jsp übergeben, zeigt register.jsp dem User erneut das Formular mit z.B. einem Fehler-Hinweis an. Der Browser schickt die korrigierten Daten wieder an die validate.jsp. Sind die Eingaben korrekt, werden die Daten zur Speicherung an die UsersBean übergeben. Die Kontrolle wird daraufhin an die ok.jsp abgegeben. Diese zeigt dem User beispielsweise eine Erfolgsbestätigung.
Dies ist nur eine von vielen Möglichkeiten für ein MVC-Modell, sie zeigt jedoch die grundlegende Funktionsweise des MVC-Modells. An der Abbildung lässt sich außerdem gut erkennen, dass unproblematisch einzelne Teile, wie die Datenspeicherung oder das Aussehen, ausgetauscht werden können.
Durch den einfachen Austausch entsteht ein beachtlicher Vorteil des Modells. Die Anwendung kann mit neuer oder anderer Technologie an veränderte Anforderungen relativ einfach angepasst werden. Das MVC-Modell ermöglicht es also, eine anfangs „kleine“ Webanwendung im Nachhinein bei Bedarf mit mächtiger Technologie nachzurüsten.
Implementierungen
1979 wurde MVC das erste mal von Trygve Reenskaug beschrieben, der dann an Smalltalk beim PARC arbeitete. Diese ursprüngliche Implementierung inspirierte viele andere (GUI) Frameworks wie:
- Business Server Pages
- CakePHP(CakePHP)
- Catalyst (Perl)
- Cocoa
- Jifty (Perl)
- Microsoft Foundation Classes (zweiteilig: CDocument steht für das Modell, und CView umfasst Präsentation und Steuerung)
- NeXTSTEP/OPENSTEP und die darauf beruhenden Cocoa frameworks
- PHP on Trax
- Qt (Toolkit)
- Ruby on Rails
- Swing (Java)
- Web Dynpro
- wxWidgets
- CodeIgniter (PHP-Framework)
- Symfony (PHP-Framework)
- Pylons (Python-Framework)
- Django (Python-Framework)
MVC 2
MVC 2 steht für MVC Version 2 bzw. MVC Model 2 und ist eine für Webanwendungen spezialisierte Variante des Architekturmusters Model View Control (MVC, siehe oben).
Im Gegensatz zu allgemeinen Client/Server-Anwendungen, dient MVC2 in Webanwendungen der Trennung eines Controls, der HTTP-Requests verarbeitet, von einer View, die HTML-Responses erzeugt. Das einmalige Senden der Response geschieht durch einen Updatekontrollfluss vom Control-Modul zum View.
Siehe auch
- Ajax (Programmierung)
- Struts
- Servlet
- JavaServer Pages
- Catalyst
- JavaServer Faces
- Three-Tier-Architektur
- Aspektorientierte Programmierung (AOP)
- Objektorientierte Programmierung (OOP)
Weblinks
- Trygve Reenskaug - MVC
- MVC (englisch)
| Dieses Dokument entstammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Es ist dort zu finden unter dem Stichwort Model_View_Controller, die Liste der bisherigen Autoren befindet sich in der Versionsliste; die Originalfassung kann dort auch bearbeitet werden. Alle Texte der Wikipedia und ihre Derivate stehen unter der GNU-Lizenz für freie Dokumentation. |
