Wir stellen zwei Vorgehensweisen zur Verwendung von Mustern des GoF-Typs dar: Musterausprägung und Musteridentifikation &endash entwerfen mit Mustern und flexibilisieren durch Muster. (Auch in [5], S.29ff ist ein Vorgehen zur Verwendung von Entwurfsmustern beschrieben).
Die Tätigkeit des Entwerfers bei der Musterausprägung ist das Zuordnen von erkannten Eigenschaften des Problembereichs auf die verallgemeinerte Sicht der Muster und umgekehrt. Im Gegensatz hierzu stehen bei der Musteridentifikation die Klassen und Beziehungen annähernd fest; der Entwurf ist schon relativ stabil. Der Einsatz von Mustern zu diesem Zeitpunkt kann aus der Unzufriedenheit mit bestimmten Eigenschaften des Entwurfs resultieren, beispielsweise einer mangelnden Flexibilität, und/oder aus dem Willen, einen Erkenntnisgewinn in den Entwurf einzubringen. Besonders hinsichtlich der Produktion wiederverwendbarer Einheiten (in diesem Kontext sind das Frameworks) eignet sich die nachträgliche Zuordnung von Mustern. Ordnet man die Vorgehensweisen in ein Phasenmodell ein, so erfolgt die Ausprägung von Mustern beim Übergang von der Analyse- zur Entwurfsphase. Die Identifizierung von Mustern im Entwurf steht am Ende des Entwurfs und kann auch aus der Implementierung heraus angestoßen werden.
Bild
1: Einordnung der Vorgehensweisen in ein Phasenmodell
Generell lassen sich die Vorgehensweisen in vier Arbeitsschritte unterteilen. Die ersten zwei sollen vor allem den Planungs- und Entwicklungsprozeß explizit machen; die Notation ist an [5] angelehnt, aber um Ausdrucksmittel für die Zuordnung zum Problembereich erweitert. Die entstehenden Diagramme im zweiten Schritt dienen vor allem der Kommunikation unter den Entwicklern und können "frei Hand" oder mit einem entsprechend konfigurierten grafischen Editor (z.B. VISIO) erstellt werden. Der Anspruch ist, daß sich der mit dem Problembereich vertraute Entwickler hier gleichermaßen zurechtfindet wie der Musterexperte. Die Schritte drei und vier stellen die Umsetzung der getroffenen Entscheidungen in einer Entwicklungsumgebung dar. Aus diesem Grund wurde auch die Notation gewechselt (Klassendiagramme der Entwicklungsumgebung objectiF). Zur Kennzeichnung der Musterausprägungen im Entwurf gibt es (noch) keine einheitliche Notation. Wir verwenden im Beispiel die Pattern-Role-Annotation von Gamma [4]. Die Annotation mit Rahmen (Venn-Diagramme) ist geeigneter, um das Zusammenspiel mehrerer Musterausprägungen darzustellen. Der Vorschlag in der UML V.0.9 erscheint uns zu überladen (Muster als Use Cases notiert).
Die zwei Vorgehen - Musterausprägung und Musteridentifikation - sind in der Beschreibung der Arbeitsschritte zusammengefaßt:
| 1) | Aus einem Musterbuch ein geeignetes Entwurfsmuster auswählen, bzw. in einem konkreten Entwurf einen Musterkandidaten identifizieren. Beide Tätigkeiten erfordern die Kenntnis von Mustern; je mehr Muster ein Entwerfer parat hat, desto häufiger wird er musterbasiert entwerfen, respektive Klassenstrukturen als Musterkandidaten identifizieren. |
| 2) | Übertragung des Musters in den
Entwurf. Bei der Musterausprägung geht es vor allem
um die Zuordnung der Klassen, Operationen und
Beziehungen: Wie heißen die Klassen des Musters im
Problembereich? Welche zusätzlichen Dienste werden in
die Klassen aufgenommen? Die allgemeinen Vorgaben des
Musters geben eine gute Richtschnur ab, Klassen nicht mit
mehreren Rollen zu überfrachten und die richtigen
Beziehungen zu wählen, analog dem Grad der Kopplung
zwischen den Klassen des Musters. Zuordnung der Entwurfskomponente auf das Muster. Bei der Musteridentifizierung steht die Frage, welche Rollen die Klassen des konkreten Entwurfs im Muster einnehmen und ob diese Zuordnung den gewünschten Effekt hat, im Vordergrund. Um die Annahmen genauer zu überprüfen, sollten auch die konkreten Operationen und Attribute zugeordnet werden. |
| 3) | Strukturelle Änderungen des
Musters bei der Ausprägung. Manchmal kann es
sinnvoll sein, ein Muster zu vereinfachen und Klassen
aber auch Beziehungen des Musters bei der Ausprägung
nicht oder verändert in den konkreten Entwurf zu
übernehmen. Strukturelle Veränderungen im Entwurf. Meist wird es erforderlich sein, den Entwurf durch im Muster vorhandene Klassen zu vervollständigen. Dies sind oft die abstrakten Klassen, die die Flexibilität und somit auch die Änderungsstabilität in einen Entwurf einbringen. |
| 4) | Technische Klassen einführen. Nachdem soweit eine Entsprechung zwischen Muster und Entwurf herbeigeführt wurde, ist es meist notwendig, weitere technische Klassen einzuführen. Beispiele hierfür sind Container-Klassen (Listen, Mengen) aus einer Klassenbibliothek. Auch eine Erweiterung der Klassenschnittstellen durch zusätzliche Dienste kann erforderlich sein (beispielsweise Laufzeittypüberprüfung: RTTI). |
Tabelle 1: Die vier Vorgehensschritte der Musterausprägung und der Musteridentifikation