Model-View-Controller-Pattern: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Wechseln zu:Navigation, Suche
(Initialisierung von Modulen)
 
(33 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
{{MVC:Menü}}
 
{{MVC:Menü}}
=Definition=
+
==Definition==
 
Ein [[Model-View-Controller-Pattern]], kurz [[MVC-Pattern]], bezeichnet ein [[Entwurfsmuster]], das  
 
Ein [[Model-View-Controller-Pattern]], kurz [[MVC-Pattern]], bezeichnet ein [[Entwurfsmuster]], das  
 
auf dem [[Model-View-Controller-Paradigma]] beruht, das also für die MVC-Module  
 
auf dem [[Model-View-Controller-Paradigma]] beruht, das also für die MVC-Module  
[[Model (MVC)|Model]], [[View (MVC)|View]] und [[Controller (MVC)|Controller]]  
+
[[Model-View-Controller-Paradigma/Model|Model]], [[Model-View-Controller-Paradigma/View|View]] und [[Model-View-Controller-Paradigma/Controller|Controller]]  
geeignete [[Klassen]]- und [[Objekt]]-Strukturen definiert.
+
geeignete [[Klasse (OOP)|Klassen]]- und [[Objekt (OOP)|Objekt]]-Strukturen definiert.
  
=Verschiedene Realisierungsmöglichkeiten=
+
==Verschiedene Realisierungsmöglichkeiten==
  
 
Es gibt mehrere Möglichkeiten, geeignete Klassen- und Objekt-Strukturen zu definieren,
 
Es gibt mehrere Möglichkeiten, geeignete Klassen- und Objekt-Strukturen zu definieren,
d.h. es gibt mehrere MVC-Pattern-Varianten.
+
{{dh}}, es gibt mehrere MVC-Pattern-Varianten.
  
 
Zwei wichtige Aspekte, die dabei berücksichtigt werden müssen, sind die
 
Zwei wichtige Aspekte, die dabei berücksichtigt werden müssen, sind die
* '''Initilaisierun''': Wie werden die Module initialisiert?
 
 
* '''Kommunikation''': Auf welche Arten kommunizieren die Module miteinander?
 
* '''Kommunikation''': Auf welche Arten kommunizieren die Module miteinander?
+
* '''Initialisierung''': Wie werden die Module initialisiert?
 +
 
 
Basierend auf diesen Vorüberlegungen sollen drei mögliche MVC-Pattern vorgestellt werden:
 
Basierend auf diesen Vorüberlegungen sollen drei mögliche MVC-Pattern vorgestellt werden:
* [[Model-View-Controller-Pattern/Dependency Injection|Initialiserung mittels Depenceny Injection]]  
+
* [[Model-View-Controller-Pattern/Singleton|Initialisierung mittels Singleton(s)]] (weniger empfehlenswert)
* [[Model-View-Controller-Pattern/Singleton|Initialiserung mittels Singleton(s)]]
+
* [[Model-View-Controller-Pattern/Dependency Injection|Initialisierung mittels Dependency Injection]] (empfehlenswert)
* [[Model-View-Controller-Pattern/Observer|Kommunikation ausschließlich mittels des Observer Patterns]]
+
* [[Model-View-Controller-Pattern/Observer|Kommunikation ausschließlich mittels des Observer Patterns]] (empfehlenswert)
  
=Kommunikation zwischen MVC-Modulen=
+
==Kommunikation zwischen MVC-Modulen==
[[Medium:MVC-Prozess 02b.png|gerahmt|rechts|MVC-Prozess: Verschiedene Arten der Kommunikation]]
+
[[Datei:VCM-Prozess 01.png|gerahmt|rechts|VCM-Prozess]]
 
Ein wichtiges [[Programmierprinzip]] ist es, so wenige Abhängigkeiten wie möglich zu erzeugen (''few interfaces''), da Abhängigkeiten die Komplexität und die Fehleranfälligkeit erhöhen.
 
Ein wichtiges [[Programmierprinzip]] ist es, so wenige Abhängigkeiten wie möglich zu erzeugen (''few interfaces''), da Abhängigkeiten die Komplexität und die Fehleranfälligkeit erhöhen.
 
Die Abhängigkeiten entstehen dadurch, dass die MVC-Module miteinander kommunizieren müssen.  
 
Die Abhängigkeiten entstehen dadurch, dass die MVC-Module miteinander kommunizieren müssen.  
  
Für die Kommunikation zwischen zwei Modulen gibt es mehrere Möglichkeiten. Die wichtigsten davon sind
+
Für die Kommunikation zwischen zwei Modulen gibt es mehrere Möglichkeiten. Die wichtigsten davon sind:
 
# [[Unicast-Nachricht]]en: Modul A ruft Methoden von Modul B direkt auf.
 
# [[Unicast-Nachricht]]en: Modul A ruft Methoden von Modul B direkt auf.
# [[Multicast-Nachricht]]en: Modul A informiert alle Module, die als Nachrichtenempfänger angemeldet wurden, mit Hilfe von [[Signal]]en ([[Observer-Pattern]])
+
# [[Multicast-Nachricht]]en: Modul A informiert alle Module, die als Nachrichtenempfänger angemeldet wurden, mit Hilfe von [[Signal]]en ([[Observer-Pattern]]).
## Der Sender informiert mit einer Nachricht die Empfänger lediglich, dass sich etwas geändert hat. Die Empfänger müssen sich daraufhin die für sie wichtigen Information per direktem Zugriff vom Sender holen.
+
## Der Sender informiert mit einer Nachricht die Empfänger lediglich, dass sich etwas geändert hat. Die Empfänger müssen sich daraufhin die für sie wichtigen Informationen per direktem Zugriff vom Sender holen.
 
## Der Sender schickt in der Nachricht detailierte Informationen mit, so dass der Empfänger danach nicht mehr auf den Sender zugreifen muss.
 
## Der Sender schickt in der Nachricht detailierte Informationen mit, so dass der Empfänger danach nicht mehr auf den Sender zugreifen muss.
  
=Initialisierung von Modulen=
+
Weitere Kommunikationsmöglichkeiten, wie {{zB}} [[Broadcast-Nachricht]]en,  die Kommunikation über globale Variablen (insbesondere über [[Klassenattribute]]) etc., sollten {{iAllg}} vermieden werden.
 +
Bei Broadcast-Nachrichten, die an eine Vielzahl von nicht-beteiligten Objekten gehen, muss jeder
 +
einzelne Empfäger entscheiden, ob die jweils empfangene Nachricht für ihn überhaupt von Interesse ist.
 +
Bei globalen Variablen kann {{iAllg}} nur schwer nachvollzogen werden, wer welche Variablen zu Kommunikation nutzt oder ob bestimmte Variablen überhaupt noch zur Kommunikation benötigt werden. Der zugehörige Code wird im Laufe der Zeit im unwartbarer.
 +
 
 +
==Initialisierung von MVC-Modulen==
  
 
Je nach Art der Kommunikation müssen die verschiedenen Module unterschiedlich initialisiert werden:
 
Je nach Art der Kommunikation müssen die verschiedenen Module unterschiedlich initialisiert werden:
  
# [[Unicast-Nachricht]]en: Modul A muss das Modul B kennen, bevor es mit diesem Modul kommunizieren kann
+
# [[Unicast-Nachricht]]en: Modul A muss das Modul B kennen, bevor es mit diesem Modul kommunizieren kann.
 
# [[Multicast-Nachricht]]en: Modul B muss sich bei Modul A als Empfänger anmelden oder es muss von dritter Seite angemeldet werden, bevor es Nachrichten von A empfängt.
 
# [[Multicast-Nachricht]]en: Modul B muss sich bei Modul A als Empfänger anmelden oder es muss von dritter Seite angemeldet werden, bevor es Nachrichten von A empfängt.
 
## Modul B muss Modul A kennen, wenn Modul B sich sebst als Empfänger bei Modul A anmelden muss oder wenn Modul B nach Empfang einer Nachricht weitere Informationen von Modul A erfragen muss.
 
## Modul B muss Modul A kennen, wenn Modul B sich sebst als Empfänger bei Modul A anmelden muss oder wenn Modul B nach Empfang einer Nachricht weitere Informationen von Modul A erfragen muss.
 
## Wenn Modul B von einem Dritten als Empfänger angemeldet wird und Modul A alle notwendigen Informationen in den Multicast-Nachrichten mitschickt, braucht Modul B das Modul A nicht zu kennen.
 
## Wenn Modul B von einem Dritten als Empfänger angemeldet wird und Modul A alle notwendigen Informationen in den Multicast-Nachrichten mitschickt, braucht Modul B das Modul A nicht zu kennen.
  
=Das MVC-Pattern als 3-Tier-Layer-Pattern=
+
==Das MVC-Pattern als 3-Schichten-Pattern==
 +
[[Datei:VCM-Schichtenarchitektur 01.png|gerahmt||rechts|Das MVC-Pattern als Spezialfall des [[Layer-Pattern]]s]]
  
Ein Modellmodul sollte vollkommen unabhängig von anderen Modulen existieren. Es stellt lediglich Methoden zur Verfügung, mit deren Hilfe irgendwelche Steuerungsmodule die Daten des Modells manipulieren können. Mit Hilfe von Mulitcast-Nachrichten ''informiert'' ein Modell die übrigen Module über erfolgte Änderungen. Dabei muss sich der Programmierer entscheiden, ob mit einer derartigen Nachricht detailierte Informationen über die Änderungen mitgeschickt werden (2.2) oder nicht (2.1).
+
Man kann die drei MVC-Module in Schichten anordnen: In der untersten Schicht ist das Modell angesiedelt, darüber liegt der Controller
 +
und zuoberst die View.
  
Man beachte, dass bei der Implementierung eines Modellmoduls weder die Steuerungs- noch die Darstellungsmodule bekannt sein müssen.
+
Das Layer- oder [[Layer-Pattern|Schichtenpattern]] erlaubt nur, dass höhere Schichten direkt auf tiefere zugreifen, aber nicht umgekehrt.
 +
Ordnet man die drei MVC-Module so an, wie zuvor beschrieben, darf die View sowohl auf den Controller als auch auf das Modell zugreifen
 +
und der Controller auf das Modell. Das Modell darf dagegen auf kein anderes Modul direkt zugreifen.
 +
 +
Diese Schichteneinteilung ist sinnvoll. Wenn ein Modell, {{dh}} eine Abbildung eines Realitätsauschnitts auf ein Datenmodell, erstellt wird,
 +
ist weder festgelegt, wie die Manipulationen an diesem Modell realisiert werden, noch, auf welche Arten diese Daten den Benutzern
 +
präsentiert werden. Auch der Controller, der die Benutzereingaben verarbeitet, braucht nicht zu wissen, welche Views das Modell darstellen.
 +
Eine View dagegen muss das Modell kennen, dessen Daten sie visualisiert. Außerdem muss sie einen geeigneten
 +
Controller kennen, wenn sie Benutzeraktionen, wie {{zB}} Mausklicks auf bestimmte Buttons, verarbeiten lassen will.
  
Ein Darstellungmodul lauscht auf Nachrichten einer oderer mehrerer Modellmodule. Es muss diese Modelle kennen, wenn es sich dort selbst zum Nachrichten-Empfang anmelden muss und/oder – sofern
+
===Heterogene Kommunikationswelt: Unicast- und Multicast-Kommunikation===
die Nachrichten nicht schon alle wesentlichen Änderungsdaten enthalten – um nähere Informationen über die aktuelle Änderung vom Sendermodell einholen zu können.
 
  
Interaktive Darstellungsmodulen müssen außerdem die zugehörigen Steuerungsmodule über User-Aktionen informieren. Dies kann entweder direkt (1.) oder mit Hilfe von Multicast-Nachrichten erfolgen (2.).
+
Die Drei-Schichten-Architektur legt folgendes Kommunikationsverhalten nahe:
Im ersten Fall müssen das Darstellungsmodule die zugehörigen Steuerungsmodule kennen, damit sie diese direkt informieren können. Im zweiten Fall müssen dagegen die Steuerungsmodule die zugehörigen Darstellungsmodule kennen, bei denen sie sich als Empfänger anmelden und gegebenfalls Detail-Informationen zu bestimmten Änderungen erfragen. Im Allgemeinen sollte der ersten Variante der Vorzug gegeben werden,
+
* Ein View-Objekt kommuniziert direkt mit den ihr zugeordneten Controller- und Modell-Objekten sowie evtl. mit anderen View-Objekten.
da es mehere View-Module kann, aber meist nur ein Controller-Modul gibt. Bei der zweiten Variante müsste der Controller jedesmal
+
* Ein Controller-Objekt kommuniziert direkt mit den ihr zugeordneten Modell-Objekten sowie evtl. mit anderen Controller-Objekten.
angepasst werden, wenn sich die Anzahl der View verändert.
+
* Ein Modell komminiziert höchstens mit anderen Modellobjekten direkt. Mit allen anderen Objekten kommuniziert sie nur per Multicast.
  
Aus Gründen der Modularität sollten diejenigen Darstellungsmodule, die lediglich Modelldaten visualisieren, und die Darstellungsmodule mit interaktiven Elementen möglichst getrennt realisiert werden.
+
Auf diese Weise ist sichergestellt, dass zunächst alle Modell-Objekte erzeugt und initialisert werden können, da dafür keine
 +
anderen Objekte bekannt sein müssen. Danach werden die Controller-Objekte erzeugt und initialisiert. Die Modell-Objekte,
 +
mit den die Controller kommunizieren, existieren zu diesem Zeitpunkt schon. Zu guter Letzt werden die View-Objekte erzeugt und initialisiert.
  
Ein Steuerungsmodul schließlich manipuliert ein oder mehrere Modellmodule. Dies sollte stets per direktem Zugriff erfolgen, damit die Modellfunktionalität nicht von der Existenz spezieller Steuerungsmodule abhängt.
+
===Homogene Kommunikationswelt: Reine Multicast-Kommunikation===
  
 +
Ein zweite Möglichkeit wäre, alle Objekte per Multicast-Nachrichten kommunizieren zu lassen. Allerdings sollten in diesem Fall
 +
die Empfänger-Objekte jeweils von dritter Stelle, das heißt vom Initialisierungs-Modul, beim Sender registriert werden. Außerdem müssten in den
 +
Multicast-Nachrichten alle
 +
wesentlichen Informationen mitgeschickt werden. Anderenfalls müsste beispielsweise ein Modell-Objekt alle Controller kennen,
 +
die mit diesen Modell-Objekt kommunizieren wollen: Entweder, um sich
 +
als Nachrichtenempfänger bei „seinen“ Controllern zu regisrieren, oder, um,  sobald Nachrichten vom Controller eintreffen,
 +
nähere Informationen vom Controller einholen zu können, welche Änderungen am Modell eigentlich vorgenommen werden sollen.
  
Interaktive Darstellungsmodulen müssen außerdem die zugehörigen Steuerungsmodule über User-Aktionen informieren. Dies kann entweder direkt (1.) oder mit Hilfe von Multicast-Nachrichten erfolgen (2.).
+
==Drei verschiedene Arten von MVCS-Pattern==
Im ersten Fall müssen das Darstellungsmodule die zugehörigen Steuerungsmodule kennen, damit sie diese direkt informieren können. Im zweiten Fall müssen dagegen die Steuerungsmodule die zugehörigen Darstellungsmodule kennen, bei denen sie sich als Empfänger anmelden und gegebenfalls Detail-Informationen zu bestimmten Änderungen erfragen. Im Allgemeinen sollte der ersten Variante der Vorzug gegeben werden,
 
da es mehere View-Module kann, aber meist nur ein Controller-Modul gibt. Bei der zweiten Variante müsste der Controller jedesmal
 
angepasst werden, wenn sich die Anzahl der View verändert. 
 
  
Aus Gründen der Modularität sollten diejenigen Darstellungsmodule, die lediglich Modelldaten visualisieren, und die Darstellungsmodule mit interaktiven Elementen möglichst getrennt realisiert werden.
+
===Initialisierung mittels Singleton(s)===
 +
Bei [[Model-View-Controller-Pattern/Singleton|diesem Pattern]] 
 +
kommunizeren ebenfalls nur die Modell-Objekte mittels Multicast-Nachrichten. Die
 +
anderen Objekte kommunizieren mittels Unicast-Nachrichten.
  
Ein Steuerungsmodul schließlich manipuliert ein oder mehrere Modellmodule. Dies sollte stets per direktem Zugriff erfolgen, damit die Modellfunktionalität nicht von der Existenz spezieller Steuerungsmodule abhängt.
+
Initialisiert werden alle Module mittels Zugriffen auf ein oder mehrere [[Singelton-Pattern|Singleton-Klassen]].
  
=Quellen=
+
Der Nachteil dieses Patterns ist, dass die Singleton-Klassen wie globale Variablen wirken. Daher sollte
 +
auf diese Art der Realisierung im Allgemeinen verzichtet werden.
 +
 
 +
Details siehe: [[Model-View-Controller-Pattern/Singleton|DMVC-Pattern: Initialisierung mittels Singleton(s)]]
 +
 
 +
===Initialisierung mittels Dependency Injection===
 +
Bei [[Model-View-Controller-Pattern/Dependency Injection|diesem Pattern]] 
 +
kommunizeren nur die Modell-Objekte mittels Multicast-Nachrichten. Die
 +
anderen Objekte kommunizieren mittels Unicast-Nachrichten.
 +
 
 +
Initialisiert werden alle Module mittels [[Dependency Injection]]. 
 +
 
 +
Der Nachteil dieses Patterns ist, dass View- und Controller-Module ihre Kommunikationspartner kennen müssen.
 +
Dies widerspricht dem [[Programmierprinzip]], die Schnittstellen möglichst klein zu halten (small interfaces).
 +
Allerdings kann man dieses Problem abmildern, wenn man für jeden Kommunikationskanal eigene,
 +
möglichst schlanke Kommunikationsschnittstellen definiert.
 +
 
 +
Details siehe: [[Model-View-Controller-Pattern/Dependency Injection|MVC-Pattern: Initialisierung mittels Dependency Injection]]
 +
 
 +
===Kommunikation ausschließlich mittels des Observer-Patterns===
 +
Bei [[Model-View-Controller-Pattern/Observer|diesem Pattern]] 
 +
kommunizeren alle MVC-Objekte mittels Multicast-Nachrichten (die alle notwendigen Informationen
 +
beeinhalten, so dass der Empfänger nie beim Sender rückfragen muss).
 +
 
 +
Die Zuweisung der Nachrichten-Sender zu ihren Nachrichten-Empfängern erfolgt während der Initialisierungsphase
 +
von außerhalb. Das heißt, die einzelnen MVC-Objekte kennen einander nicht.
 +
 
 +
Der Nachteil dieses Patterns ist, dass die eine Multicast-Kommunikation weniger effizient ist, als eine Unicast-Kommunikation.
 +
In zeitkritischen Anwendungen kann dies evtl. zu Problemen führen.
 +
 
 +
Details siehe: [[Model-View-Controller-Pattern/Observer|MVC-Pattern: Kommunikation ausschließlich mittels des Observer Patterns]]
 +
 
 +
==Quellen==
 +
<ol>
 +
<li>{{Quelle|Gamma, E.; Helm, R.; Johnson, R.; Vlissides, J. (1995): Design Patterns}}</li>
 +
<li>{{Quelle|Kowarschick, W.: Multimedia-Programmierung}}</li>
 +
</ol>
 +
 
 +
==Siehe auch==
 +
*[[Model-View-Controller-Paradigma]]
 
<noinclude>
 
<noinclude>
* [[Kowarschick, W.: Multimedia-Programmierung]]</noinclude>
+
[[Kategorie:MVC]]
* [[Gamma et al. (1995)]]
+
[[Kategorie:Objektorientierte Programmierung]]
=Siehe auch=
+
[[Kategorie:Glossar]]
*[[Model-View-Controller-Paradigma]]
 
<noinclude>[[Kategorie:Objektorientierte Programmierung]]
 
[[Kategorie:Glossar]][[Kategorie:MVC]]
 
 
[[en:MVC]]
 
[[en:MVC]]
 
[[Kategorie:Kapitel:Multimedia-Programmierung]]
 
[[Kategorie:Kapitel:Multimedia-Programmierung]]
{{{{SITENAME}}-konformer Artikel}}</noinclude>
+
</noinclude>

Aktuelle Version vom 22. September 2017, 15:50 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:

Korrektheit: 4
(großteils überprüft)
Umfang: 3
(einige wichtige Fakten fehlen)
Quellenangaben: 4
(fast vollständig vorhanden)
Quellenarten: 4
(sehr gut)
Konformität: 4
(sehr gut)

Diese Bewertungen beziehen sich auf alle im nachfolgenden Menü genannten Artikel gleichermaßen.

1 Definition

Ein Model-View-Controller-Pattern, kurz MVC-Pattern, bezeichnet ein Entwurfsmuster, das auf dem Model-View-Controller-Paradigma beruht, das also für die MVC-Module Model, View und Controller geeignete Klassen- und Objekt-Strukturen definiert.

2 Verschiedene Realisierungsmöglichkeiten

Es gibt mehrere Möglichkeiten, geeignete Klassen- und Objekt-Strukturen zu definieren, d. h., es gibt mehrere MVC-Pattern-Varianten.

Zwei wichtige Aspekte, die dabei berücksichtigt werden müssen, sind die

  • Kommunikation: Auf welche Arten kommunizieren die Module miteinander?
  • Initialisierung: Wie werden die Module initialisiert?

Basierend auf diesen Vorüberlegungen sollen drei mögliche MVC-Pattern vorgestellt werden:

3 Kommunikation zwischen MVC-Modulen

VCM-Prozess

Ein wichtiges Programmierprinzip ist es, so wenige Abhängigkeiten wie möglich zu erzeugen (few interfaces), da Abhängigkeiten die Komplexität und die Fehleranfälligkeit erhöhen. Die Abhängigkeiten entstehen dadurch, dass die MVC-Module miteinander kommunizieren müssen.

Für die Kommunikation zwischen zwei Modulen gibt es mehrere Möglichkeiten. Die wichtigsten davon sind:

  1. Unicast-Nachrichten: Modul A ruft Methoden von Modul B direkt auf.
  2. Multicast-Nachrichten: Modul A informiert alle Module, die als Nachrichtenempfänger angemeldet wurden, mit Hilfe von Signalen (Observer-Pattern).
    1. Der Sender informiert mit einer Nachricht die Empfänger lediglich, dass sich etwas geändert hat. Die Empfänger müssen sich daraufhin die für sie wichtigen Informationen per direktem Zugriff vom Sender holen.
    2. Der Sender schickt in der Nachricht detailierte Informationen mit, so dass der Empfänger danach nicht mehr auf den Sender zugreifen muss.

Weitere Kommunikationsmöglichkeiten, wie z. B. Broadcast-Nachrichten, die Kommunikation über globale Variablen (insbesondere über Klassenattribute) etc., sollten i. Allg. vermieden werden. Bei Broadcast-Nachrichten, die an eine Vielzahl von nicht-beteiligten Objekten gehen, muss jeder einzelne Empfäger entscheiden, ob die jweils empfangene Nachricht für ihn überhaupt von Interesse ist. Bei globalen Variablen kann i. Allg. nur schwer nachvollzogen werden, wer welche Variablen zu Kommunikation nutzt oder ob bestimmte Variablen überhaupt noch zur Kommunikation benötigt werden. Der zugehörige Code wird im Laufe der Zeit im unwartbarer.

4 Initialisierung von MVC-Modulen

Je nach Art der Kommunikation müssen die verschiedenen Module unterschiedlich initialisiert werden:

  1. Unicast-Nachrichten: Modul A muss das Modul B kennen, bevor es mit diesem Modul kommunizieren kann.
  2. Multicast-Nachrichten: Modul B muss sich bei Modul A als Empfänger anmelden oder es muss von dritter Seite angemeldet werden, bevor es Nachrichten von A empfängt.
    1. Modul B muss Modul A kennen, wenn Modul B sich sebst als Empfänger bei Modul A anmelden muss oder wenn Modul B nach Empfang einer Nachricht weitere Informationen von Modul A erfragen muss.
    2. Wenn Modul B von einem Dritten als Empfänger angemeldet wird und Modul A alle notwendigen Informationen in den Multicast-Nachrichten mitschickt, braucht Modul B das Modul A nicht zu kennen.

5 Das MVC-Pattern als 3-Schichten-Pattern

Das MVC-Pattern als Spezialfall des Layer-Patterns

Man kann die drei MVC-Module in Schichten anordnen: In der untersten Schicht ist das Modell angesiedelt, darüber liegt der Controller und zuoberst die View.

Das Layer- oder Schichtenpattern erlaubt nur, dass höhere Schichten direkt auf tiefere zugreifen, aber nicht umgekehrt. Ordnet man die drei MVC-Module so an, wie zuvor beschrieben, darf die View sowohl auf den Controller als auch auf das Modell zugreifen und der Controller auf das Modell. Das Modell darf dagegen auf kein anderes Modul direkt zugreifen.

Diese Schichteneinteilung ist sinnvoll. Wenn ein Modell, d. h. eine Abbildung eines Realitätsauschnitts auf ein Datenmodell, erstellt wird, ist weder festgelegt, wie die Manipulationen an diesem Modell realisiert werden, noch, auf welche Arten diese Daten den Benutzern präsentiert werden. Auch der Controller, der die Benutzereingaben verarbeitet, braucht nicht zu wissen, welche Views das Modell darstellen. Eine View dagegen muss das Modell kennen, dessen Daten sie visualisiert. Außerdem muss sie einen geeigneten Controller kennen, wenn sie Benutzeraktionen, wie z. B. Mausklicks auf bestimmte Buttons, verarbeiten lassen will.

5.1 Heterogene Kommunikationswelt: Unicast- und Multicast-Kommunikation

Die Drei-Schichten-Architektur legt folgendes Kommunikationsverhalten nahe:

  • Ein View-Objekt kommuniziert direkt mit den ihr zugeordneten Controller- und Modell-Objekten sowie evtl. mit anderen View-Objekten.
  • Ein Controller-Objekt kommuniziert direkt mit den ihr zugeordneten Modell-Objekten sowie evtl. mit anderen Controller-Objekten.
  • Ein Modell komminiziert höchstens mit anderen Modellobjekten direkt. Mit allen anderen Objekten kommuniziert sie nur per Multicast.

Auf diese Weise ist sichergestellt, dass zunächst alle Modell-Objekte erzeugt und initialisert werden können, da dafür keine anderen Objekte bekannt sein müssen. Danach werden die Controller-Objekte erzeugt und initialisiert. Die Modell-Objekte, mit den die Controller kommunizieren, existieren zu diesem Zeitpunkt schon. Zu guter Letzt werden die View-Objekte erzeugt und initialisiert.

5.2 Homogene Kommunikationswelt: Reine Multicast-Kommunikation

Ein zweite Möglichkeit wäre, alle Objekte per Multicast-Nachrichten kommunizieren zu lassen. Allerdings sollten in diesem Fall die Empfänger-Objekte jeweils von dritter Stelle, das heißt vom Initialisierungs-Modul, beim Sender registriert werden. Außerdem müssten in den Multicast-Nachrichten alle wesentlichen Informationen mitgeschickt werden. Anderenfalls müsste beispielsweise ein Modell-Objekt alle Controller kennen, die mit diesen Modell-Objekt kommunizieren wollen: Entweder, um sich als Nachrichtenempfänger bei „seinen“ Controllern zu regisrieren, oder, um, sobald Nachrichten vom Controller eintreffen, nähere Informationen vom Controller einholen zu können, welche Änderungen am Modell eigentlich vorgenommen werden sollen.

6 Drei verschiedene Arten von MVCS-Pattern

6.1 Initialisierung mittels Singleton(s)

Bei diesem Pattern kommunizeren ebenfalls nur die Modell-Objekte mittels Multicast-Nachrichten. Die anderen Objekte kommunizieren mittels Unicast-Nachrichten.

Initialisiert werden alle Module mittels Zugriffen auf ein oder mehrere Singleton-Klassen.

Der Nachteil dieses Patterns ist, dass die Singleton-Klassen wie globale Variablen wirken. Daher sollte auf diese Art der Realisierung im Allgemeinen verzichtet werden.

Details siehe: DMVC-Pattern: Initialisierung mittels Singleton(s)

6.2 Initialisierung mittels Dependency Injection

Bei diesem Pattern kommunizeren nur die Modell-Objekte mittels Multicast-Nachrichten. Die anderen Objekte kommunizieren mittels Unicast-Nachrichten.

Initialisiert werden alle Module mittels Dependency Injection.

Der Nachteil dieses Patterns ist, dass View- und Controller-Module ihre Kommunikationspartner kennen müssen. Dies widerspricht dem Programmierprinzip, die Schnittstellen möglichst klein zu halten (small interfaces). Allerdings kann man dieses Problem abmildern, wenn man für jeden Kommunikationskanal eigene, möglichst schlanke Kommunikationsschnittstellen definiert.

Details siehe: MVC-Pattern: Initialisierung mittels Dependency Injection

6.3 Kommunikation ausschließlich mittels des Observer-Patterns

Bei diesem Pattern kommunizeren alle MVC-Objekte mittels Multicast-Nachrichten (die alle notwendigen Informationen beeinhalten, so dass der Empfänger nie beim Sender rückfragen muss).

Die Zuweisung der Nachrichten-Sender zu ihren Nachrichten-Empfängern erfolgt während der Initialisierungsphase von außerhalb. Das heißt, die einzelnen MVC-Objekte kennen einander nicht.

Der Nachteil dieses Patterns ist, dass die eine Multicast-Kommunikation weniger effizient ist, als eine Unicast-Kommunikation. In zeitkritischen Anwendungen kann dies evtl. zu Problemen führen.

Details siehe: MVC-Pattern: Kommunikation ausschließlich mittels des Observer Patterns

7 Quellen

  1. Gamma et al. (1995): Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides; Design Patterns – Elements of Reusable Object-Oriented Software; Auflage: 1; Verlag: Addison-Wesley Longman; Adresse: Amsterdam; ISBN: 0201633612; 1995; Quellengüte: 5 (Buch)
  2. Kowarschick (MMProg): Wolfgang Kowarschick; Vorlesung „Multimedia-Programmierung“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 3 (Vorlesung)

8 Siehe auch