22.11.2013 Aufrufe

Erweiterung einer Entwicklungsumgebung zur flexiblen Definition ...

Erweiterung einer Entwicklungsumgebung zur flexiblen Definition ...

Erweiterung einer Entwicklungsumgebung zur flexiblen Definition ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Erweiterung</strong> <strong>einer</strong> <strong>Entwicklungsumgebung</strong><br />

<strong>zur</strong> <strong>flexiblen</strong> <strong>Definition</strong>, Verwaltung<br />

und Visualisierung von Entwurfsmustern<br />

und deren Dokumentation<br />

Diplomarbeit<br />

<strong>zur</strong> Erlangung des akademischen Grades eines<br />

Magisters der Sozial- und Wirtschaftswissenschaften<br />

Vorgelegt an der<br />

Johannes Kepler Universität Linz<br />

Eingereicht bei<br />

a. Univ.-Prof. Dr. Johannes Sametinger<br />

(Arbeitsgruppe Software Engineering<br />

am Institut für Wirtschaftsinformatik)<br />

Andreas Wöckl (9755009)<br />

Seebach 5<br />

A-4560 Kirchdorf an der Krems<br />

8. Oktober 2002


Andreas Wöckl Diplomarbeit Software Engineering 2002 I<br />

Eidesstattliche Erklärung<br />

Ich erkläre an Eides statt, dass ich die Diplomarbeit mit dem Titel "<strong>Erweiterung</strong> <strong>einer</strong><br />

<strong>Entwicklungsumgebung</strong> <strong>zur</strong> <strong>flexiblen</strong> <strong>Definition</strong>, Verwaltung und Visualisierung von<br />

Entwurfsmustern und deren Dokumentation" selbstständig und ohne fremde Hilfe<br />

verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und alle<br />

den benutzten Quellen wörtlich oder sinngemäß entnommenen Stellen als solche<br />

kenntlich gemacht habe.<br />

Linz, den 8. Oktober 2002<br />

Andreas Wöckl


Andreas Wöckl Diplomarbeit Software Engineering 2002 II<br />

Inhaltsverzeichnis<br />

1 EINLEITUNG ...................................................................................................... 1<br />

1.1 Motivation ................................................................................................. 1<br />

1.2 Überblick................................................................................................... 2<br />

1.3 Gliederung................................................................................................. 3<br />

1.4 Schreibweise.............................................................................................. 4<br />

2 ENTWURFSMUSTER ........................................................................................ 5<br />

2.1 <strong>Definition</strong> .................................................................................................. 5<br />

2.1.1 Basiselemente................................................................................ 5<br />

2.1.2 Bestandteile................................................................................... 6<br />

2.2 Vorteile...................................................................................................... 8<br />

2.3 Nachteile.................................................................................................... 9<br />

2.4 Einteilung ................................................................................................ 10<br />

2.4.1 Buschmann.................................................................................. 10<br />

2.4.2 Gamma........................................................................................ 11<br />

2.4.3 Pree.............................................................................................. 12<br />

2.5 Programmiersprachen.............................................................................. 13<br />

2.6 Anti-Entwurfsmuster............................................................................... 14<br />

2.7 Zusammenfassung................................................................................... 15<br />

3 ERWEITERUNG DER ENTWICKLUNGSUMGEBUNG ECLIPSE.............. 16<br />

3.1 Exkurs: XML........................................................................................... 16<br />

3.1.1 Einführung .................................................................................. 16<br />

3.1.2 XML-Schema.............................................................................. 18<br />

3.1.3 Einsatz bei PSE-Admin............................................................... 20<br />

3.2 Eclipse ..................................................................................................... 20<br />

3.3 Plugins..................................................................................................... 21<br />

3.4 Inbetriebnahme von PSE-Admin ............................................................ 24<br />

3.4.1 Pfadstruktur................................................................................. 24<br />

3.4.2 Benötigte Komponenten ............................................................. 25<br />

3.4.3 Globale Konfigurationsdatei ....................................................... 26<br />

3.5 Zusammenfassung................................................................................... 27<br />

4 PSE-D - DEFINITION VON ENTWURFSMUSTERN.................................... 28<br />

4.1 Beispiel: Abstract Factory....................................................................... 28<br />

4.2 Rollen ...................................................................................................... 30


Andreas Wöckl Diplomarbeit Software Engineering 2002 III<br />

4.3 Struktur der Musterverwaltung ............................................................... 32<br />

4.4 Entwurfsziele........................................................................................... 33<br />

4.5 Allgemeine Beschreibung ....................................................................... 33<br />

4.5.1 Schema........................................................................................ 34<br />

4.5.2 <strong>Definition</strong> .................................................................................... 36<br />

4.6 Rollenbeschreibung................................................................................. 40<br />

4.6.1 Schema........................................................................................ 40<br />

4.6.2 <strong>Definition</strong> .................................................................................... 42<br />

4.7 Zusammenfassung................................................................................... 44<br />

5 PSE-D – IMPLEMENTIERUNGSBESCHREIBUNG...................................... 45<br />

5.1 Programmierschnittstellen....................................................................... 45<br />

5.1.1 Interne Datenstruktur .................................................................. 45<br />

5.1.2 Datenzugriff ................................................................................ 48<br />

5.1.3 Anwendungsbeispiel ................................................................... 49<br />

5.2 Initialisierung der Datenstruktur ............................................................. 54<br />

5.3 Zusammenfassung................................................................................... 57<br />

6 PSE-V - DARSTELLUNG VON ENTWURFSMUSTERN ............................. 58<br />

6.1 Struktur.................................................................................................... 58<br />

6.2 Entwurfsziele........................................................................................... 58<br />

6.3 Bedienung................................................................................................ 59<br />

6.4 Zusammenfassung................................................................................... 63<br />

7 PSE-V-IMPLEMENTIERUNGSBESCHREIBUNG......................................... 64<br />

7.1 Struktur.................................................................................................... 64<br />

7.2 Pakete ...................................................................................................... 65<br />

7.2.1 pattern.base.html ......................................................................... 65<br />

7.2.2 pattern.base.system ..................................................................... 66<br />

7.2.3 pattern.base.treeview................................................................... 66<br />

7.2.4 pattern.base.htmlview ................................................................. 67<br />

7.3 Ausgewählte Details................................................................................ 68<br />

7.3.1 Exkurs: XML-API's .................................................................... 68<br />

7.3.2 Zugriff auf globale Konfigurationsdatei ..................................... 71<br />

7.3.3 Zugriff auf Plugin-Eigeschaften.................................................. 73<br />

7.4 Zusammenfassung................................................................................... 74<br />

8 VERGLEICHBARE WERKZEUGE ................................................................. 75<br />

8.1 PBE.......................................................................................................... 75<br />

8.1.1 Aufbau der Musterdefinition....................................................... 76<br />

8.1.2 Initiales Codefragment................................................................ 76<br />

8.1.3 Variable Codeteile....................................................................... 77<br />

8.1.4 Parameter .................................................................................... 78


Andreas Wöckl Diplomarbeit Software Engineering 2002 IV<br />

8.1.5 Ausdrücke ................................................................................... 79<br />

8.1.6 Codeblöcke und Bedingungen .................................................... 81<br />

8.1.7 Einfügemarken ............................................................................ 81<br />

8.1.8 Verwaltung und Dokumentation................................................. 82<br />

8.2 FRED....................................................................................................... 82<br />

8.2.1 Rollen.......................................................................................... 82<br />

8.2.2 Einschränkungen......................................................................... 84<br />

8.2.3 Schablonen.................................................................................. 84<br />

8.2.4 Beispieldefinition Abstract Factory ............................................ 85<br />

8.2.5 Verwaltung und Dokumentation................................................. 87<br />

8.3 Vergleich ................................................................................................. 88<br />

8.3.1 Kriterien ...................................................................................... 88<br />

8.3.2 Ergebnisse ................................................................................... 90<br />

8.4 Zusammenfassung................................................................................... 92<br />

9 ZUSAMMENFASSUNG UND AUSBLICK .................................................... 93<br />

9.1 Zusammenfassung................................................................................... 93<br />

9.2 Ausblick .................................................................................................. 94<br />

ANHANG A: GLOSSAR ............................................................................................ 96<br />

ANHANG B: LITERATURVERZEICHNIS .............................................................. 99


Andreas Wöckl Diplomarbeit Software Engineering 2002 V<br />

Abbildungsverzeichnis<br />

Abbildung 1: Struktur von PSE...................................................................................... 2<br />

Abbildung 2: Beispiel für XML-Dokument [Kappel 2001a, 23]................................. 17<br />

Abbildung 3: Struktur von Eclipse [Eclipse 2002b, 10] .............................................. 21<br />

Abbildung 4: Aufbau plugin.xml von PSE-Admin...................................................... 22<br />

Abbildung 5: runtime-Elemente von plugin.xml ......................................................... 22<br />

Abbildung 6: requires-Elemente von plugin.xml......................................................... 22<br />

Abbildung 7: extension-Element von plugin.xml ........................................................ 23<br />

Abbildung 8: Schema für globale Konfigurationsdatei ............................................... 26<br />

Abbildung 9: Werte der globalen Konfigurationsdatei................................................ 27<br />

Abbildung 10: Allgemeine Architektur von Abstract Factory [Gamma 1995, 88] ..... 29<br />

Abbildung 11: Beispielarchitektur bei Anwendung von Abstract Factory.................. 30<br />

Abbildung 12: Struktur der Musterverwaltung von PSE-D......................................... 32<br />

Abbildung 13: Schema für allgemeinen Beschreibungsteil......................................... 34<br />

Abbildung 14: Allgemeine Beschreibung von Abstract Factory................................. 36<br />

Abbildung 15: Kategoriebeispiel 1 .............................................................................. 37<br />

Abbildung 16: Kategoriebeispiel 2 .............................................................................. 38<br />

Abbildung 17: Kategoriebeispiel 3 .............................................................................. 38<br />

Abbildung 18: Zusätzliches Kategorieelement ............................................................ 38<br />

Abbildung 19: HTML-Dokumentation für Abstract Factory....................................... 39<br />

Abbildung 20: XML-Schema der Rollenbeschreibung................................................ 41<br />

Abbildung 21: Rollenbeschreibung von Abstract Factory (1/2).................................. 42<br />

Abbildung 22: Rollenbeschreibung von Abstract Factory (2/2).................................. 43<br />

Abbildung 23: Klassendiagramm Datenstruktur von PSE-D ...................................... 46<br />

Abbildung 24: Klassendiagramm Datenzugriff von PSE-D ........................................ 48<br />

Abbildung 25: Kategoriedefinition Abstract Factory .................................................. 50


Andreas Wöckl Diplomarbeit Software Engineering 2002 VI<br />

Abbildung 26: Kategoriedefinition Interceptor............................................................ 50<br />

Abbildung 27: Kategoriedefinition Observer............................................................... 50<br />

Abbildung 28: Objektstruktur nach Ausführung von Quellcode 2 .............................. 51<br />

Abbildung 29: Objektstruktur nach Ausführung von Quellcode 3 .............................. 52<br />

Abbildung 30: Objektstruktur nach Ausführung von Quellcode 4 .............................. 53<br />

Abbildung 31: Objektstruktur nach Ausführung von Quellcode 5 .............................. 54<br />

Abbildung 32: Struktur von PSE-V ............................................................................. 58<br />

Abbildung 33: Auswahl von Views ............................................................................. 59<br />

Abbildung 34: Menüpunkt "Other" bei der Auswahl von Views ................................ 60<br />

Abbildung 35: View "Pattern Navigator" .................................................................... 61<br />

Abbildung 36: Dokumentation für Adapter dargestellt in "Pattern Browser" ............. 62<br />

Abbildung 37: Aufbau Implementierung von PSE-V.................................................. 64<br />

Abbildung 38: Konzept <strong>einer</strong> XML-API [Kappel 2001c, 4] ....................................... 69<br />

Abbildung 39: PBE-<strong>Definition</strong> von Entwurfsmustern [Delta 2002b, 6] ..................... 76


Andreas Wöckl Diplomarbeit Software Engineering 2002 VII<br />

Tabellenverzeichnis<br />

Tabelle 1: Teilergebnis Evaluierung Softwareprojekte [Pomberger 1998, 1.4] .......... 15<br />

Tabelle 2: Pfadstruktur PSE-Admin ............................................................................ 24<br />

Tabelle 3: Benötigte Dateien PSE-Admin ................................................................... 25<br />

Tabelle 4: Eigenschaften der Rolle AbstractProduct ................................................... 31<br />

Tabelle 5: Elemente des XML-Schemas...................................................................... 35<br />

Tabelle 6: Beispiel für description Element................................................................. 40<br />

Tabelle 7: Zusatzfunktionalitäten von PatternDescription........................................... 47<br />

Tabelle 8: Zugriffsmethoden von PatternAdmin ......................................................... 49<br />

Tabelle 9: Administrationsmethoden von PatternAdmin............................................. 49<br />

Tabelle 10: Methoden für die Musterinitialisierung .................................................... 55<br />

Tabelle 11: Parameterwerte für Abstract Factory........................................................ 78<br />

Tabelle 12: Operatoren von PBE [Delta 2002b, 13].................................................... 80<br />

Tabelle 13: Beispielmethoden von PBE [Delta 2002b, 14] ......................................... 80<br />

Tabelle 14: Beispiele f. Rollentypen von FRED-Mustern [Viljaama 2001, 53].......... 82<br />

Tabelle 15: Kardinalitäten von FRED-Mustern [Viljaama 2002, 54] ......................... 83<br />

Tabelle 16: Einschränkungen für Rollen [Viljaama 2002, 55] .................................... 84<br />

Tabelle 17: Beispielschablonen von FRED [Viljaama 2001, 56]................................ 84<br />

Tabelle 18: Beispielfunktionen von FRED [Viljaama 2001, 56]................................. 85<br />

Tabelle 19: Gesamtergebnis des Vergleichs ................................................................ 90


Andreas Wöckl Diplomarbeit Software Engineering 2002 VIII<br />

Quellcodeverzeichnis<br />

Quellcode 1: Generierter Code für AbstractFactory.................................................... 43<br />

Quellcode 2: Abarbeitung über PatternInfo-Liste........................................................ 50<br />

Quellcode 3: Abarbeitung über PatternCategory-Liste (1/3)....................................... 52<br />

Quellcode 4: Abarbeitung über PatternCategory-Liste (2/3)....................................... 52<br />

Quellcode 5: Abarbeitung über PatternCategory-Liste (3/3)....................................... 53<br />

Quellcode 6: Methode initialize() ................................................................................ 55<br />

Quellcode 7: Globale Deklarationen............................................................................ 71<br />

Quellcode 8: Methode fillHashtable().......................................................................... 71<br />

Quellcode 9: Methode getValue()................................................................................ 72<br />

Quellcode 10: Zugriff auf plugin.properties ................................................................ 73<br />

Quellcode 11: Initiales Codefragment für Abstract Factory........................................ 77<br />

Quellcode 12: <strong>Definition</strong> variabler Codeteile für Abstract Factory............................. 78<br />

Quellcode 13: Ergebniscode nach Anwendung des Entwurfsmusters......................... 79<br />

Quellcode 14: Ergebniscode bei Verwendung eines Verknüpfungsoperators............. 79<br />

Quellcode 15: Ergebniscode bei Entfernen der Leerzeichen ....................................... 80<br />

Quellcode 16: Ergebniscode bei wiederholbarem Codeblock ..................................... 81<br />

Quellcode 17: Beispieldefinition für FRED-Muster [Viljaama 2001, 54]................... 83<br />

Quellcode 18: FRED-<strong>Definition</strong> von Abstract Factory ............................................... 86


Andreas Wöckl Diplomarbeit Software Engineering 2002 IX<br />

Kurzfassung<br />

Entwurfsmuster stellen ein bewährtes Konzept <strong>zur</strong> Entwicklung objektorientierter<br />

Softwaresysteme dar. Sie kapseln das Wissen erfahrener Programmierer und stellen<br />

damit Lösungsvorschläge für grundlegende Entwurfsprobleme <strong>zur</strong> Verfügung. Um<br />

mit Entwurfsmustern werkzeugunterstützt zu arbeiten, ist es zuerst erforderlich, diese<br />

zu definieren und adäquat zu verwalten. Eine flexible, programmiersprachenunabhängige<br />

<strong>Definition</strong> der Muster ist dabei wünschenswert. Auch die Dokumentation der<br />

Entwurfsmuster sollte in beliebigen Formaten und Strukturen wählbar sein.<br />

Für diesen Zweck wurde als <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse das<br />

Werkzeug PSE-Base entwickelt, das Teil eines Gesamtwerkzeuges <strong>zur</strong> Unterstützung<br />

der Arbeit mit Entwurfsmustern (PSE – Pattern Support for Eclipse) ist. PSE-Base<br />

besteht aus zwei Teilen: PSE-D (Pattern Support for Eclipse – <strong>Definition</strong>) <strong>zur</strong> <strong>Definition</strong><br />

und Verwaltung der Muster und deren Dokumentation und PSE-V (Pattern<br />

Support for Eclipse – Visualisation) <strong>zur</strong> Navigation durch die interne Muster-Infrastruktur<br />

und <strong>zur</strong> Darstellung der Dokumentation.<br />

Diese Arbeit beschreibt den Aufbau, die Architektur, die Funktionalität und die Implementierung<br />

der Komponenten von PSE-Base. Den Abschluss bildet eine Beschreibung<br />

vergleichbarer Werkzeuge und eine Gegenüberstellung anhand verschiedener<br />

Kriterien.


Einleitung 1<br />

1 Einleitung<br />

Dieses Kapitel gibt eine Einleitung in diese Arbeit. Sie umfasst die Motivation, einen<br />

Überblick über das entwickelte Werkzeug, eine Gliederung und die Beschreibung der<br />

Schreibweise, die in dieser Arbeit verwendet wird.<br />

1.1 Motivation<br />

Bei der Entwicklung von objektorientierten Softwaresystemen werden häufig Muster<br />

von Problemlösungen verwendet, um einen <strong>flexiblen</strong> und eleganten Aufbau und damit<br />

auch die Wiederverwendbarkeit des Systems zu gewährleisten. Um diese Problemlösungen<br />

auch anderen Entwicklern <strong>zur</strong> Verfügung zu stellen, wurde das Konzept der<br />

Entwurfsmuster entwickelt. Sie stellen Lösungsvorschläge für bestimmte grundlegende<br />

Entwurfsprobleme dar und sind beim Aufbau <strong>einer</strong> <strong>flexiblen</strong> und wiederverwendbaren<br />

Systemarchitektur hilfreich.<br />

Entwurfsmuster bieten Unterstützung beim Entwurfsprozess und der Evaluierung bestehender<br />

Softwaresysteme. Bei der Evaluierung liegt es im Interesse des Entwicklers,<br />

bestehende Systeme auf die Verwendung von Entwurfsmustern zu untersuchen, um<br />

sich ein Bild über die Architektur zu machen. Diese so gewonnenen Informationen<br />

können bei <strong>einer</strong> Weiterentwicklung wertvoll sein. Um das Arbeiten mit Entwurfsmustern<br />

zu erleichtern, ist die Verwendung von Werkzeugen sinnvoll. Sie sollen die<br />

flexible <strong>Definition</strong> und Verwaltung, vor allem aber die Anwendung der Entwurfsmuster<br />

unterstützen. Die meisten derzeit existierenden Werkzeuge sind sogenannte<br />

stand alone Lösungen, d. h. die Integration in eine <strong>Entwicklungsumgebung</strong> fehlt.<br />

Das Ziel dieser Diplomarbeit ist die Entwicklung eines Werkzeuges <strong>zur</strong> <strong>flexiblen</strong><br />

<strong>Definition</strong>, Verwaltung und Visualisierung von Entwurfsmustern und deren Dokumentation<br />

auf der Basis von XML. Dieses Werkzeug soll als <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong><br />

Eclipse [Eclipse 2002a] entwickelt werden und Funktionalitäten<br />

für zwei Benutzergruppen bieten: Zum einen für Entwickler, die die vorhandenen<br />

Muster und deren Dokumentation betrachten und zum anderen für Werkzeugentwickler,<br />

die über Schnittstellen auf diese Datenstruktur zugreifen.


Einleitung 2<br />

1.2 Überblick<br />

Das entwickelte Werkzeug setzt sich aus verschiedenen Komponenten zusammen, die<br />

in Abbildung 1 illustriert werden.<br />

PSE<br />

PSE-Base<br />

PSE-Application<br />

PSE-D<br />

PSE-V<br />

Abbildung 1: Struktur von PSE<br />

Diese Arbeit beschränkt sich auf die Beschreibung von PSE-Base, das verantwortlich<br />

ist für die <strong>Definition</strong>, Verwaltung und Visualisierung von Entwurfsmustern und deren<br />

Dokumentation. PSE-Base ist Teil eines Gesamtwerkzeuges <strong>zur</strong> Unterstützung der<br />

Entwicklung mit Entwurfsmustern mit dem Namen PSE (Pattern Support for Eclipse).<br />

PSE wurde als <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse entwickelt. Ein Teil<br />

<strong>zur</strong> Anwendung von Entwurfsmustern (PSE-Application) wird in <strong>einer</strong> weiteren<br />

Diplomarbeit "<strong>Erweiterung</strong> <strong>einer</strong> Programmierumgebung <strong>zur</strong> Unterstützung patternbasierter<br />

Softwareentwicklung" [Mayr-Kern 2002] vorgestellt. PSE-Base besteht aus<br />

den Komponenten PSE-D (Pattern Support for Eclipse – <strong>Definition</strong>) und PSE-V<br />

(Pattern Support for Eclipse – Visualisation). PSE-D ist verantwortlich für die <strong>Definition</strong><br />

und Verwaltung der Muster und deren Dokumentation, PSE-V für die Visualisierung<br />

der Musternavigation und der Dokumentation.


Einleitung 3<br />

1.3 Gliederung<br />

Diese Diplomarbeit ist in folgende Kapitel gegliedert:<br />

Kapitel 2 – Entwurfsmuster gibt eine allgemeine Einführung in Entwurfsmuster und in<br />

die Vor- bzw. Nachteile bei deren Verwendung. Weiters wird der genaue Aufbau von<br />

Entwurfsmustern erläutert.<br />

Kapitel 3 - <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse – erläutert das Konzept<br />

und die <strong>Erweiterung</strong>smöglichkeiten der <strong>Entwicklungsumgebung</strong> Eclipse. Zusätzlich<br />

ist eine Einführung in XML und die genaue Inbetriebnahme von PSE-Base Teil dieses<br />

Kapitels.<br />

Kapitel 4 - PSE-D - <strong>Definition</strong> von Entwurfsmustern - beschreibt die <strong>Definition</strong> und<br />

Verwaltung von Entwurfsmustern sowie deren Dokumentation.<br />

Kapitel 5 - PSE-D – Implementierungsbeschreibung gewährt Einblick in die<br />

Implementierung von PSE-D. Weiters werden die Programmierschnittstellen für den<br />

Zugriff auf die verwalteten Muster beschrieben.<br />

Kaptiel 6 - PSE-V - Darstellung von Entwurfsmustern beschreibt die Bedienung des<br />

entwickelten Werkzeuges <strong>zur</strong> Visualisierung der durch PSE-D definierten Muster-<br />

Infrastruktur.<br />

Kapitel 7 – PSE-V-Implementierungsbeschreibung legt den Aufbau der Implementierung<br />

von PSE-V dar und beschreibt ausgewählte Implementierungsdetails.<br />

Kapitel 8 - Vergleichbare Werkzeuge beschreibt zwei weitere Werkzeuge <strong>zur</strong><br />

Musterunterstützung und führt anhand verschiedener Kriterien einen Vergleich durch.<br />

Kapitel 9 - Zusammenfassung und Ausblick fasst die Erkenntnisse dieser Arbeit<br />

zusammen und gibt einen Ausblick über <strong>Erweiterung</strong>smöglichkeiten von PSE-Base.


Einleitung 4<br />

1.4 Schreibweise<br />

Wörtliche Zitate, explizite Wertangaben sowie Pfade werden unter Hochkomma gestellt.<br />

Beispiel: "Die Betrachtungsweise beeinflusst die Auffassung was ein Muster ist und<br />

was nicht.", "e:\eclipse\patternFiles"<br />

Fachbegriffe sowie Verweise auf Stellen in diesem Dokument und die Titel im<br />

Literaturverzeichnis werden kursiv geschrieben.<br />

Beispiel: siehe Kapitel 2<br />

Für Quellcodebeispiele (alle in der Programmiersprache Java), XML- und HTML-<br />

Beispiele wird Courier New, Schriftgröße 10, Schriftfarbe dunkelgrau verwendet:<br />

Beispiel: public class AbstractFactory{}<br />

Die Darstellung von Klassendiagrammen orientiert sich am UML-Standard [OMG<br />

2002].<br />

Beispiel:<br />

«interface»<br />

Schnittstellenname<br />

+methode_öffentlich()<br />

Klassenname<br />

+methode_öffentlich()<br />

Grundsätzlich werden deutsche Begriffe verwendet, da jedoch die Implementierung<br />

und die Benutzerdokumentation in Englisch vorliegen, werden <strong>zur</strong> Beschreibung<br />

dieser Teile auch englische Begriffe eingesetzt. Dies gilt auch für die Bezeichnungen,<br />

der in der Literatur vorhandenen Entwurfsmuster.


Entwurfsmuster 5<br />

2 Entwurfsmuster<br />

In diesem Kapitel werden die Grundlagen von Entwurfsmustern beschrieben. Es wird<br />

dargelegt, welche Arten von Mustern man in der Literatur vorfindet und welche Vorbzw.<br />

Nachteile die Verwendung mit sich bringt. Weiters wird begründet, warum sie in<br />

der objektorientierten Softwareentwicklung eine so große Rolle spielen. Zumal die<br />

Verwendung von PSE-D auf die <strong>Definition</strong> und Verwaltung von Entwurfsmustern<br />

zielt, wird auch der genaue Aufbau eines solchen erörtert. Den Abschluss dieses Kapitels<br />

bildet die Diskussion der Programmiersprachenunabhängigkeit von Mustern und<br />

eine kurze Einführung in den Begriff der Anti-Entwurfsmuster.<br />

2.1 <strong>Definition</strong><br />

Chistopher Alexander definiert den Begriff Muster folgendermaßen: "Jedes Muster<br />

beschreibt zunächst ein in unserer Umwelt immer wieder auftretendes Problem, beschreibt<br />

dann den Kern der Lösung dieses Problems, und zwar so, dass man diese Lösung<br />

millionenfach anwenden kann, ohne sich je zu wiederholen" [Alexander 1995,<br />

X]. Obwohl Alexander von Mustern in Gebäuden und Städten spricht, gilt seine<br />

<strong>Definition</strong> auch für Entwurfsmuster in der Softwareentwicklung. Der Ausgangspunkt<br />

ist immer ein Problem, für das eine Lösung in einem bestimmten Umfeld gesucht<br />

wird, mit dem Ziel, diese Lösung so allgemein wie möglich zu halten, um sie in den<br />

verschiedensten ähnlichen Ausgangssituationen wieder einsetzen zu können.<br />

2.1.1 Basiselemente<br />

Laut [Gamma 1995, 3] besteht ein Entwurfsmuster aus den folgenden vier allgemeinen<br />

Basiselementen:<br />

Mustername<br />

Der Name eines Musters soll helfen, das Problem, seine Lösung und Konsequenzen in<br />

einem oder zwei Wörter grob zu beschreiben. Durch die sorgfältige Vergabe von passenden<br />

Namen bildet sich mit der Zeit ein gut wiederverwendbares Entwurfsvokabular.<br />

Entwickler, die dieses Vokabular verwenden, können damit Softwaresysteme auf<br />

<strong>einer</strong> höheren Abstraktionsebene entwerfen. Auch das Dokumentieren solcher Systeme<br />

und der Erfahrungsaustausch mit anderen Entwicklern wird durch einen gemein-


Entwurfsmuster 6<br />

samen Sprachschatz erleichtert. Bei der Entwicklung neuer Entwurfsmuster sollte daher<br />

erhöhte Aufmerksamkeit auf die Vergabe der Namen gelegt werden.<br />

Problem<br />

Jedem Entwurfsmuster liegt ein Problem zugrunde. Erst mit der Beschreibung des<br />

Problems und des ihm zugrunde liegendem Kontexts wird die Anwendung des<br />

Musters ersichtlich. Die Beschreibung kann spezielle Entwurfsprobleme wie die Repräsentation<br />

von Algorithmen oder Objekten betreffen, oder aber auch inflexible Klassen-<br />

und Objektstrukturen aufzeigen. Manchmal enthält die Problembeschreibung<br />

einige Bedingungen die zutreffen müssen, um das Muster anzuwenden.<br />

Lösung<br />

Die Lösung beschreibt die Entwurfselemente, ihre Verbindungen und Abhängigkeiten<br />

zueinander, die <strong>zur</strong> Problemlösung verwendet werden können. Sie beschreibt keinen<br />

konkreten Entwurf und keine spezielle Implementierung, da ein Muster wie eine<br />

Schablone, anwendbar in den verschiedensten Situationen, verwendet werden soll. Ein<br />

Muster bietet eine Lösung auf <strong>einer</strong> höheren Abstraktionsebene. Es beschreibt wie<br />

eine allgemeine Anordnung von Klassen und Objekten ein Problem lösen kann.<br />

Konsequenzen<br />

Die Konsequenzen zeigen die Vor- und Nachteile bei Anwendung eines Musters auf.<br />

Es ist wichtig, die Auswirkungen auf Flexibilität, Erweiterbarkeit und Portabilität eines<br />

Softwaresystems zu verstehen, denn nur die Auseinandersetzung mit den Konsequenzen<br />

erlaubt die Auswahl geeigneter Entwurfsalternativen.<br />

2.1.2 Bestandteile<br />

Neben der <strong>Definition</strong> eines Entwurfmusters ist für die Entwicklung <strong>einer</strong> Datenstruktur<br />

vor allem auch der genaue Aufbau wichtig. [Gamma 1995, 6-7] beschreibt eine<br />

Systematik, laut der ein Entwurfsmuster aus folgenden 14 Teilen besteht:<br />

1. Name: Die Vergabe eines sprechenden Namens ist <strong>einer</strong> der wichtigsten Aspekte<br />

bei der <strong>Definition</strong> eines Musters. Um ein gutes Entwurfsvokabular zu<br />

entwickeln, sollte dieser sorgfältig gewählt werden<br />

2. Klassifizierung: Zeigt, ob ein Muster eher Klassen oder Objekte <strong>zur</strong> Problemlösung<br />

verwendet. Klassenmuster befassen sich mit den Beziehungen<br />

von Klassen und deren Subklassen, die durch Vererbung erzielt werden. Sie<br />

stellen daher statische Strukturen (<strong>zur</strong> Laufzeit gebunden) dar. Objektmuster<br />

arbeiten mit den Beziehungen von Objekten (Komposition), die <strong>zur</strong> Laufzeit


Entwurfsmuster 7<br />

geändert werden können. Sie werden daher als dynamische Strukturen bezeichnet.<br />

3. Absicht: Die Absicht sollte in <strong>einer</strong> kurzen Aussage folgende Fragen beantworten:<br />

Was macht das Entwurfsmuster? Was ist seine Absicht? Welches<br />

spezielle Entwurfsproblem spricht es an?<br />

4. Bekannt als: Andere bekannte Namen für das Entwurfsmuster.<br />

5. Motivation: Enthält eine detaillierte Beschreibung des Entwurfsproblems<br />

und wie das Zusammenspiel von Klassen und Objekten dieses Problem lösen<br />

kann.<br />

6. Anwendbarkeit: Befasst sich mit der Frage, in welchen Situationen das<br />

Muster anwendbar ist und wie man diese Situationen erkennt.<br />

7. Struktur: Eine graphische Repräsentation der Klassen in OMT-Notation<br />

(Object Modeling Technique) [Rumbaugh 1991]. Da die Weiterentwicklung<br />

von OMT – UML (Unified Modeling Language) erst im November 1997<br />

[Kappel 2001a] anerkannt wurde (nach der Veröffentlichung von [Gamma<br />

1995]!), ist sinngemäß auch eine Repräsentation der Klassen in UML zulässig.<br />

8. Rollen: Klassen und/oder Objekte inklusive deren Abhängigkeiten, die <strong>zur</strong><br />

Lösung des Entwurfsproblems benötigt werden.<br />

9. Kollaboration: Zeigt, wie die Rollen bei der Problemlösung zusammenarbeiten.<br />

10. Konsequenzen: Beschreiben die Vor- bzw. Nachteile bei Anwendung des<br />

Entwurfsmusters. Weiters zeigen sie strukturelle Auswirkungen auf das zu<br />

entwickelnde Softwaresystem auf.<br />

11. Implementierung: Gibt Hinweise, welche Programmiertechniken verwendet<br />

werden sollen, bzw. welche Gefahren bei der Anwendung falscher Techniken<br />

auftreten können. Die Implementierung beschäftigt sich auch mit programmiersprachenabhängigen<br />

Details.<br />

12. Beispielcode: Besteht aus Codeteilen <strong>einer</strong> beliebigen Programmiersprache,<br />

die dem Entwickler eine Möglichkeit <strong>zur</strong> Implementierung des Musters aufzeigen<br />

sollen.


Entwurfsmuster 8<br />

13. Bekannte Anwendungen: Zeigt Beispiele <strong>zur</strong> Verwendung dieses Musters<br />

in realen Softwaresystemen. Empfohlen wird, zumindest zwei Beispiele aus<br />

verschiedenen Anwendungsgebieten darzulegen.<br />

14. Ähnliche Muster: Gibt an, welche Muster einen ähnlichen Aufbau haben,<br />

bzw. mit verwendet werden sollen.<br />

2.2 Vorteile<br />

Entwurfsmuster sollen helfen, den Entwurf von Softwaresystemen zu verbessern bzw.<br />

flexibler zu gestalten. Welche speziellen Vorteile bringt daher die Anwendung von<br />

Mustern mit sich? In [Chambers 2000, 278] werden vier wesentliche extrahiert:<br />

Wiederverwendung des Entwurfs<br />

Unter Wiederverwendung versteht man normalerweise der vermehrten Einsatz des<br />

gleichen Quellcodes. Die Wiederverwendung des Entwurfs ist jedoch um einiges<br />

mächtiger und bringt oft die des Quellcodes mit sich. Der Vorteil liegt in der höheren<br />

Abstraktionsebene des Entwurfs, durch die entworfene Komponenten in den verschiedensten<br />

Situationen wieder einsetzbar sind. Dadurch wird der Aufbau <strong>einer</strong> flexibleren<br />

Architektur und somit die Wiederverwendung von Komponenten in anderen Systemen<br />

unterstützt.<br />

Einführung eines allgemein gültigen Entwurfsvokabulars<br />

Wie schwierig wäre es wohl für Entwickler, über Softwarearchitektur zu diskutieren,<br />

ohne bekannte Begriffe wie z. B: stack oder hash table verwenden zu können. Ohne<br />

dieses Vokabular müssten Entwickler jedes Mal viel Zeit aufwenden, um ihre Datenstrukturen,<br />

Algorithmen usw. zu erklären. Durch die Verwendung allseits bekannter<br />

Begriffe bleibt ihnen diese Zeit erspart. Sinngemäß ist es auch leichter, über eine Architektur<br />

zu diskutieren, wenn <strong>Definition</strong>en wie Abstract Factory, Builder oder Composite,<br />

um nur einige Muster zu nennen, vielen Entwicklern ein Begriff sind. Ein allgemein<br />

bekanntes Entwurfsvokabular erleichtert somit die Kommunikation zwischen<br />

Softwareentwicklern.<br />

Verbesserung der Dokumentation<br />

Eine präzise Dokumentation der im Softwaresystem verwendeten Entwurfsmuster<br />

kann Entwicklern helfen, sich leichter einen Überblick über die Architektur zu verschaffen,<br />

auch wenn die verwendeten Muster vorher noch unbekannt waren.


Entwurfsmuster 9<br />

Restrukturierung von Softwaresystemen<br />

Systeme, die mit Hilfe von Entwurfmustern entwickelt wurden, erleichtern ihre Restrukturierung<br />

oder Transformation in Systeme anderer Anwendungsgebiete. Dieser<br />

Effekt wird durch die Wiederverwendbarkeit der entwickelten Komponenten erzielt.<br />

Entwurfsmuster spielen somit eine große Rolle bei der Entwicklung von Softwaresystemen.<br />

Ihr größter Vorteil ist wohl, dass sie das Wissen von erfahrenen Programmierern<br />

kapseln und es somit anderen zu Verfügung stellen [Agerbo 1998, 134]. Je<br />

mehr Entwickler dieses Wissen verwenden und in ihre Systemarchitektur einbauen,<br />

desto flexibler und wiederverwendbarer werden diese Systeme.<br />

2.3 Nachteile<br />

Obwohl Entwurfsmuster einige überzeugende Vorteile aufweisen, bringt ihre Anwendung<br />

auch Nachteile mit sich. [Helm 1995, 339-340] identifiziert folgende:<br />

Naive Anwendung<br />

Entwurfsmuster können zu <strong>einer</strong> überschwänglichen und naiven Anwendung animieren.<br />

Einige Entwickler sind bei der Konzeption ihrer Systeme nur mehr darauf bedacht,<br />

möglichst viele Muster ohne Rücksicht auf positive und negative Effekte einzusetzen.<br />

Sie bedenken nicht, dass Muster nicht alle Probleme lösen können und dass<br />

<strong>zur</strong> Anwendung ein Auseinandersetzen mit den positiven und negativen Auswirkungen<br />

nötig ist.<br />

Kluft zwischen Analyse und Umsetzung<br />

Vor der Anwendung eines Entwurfsmusters muss dessen Vorschlag <strong>zur</strong> Problemlösung<br />

analysiert werden. Nur so kann die Verwendung das zu entwickelnde System<br />

flexibler gestalten. Oft erkennt man jedoch bei der Analyse, dass ein Muster zwar ungefähr<br />

in der beschriebenen Form verwendet werden kann, jedoch einige Adaptierungen<br />

für den Einsatz im System erfordert. Diese Kluft bei der Umsetzung entsteht<br />

durch den allgemeinen Problemlösungscharakter von Entwurfsmustern.<br />

Abstimmung mit anderen Ansätzen<br />

Das Abstimmen eines musterbasierten Systems mit einem durch objektorientierte<br />

Entwurfsmethoden entwickeltem System ist schwierig. Entwurfsmuster stützen sich<br />

auf bereits fundiertes Wissen; Entwurfsmethoden beschäftigen sich hingegen mehr<br />

mit den einzelnen Schritten von der Analyse bis zum fertigen Entwurf. Dieser Unterschied<br />

in den Ansätzen erschwert einen Abstimmprozess.


Entwurfsmuster 10<br />

Unsicherheit in der Anwendung<br />

Bei der Entwicklung eines Systems ist es oft nicht eindeutig, ob ein bzw. welches<br />

Muster angewendet werden kann, da eine konkrete Formulierung eines Entwurfsproblems<br />

in den Anfangsphasen häufig nicht möglich ist. Erst im weiteren Entwicklungsprozess<br />

werden die Probleme und somit auch die Möglichkeiten <strong>zur</strong> Musteranwendung<br />

klarer.<br />

Diese Nachteile sollten bei der Anwendung von Entwurfsmustern berücksichtigt werden,<br />

um negative Auswirkungen auf das zu entwickelnde System zu vermeiden.<br />

2.4 Einteilung<br />

Nach der <strong>Definition</strong> von Entwurfsmustern und deren Bestandteilen stellt sich nun die<br />

Frage, welche derzeit in der Literatur existieren und in welche Kategorien diese einteilbar<br />

sind. Laut [Gamma 1995, 3] ist das Empfinden <strong>einer</strong> Problemlösung als Muster<br />

subjektiv, daher ist es nicht einfach, eine Einteilung für sie zu finden. In den folgenden<br />

Abschnitten werden drei Ansätze <strong>zur</strong> Einteilung von Entwurfsmustern vorgestellt.<br />

2.4.1 Buschmann<br />

Die Autoren von [Buschmann 2000] identifizieren die vier folgenden Kategorien von<br />

Entwurfsmustern:<br />

Dienstzugriffs- und Konfigurationsmuster<br />

Diese Kategorie umfasst vier Muster <strong>zur</strong> effektiven Entwicklung von Programmierschnittstellen<br />

(application programming interfaces – API's), um Dienste und Komponenten<br />

in alleinstehenden, aber auch vor allem in Netzwerksystemen zu konfigurieren.<br />

Die Notwendigkeit solcher Muster begründet sich im heterogenen Charakter von<br />

Netzwerksystemen, da hier spezielle Mechanismen entwickelt werden müssen, um die<br />

einzelnen Dienste und Komponenten zu adressieren und zu konfigurieren.<br />

Beispiel: Das Muster Interceptor erlaubt es, Frameworks 1 mit beliebigen zusätzlichen<br />

Diensten zu versehen, z. B. ein Framework <strong>zur</strong> Entwicklung von Netzwerk-<br />

1 Ein Framework ist eine Ansammlung von Klassen, welche einen abstrakten Entwurf für Lösungen zu<br />

<strong>einer</strong> Familie verwandter Probleme enthalten. Der Programmierer muss nur Codes schreiben, wenn er<br />

das Verhalten des Framework verändern oder erweitern will [Freiberg 2002].


Entwurfsmuster 11<br />

komponenten mit zusätzlichen Diensten wie Logging und Transaktionskontrolle.<br />

Ereignisbasierende Muster<br />

Muster <strong>zur</strong> Entwicklung ereignisbasierender Systeme sind vor allem im Netzwerkbereich<br />

anzusiedeln. Sie unterstützen das Initialisieren, Empfangen, Verschicken und<br />

Verarbeiten von Ereignissen und haben dadurch in der netzwerkbasierenden Softwareentwicklung<br />

einen hohen Stellenwert erhalten.<br />

Beispiel: Reactor kann verwendet werden, um Anfragen mehrerer Klienten an eine<br />

Anwendung zu steuern.<br />

Synchronisationsmuster<br />

Diese Muster unterstützen das Sperren von Objekten in Multi-Prozess-Systemen. Das<br />

Entwickeln solcher Systeme ist um einiges aufwendiger als das Entwickeln sequentieller,<br />

da die Objekte von mehreren Prozessen bearbeitet und verändert werden können.<br />

Ein ausgeklügeltes Sperrverfahren ist daher <strong>zur</strong> Realisierung notwendig.<br />

Beispiel: Das Muster Strategized Locking ist zuständig für die Steuerung des Synchronisationsmechanismus<br />

kritischer Sektionen <strong>einer</strong> Komponente.<br />

Gleichzeitigkeitsmuster<br />

Muster dieser Kategorie beschäftigen sich mit der Entwicklung <strong>einer</strong> Architektur, die<br />

das reibungslose Zusammenspiel mehrerer Prozesse garantiert. Diese hat starken Einfluss<br />

auf die Performanz von Multi-Prozess-Systemen.<br />

Beispiel: Monitor Objekt synchronisiert die Ausführung gleichzeitig aufgerufener<br />

Methoden innerhalb eines Objektes und garantiert somit, dass zu einem<br />

Zeitpunkt immer nur eine Methode ausgeführt wird.<br />

2.4.2 Gamma<br />

Die in [Gamma 1995] identifizierten Kategorien gliedern sich in folgende Bereiche:<br />

Erzeugungsmuster<br />

Erzeugungsmuster sind verantwortlich für die Abstraktion des Instanzierungsprozesses.<br />

Sie befassen sich mit der Erzeugung von Objekten und helfen dabei, ein System<br />

unabhängig davon zu machen, wie seine Objekte erzeugt, zusammengesetzt und repräsentiert<br />

werden. Erzielt wird dies durch ein Verstecken des Instanzierungsprozesses.<br />

Erzeugungsmuster ermöglichen dadurch zu bestimmen, welche Objekte wer, wann<br />

und wie erzeugt.


Entwurfsmuster 12<br />

Beispiel: Mit dem Muster Abstract Factory wird eine Schnittstelle bereitgestellt, um<br />

verwandte Objekte ohne deren genauere Spezifikation zu erzeugen. Eine<br />

Anwendung arbeitet nur mit den Schnittstellen, daher können Komponenten<br />

beliebig ausgetauscht werden.<br />

Strukturmuster<br />

Strukturmuster beschäftigen sich mit dem Problem, wie Klassen und Objekte zusammenarbeiten<br />

müssen, um größere Strukturen zu formen. Klassenmuster verwenden<br />

Vererbung für den Aufbau von Strukturen, Objektmuster die Komposition von Objekten.<br />

Der Vorteil bei Objektmustern liegt in der Konfigurierbarkeit <strong>zur</strong> Laufzeit,<br />

womit sie variabler als statische Konstruktionen sind.<br />

Beispiel: Das Objektmuster Composite ermöglicht es Teil-Ganzes Hierachien abzubilden,<br />

wobei ein Teilobjekt genauso wie eine Komposition von Objekten<br />

behandelt werden kann, z. B. ein Grafikeditor, wo die Bearbeitung einzelner<br />

Bilder genau wie die <strong>einer</strong> Gruppierung von Bildern abläuft.<br />

Verhaltensmuster<br />

Verhaltensmuster beschäftigen sich mit Algorithmen und der Zuweisung von Zuständigkeiten<br />

zu Objekten. Sie befassen sich nicht nur mit der Struktur von Klassen und<br />

Objekten, sondern auch mit deren Interaktion.<br />

Beispiel: Mit dem Muster Observer können Abhängigkeiten unter Objekten definiert<br />

werden, sodass beim Ändern des Status eines Objektes alle abhängigen Objekte<br />

benachrichtigt werden und ebenfalls ihren eigenen Status ändern können.<br />

2.4.3 Pree<br />

Wolfgang Pree behandelt in [Pree 1994] folgende drei Kategorien von Entwurfsmustern:<br />

Objektorientierte Muster<br />

Objektorientierte Muster befassen sich mit dem Zusammenwirken von Klassen und<br />

Objekten.<br />

Beispiel: Das Muster ItemDescriptor definiert, wie Abhängigkeiten unter Objekten<br />

allgemein verwirklicht werden können. Observer ist somit als eine <strong>Erweiterung</strong><br />

von ItemDescriptor anzusehen.


Entwurfsmuster 13<br />

Codemuster<br />

Codemuster stellen Problemlösungen dar, die nur <strong>einer</strong> Programmiersprache zugeordnet<br />

werden können. Sie sind also nicht allgemein für alle Sprachen verwendbar, sondern<br />

spezialisieren sich auf eine Problemlösung für eine bestimmte Programmiersprache.<br />

Beispiel: Pree stellt ein C++-Codemuster aus [Coplien 1992] vor, dass statische Deklaration<br />

von Variablen der dynamischen Bindung vorzieht. Ein expliziter<br />

Name für das Muster wird dabei nicht vergeben.<br />

Framework-Adaptierungsmuster<br />

Diese Muster befassen sich mit Problemlösungen für die Adaptierung von Frameworks.<br />

Bei der Entwicklung von Softwaresystemen bilden oft Frameworks die Basis<br />

und werden je nach Anforderungen modifiziert und adaptiert. Adaptierungsmuster<br />

unterstützen genau diesen Prozess.<br />

Beispiel: Pree beschreibt ein Muster <strong>zur</strong> Generierung von Dokumenten mit dem Grafik-Framework<br />

ET++, vergibt jedoch keinen expliziten Namen für das Entwurfsmuster.<br />

Diese drei Ansätze zeigen einige Möglichkeiten <strong>zur</strong> Kategorisierung von Entwurfsmustern,<br />

wobei einige Unterschiede festgestellt werden können. Gamma geht mit seinen<br />

Kategorien Erzeugungsmuster, Strukturmuster und Verhaltensmuster auf die verschiedenen<br />

Arten von Entwurfsmustern ein. Buschmann ist mit s<strong>einer</strong> Kategorisierung<br />

im Netzwerkbereich anzusiedeln und unterscheidet innerhalb dieses Bereiches nach<br />

Kategorien. Pree bezieht im Gegensatz zu den anderen beiden auch Codemuster in<br />

seine Kategorisierung ein, fasst hingegen jedoch alle objektorientierten Muster zu<br />

<strong>einer</strong> Kategorie zusammen.<br />

Im weiteren Verlauf dieser Arbeit wird der Ansatz von [Gamma 1995] als Basis und<br />

Richtlinie für die Entwicklung des Werkzeuges PSE-Base angesehen, zumal dieser in<br />

der Literatur am häufigsten erwähnt wird und auch für die Entwicklung <strong>einer</strong> Datenstruktur<br />

am sinnvollsten erscheint.<br />

2.5 Programmiersprachen<br />

Wie in Abschnitt 2.4 ersichtlich, gibt es nicht nur allgemein gültige, sondern auch programmiersprachenabhängige<br />

Entwurfsmuster, z. B. Codemuster von [Pree 1994].<br />

Damit stellt sich die Frage nach den Spracheigenschaften von Entwurfsmustern. Sol-


Entwurfsmuster 14<br />

len sie für jede objektorientierte Programmiersprache gültig sein, oder sich auf die<br />

Anwendung in <strong>einer</strong> Sprache beschränken? [Agerbo 1998, 135-136] identifiziert bei<br />

<strong>einer</strong> Programmiersprachenabhängigkeit folgende Nachteile:<br />

‣ Die Kommunikation bzw. Diskussion der Muster über die Grenzen von Programmiersprachen<br />

hinaus wird zwangsläufig komplizierter.<br />

‣ Wenn das gleiche Muster unter verschiedenen Namen in verschiedenen Programmiersprachen<br />

existiert, fällt es schwerer diese miteinander zu vergleichen,<br />

da die verwendete Programmiersprache auch einen Einfluss auf die<br />

Verwendung des Musters hat.<br />

‣ Entwickler sind gezwungen eine Reihe neuer Entwurfsmuster zu lernen, sofern<br />

sie mit <strong>einer</strong> anderen Programmiersprache konfrontiert werden.<br />

‣ Sprachabhängige Muster können mit der Zeit fehlende Möglichkeiten in der<br />

Programmiersprache verschleiern. Bspw. wird in Java Mehrfachvererbung<br />

nicht unterstützt, lässt sich jedoch durch geschickten Entwurf nachbilden.<br />

Entwurfsmuster sollten generell sprachunabhängig sein. [Agerbo 1998, 136] führt <strong>zur</strong><br />

Abgrenzung den Begriff Fundamentale Entwurfsmuster für jene Muster ein, die in<br />

allen gängigen objektorientierten Programmiersprachen verwendet werden können.<br />

Alle anderen werden unter dem Begriff Sprachabhängige Entwurfsmuster zusammengefasst.<br />

Eine genaue Zuordnung von Mustern zu diesen Bereichen wird von ihm jedoch<br />

nicht vorgenommen.<br />

2.6 Anti-Entwurfsmuster<br />

In den vorigen Abschnitten wurde erläutert, was Entwurfsmuster sind, welche Vorteile<br />

sie haben, wie man sie einteilt usw. Bei der Recherche nach Entwurfsmustern wird<br />

man zwangsläufig aber auch auf den Begriff Anti-Entwurfsmuster stoßen. Diese zeigen<br />

Wege, wie man von <strong>einer</strong> Problemdefinition zu <strong>einer</strong> schlechten Lösung gelangt<br />

[Anti Pattern 2002]. Anti-Entwurfsmuster besitzen laut [McCormick 1998] die folgenden<br />

Eigenschaften:<br />

‣ Anti-Entwurfsmuster sind negative Lösungen, die mehr Probleme aufdecken<br />

als sie lösen können.<br />

‣ Sie sind eine natürliche <strong>Erweiterung</strong> zu gewöhnlichen Entwurfsmustern.


Entwurfsmuster 15<br />

‣ Anti-Entwurfsmuster überbrücken durch ihre Problemlösungen die Kluft<br />

zwischen den Software-Architekturkonzepten und der Implementierung.<br />

‣ Das Verstehen der Anti-Entwurfsmuster stattet uns mit dem nötigen Wissen<br />

aus, sie zu vermeiden, oder aus deren negativen Problemlösungen heraus<br />

wieder zu <strong>einer</strong> positiven Lösung zu gelangen.<br />

Obwohl nach der <strong>Definition</strong> der Eigenschaften der Anti-Entwurfsmuster der Eindruck<br />

entsteht, dass diese eigentlich nur <strong>zur</strong> Abschreckung dienen und daher von Entwicklern<br />

vermieden werden sollten, können sie dennoch bei der Entwicklung von Softwaresystemen<br />

hilfreich sein. Tabelle 1 zeigt bspw. ein Teilergebnis <strong>einer</strong> Studie über<br />

den Erfolg von Softwareprojekten, in der nur ein geringer Anteil der Projekte termintreu<br />

bzw. kostentreu abgeschlossen wurde.<br />

(Plan-) Termintreue abgeschlossen 2 von 16<br />

(Plan-) Kostentreue abgeschlossen 1 von 16 (max. Abweichung 4,5)<br />

Tabelle 1: Teilergebnis Evaluierung Softwareprojekte [Pomberger 1998, 1.4]<br />

Die in diesen Projekten begangenen Fehler sind sehr wertvoll, indem sie uns aufzeigen,<br />

mit welchen Vorgehensweisen und Problemlösungsverfahren man auf keinen Fall<br />

die gesetzten Ziele (in diesem Fall Termin- und Kostentreue) erreicht. Diese Fehler<br />

gilt es zu analysieren und in Zukunft zu vermeiden. Der Prozess der Analyse kann als<br />

"Studie von Anti-Entwurfsmustern" angesehen werden.<br />

2.7 Zusammenfassung<br />

Dieses Kapitel beschäftigte sich mit <strong>einer</strong> Einführung in Entwurfsmuster. Es zeigte<br />

auf, dass sich die Verwendung vor allem auf die Flexibilität, Wiederverwendbarkeit<br />

und Portabilität positiv auswirkt. Weiters wurden Ansätze <strong>zur</strong> Kategorisierung der<br />

Entwurfsmuster erläutert, wobei sich herausstellte, dass in der Literatur die Kategorisierung<br />

nach verschiedenen Gesichtspunkten vorgenommen wird. Bei der Diskussion<br />

der Programmiersprachenunabhängigkeit wurde festgestellt, dass bei Bindung an eine<br />

Sprache einige Nachteile auftreten. Den Abschluss bildete eine Einführung in Anti-<br />

Entwurfsmuster, die dabei helfen sollen, aus schlechten Problemlösungen zu lernen<br />

und begangenen Fehler in Zukunft zu vermeiden.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 16<br />

3 <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong><br />

Eclipse<br />

In diesem Kapitel werden das Konzept und die <strong>Erweiterung</strong>smöglichkeiten der <strong>Entwicklungsumgebung</strong><br />

Eclipse [Eclipse 2002a] vorgestellt. Da PSE-Admin als <strong>Erweiterung</strong><br />

von Eclipse implementiert wurde, ist auch eine Beschreibung der Inbetriebnahme<br />

Teil dieses Kapitels.<br />

Den Beginn bildet jedoch ein Exkurs über Teilbereiche des XML-Standards, da die<br />

Konfiguration von PSE-Admin und die Verwaltung der Entwurfsmuster in XML vorgenommen<br />

werden müssen.<br />

3.1 Exkurs: XML<br />

In diesem Exkurs werden die für PSE-Admin relevanten Teilbereiche des XML-Standards<br />

[W3C 2002a] kurz vorgestellt. Folgende Abschnitte sind die wichtigsten Elemente<br />

aus den Quellen [Kappel 2001a] (Einführung) und [Kappel 2001b] (XML-<br />

Schema), da diese Literatur einen einfachen, leicht verständlichen und ausreichenden<br />

Überblick über die benötigte Materie gibt.<br />

3.1.1 Einführung<br />

Bis <strong>zur</strong> Entwicklung von XML (eXtensible Markup Language) galt HTML (Hypertext<br />

Markup Language) [W3C 2002b] als der Standard <strong>zur</strong> Beschreibung von Hypertextdokumenten<br />

im World Wide Web. Folgende Einschränkungen von HTML führten<br />

jedoch dazu, eine weitere Alternative <strong>zur</strong> Beschreibung von Dokumenten zu entwickeln:<br />

‣ HTML hat eine beschränkte Anzahl von vordefinierten Tags 2 .<br />

‣ Die Tags vermischen Layout-Aspekte mit Struktur- und Inhaltsaspekten.<br />

Vor allem die fehlende Abgrenzung vom Layout zum Inhalt führte dazu, einen alternativen<br />

Standard zu entwickeln, bei dem nicht das Aussehen eines Dokumentes,<br />

2 Ein Tag ist ein Identifizierungskennzeichen. Bspw. identifiziert der Tag in HTML einen Absatz,<br />

oder den Beginn <strong>einer</strong> Fett-Schreibweise.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 17<br />

sondern die Strukturinformation im Vordergrund steht. XML-Dokumente sind zwar<br />

ähnlich aufgebaut wie HTML-Dokumente (Tags, Attribute, usw.) spezialisieren sich<br />

jedoch auf die Beschreibung von Struktur und Inhalt.<br />

Folgende Merkmale sind für XML signifikant:<br />

‣ Erweiterbarkeit: Tags und Attribute können neu definiert und benannt<br />

werden.<br />

‣ Strukturierbarkeit: Tags können beliebig komplex geschachtelt werden.<br />

‣ Selbstbeschreibendes Format: Tags im XML-Dokument beschreiben<br />

Struktur und Semantik des Inhalts.<br />

‣ Validierbarkeit: XML-Dokumente können eine Beschreibung ihrer<br />

Grammatik aufweisen (DTD, XML-Schema) und gegenüber dieser geprüft<br />

werden.<br />

‣ Layoutunabhängigkeit: Trennung von Inhalt und Layout.<br />

‣ Semistrukturiertheit: Inhalt kann auch nicht-strukturierte Teile aufweisen,<br />

d. h. nicht jeder Inhalt muss von einem Tag umschlossen sein.<br />

Aufgrund dieser Merkmale ergeben sich die verschiedensten Anwendungsgebiete für<br />

XML wie z. B. Datenaustausch, Multi-Delivery (ein und derselbe Inhalt kann auf verschiedenen<br />

Endgeräten unterschiedlich präsentiert werden) und intelligente Suche<br />

(statt einfacher Schlagwortsuche auch strukturbasierte Suche in Dokumenten möglich).<br />

Um eine Vorstellung eines XML-Dokumentes zu erhalten wird mit Abbildung 2<br />

mit dem Aufbau eines Handy-Kataloges die XML-Syntax kurz erläutert.<br />

Wurzelelement<br />

Elementname<br />

Subelement<br />

Elementinhalt<br />

<br />

<br />

<br />

<br />

<br />

<br />

141g<br />

50<br />

400<br />

<br />

<br />

...<br />

<br />

<br />

...<br />

<br />

Prolog<br />

Kommentar<br />

Attribut<br />

Attributwert<br />

Abbildung 2: Beispiel für XML-Dokument [Kappel 2001a, 23]


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 18<br />

Durch diese <strong>Definition</strong> eines Handykataloges wird die Struktur von XML schnell ersichtlich,<br />

da sie einen ähnlichen Aufbau wie HTML aufweist. Auch ein XML-Dokument<br />

besteht aus mehreren Tags, welche die Element- bzw. Attributwerte ausdrücken.<br />

Folgende Unterschiede kann man jedoch im Gegensatz zu HTML feststellen:<br />

‣ Jedes Element (z. B. Hersteller aus Abbildung 2) muss mit einem Tag<br />

abgeschlossen werden. Bspw. benötigt der Start-Tag einen<br />

End-Tag . Nicht abgeschlossene Tags wie in HTML<br />

gibt es nicht.<br />

‣ Elemente dürfen sich nicht überlappen. Folgende Überlappung von Tags in<br />

HTML-Syntax kann man in XML nicht nachbilden, wobei <strong>zur</strong> besseren<br />

Darstellung die durch die Tags hervorgerufenen HTML-Formatierungen<br />

auch in diesem Dokument ersichtlich sind:<br />

Text fettText fett und kursiv Text nur kursiv<br />

Text normal.<br />

In XML müsste der Start-Tag vorher mit einem End-Tag abgeschlossen<br />

werden, bevor der End-Tag verwendet werden kann.<br />

‣ Leere Elemente können in Kurzform angeschrieben werden. Bspw. kann der<br />

Ausdruck durch<br />

vereinfacht werden. Leer ist ein Element,<br />

wenn zwischen Start- und End-Tag keine Werte auftreten.<br />

‣ Attributwerte müssen unter Anführungszeichen oder Hochkomma gesetzt<br />

werden: oder <br />

Nach dieser Einführung wird ersichtlich, dass sich XML vor allem auf das Beschreiben<br />

des Dokumentinhaltes und nicht auf das Layout spezialisiert. Da für das Verständnis<br />

dieser Arbeit nur ein Teil des XML-Standards erläutert wurde, können weitere<br />

Details auf [W3C 2002a] nachgelesen werden.<br />

3.1.2 XML-Schema<br />

Im vorigen Abschnitt wurde unter anderem erwähnt, dass sich XML für den Datenaustausch<br />

gut eignet. Ohne XML verläuft ein Austausch von Daten bspw. über DBMS<br />

(Datenbankmanagementsysteme), wobei die Daten hauptsächlich in Tabellen (ausgenommen<br />

objektorientierte oder objektrelationale Datenbanken) abgespeichert sind.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 19<br />

Für einen reibungslosen Datenaustausch ist daher eine Einigung der Austauschpartner<br />

auf eine gemeinsame Tabellenstruktur notwendig.<br />

Auch bei XML-Dokumenten ist eine Vorgabe der Datenstruktur sinnvoll. Vor der<br />

Entwicklung von XML-Schema galt die DTD (Document Type <strong>Definition</strong>) als Standard<br />

für die Festlegung <strong>einer</strong> Struktur für XML-Dokumente. Da DTDs schon als veraltert<br />

gelten und bei weitem nicht die Möglichkeiten von XML-Schema bieten, werden<br />

sie in dieser Arbeit nicht gesondert behandelt.<br />

Der neueste Standard <strong>zur</strong> <strong>Definition</strong> <strong>einer</strong> Struktur für XML-Dokumente heißt XML-<br />

Schema. Ein XML-Schema definiert genau wie die Tabellen eines DBMS, welcher<br />

Inhalt erlaubt ist. Die <strong>Definition</strong>en werden in ASCII-Dateien mit der Endung ".xsd"<br />

abgelegt. Auf ein XML-Schema basierende XML-Dokumente müssen somit <strong>einer</strong><br />

vorgeschriebenen Struktur entsprechen. Für die Erstellung solcher Dokumente wird<br />

die Verwendung eines XML-Editors mit Schema-Unterstützung (z. B. XMLSpy<br />

[Altova 2002]) empfohlen, denn nur durch Validierung des Dokumentes kann eine<br />

Konsistenz der Daten sichergestellt werden.<br />

Die folgenden Punkte zeigen die wichtigsten Deklarationsmöglichkeiten von XML-<br />

Schema auf. Die Anwendungsmöglichkeiten werden in Kapitel 3.5 bei der <strong>Definition</strong><br />

der Schemata für die Entwurfsmuster ersichtlich. Eine vollständige Dokumentation<br />

(inklusive der Syntax) kann auf [W3C 2002c] nachgelesen werden.<br />

‣ Vordefinierte Datentypen: Es existieren eine Reihe von vordefinierten Datentypen,<br />

mit denen der Wertebereich eines Elementes oder eines Attributes<br />

festgelegt werden kann. Alle vordefinierten Typen werden mit <strong>einer</strong> Präfix<br />

"xsd:" angesprochen, z. B. xsd:string, xsd:float und xsd:integer.<br />

‣ Einfache benutzerdefinierte Datentypen: Um einen einfachen<br />

benutzerdefinierten Datentyp zu definieren, leitet man von einem vordefinierten<br />

ab und verändert dessen Wertebereich. Somit ist es z. B: möglich<br />

Minimal- und Maximalwerte festzusetzen, Listen anzulegen und Zeichenketten<br />

zu beschränken.<br />

‣ Komplexe benutzerdefinierte Datentypen: Mit komplexen Datentypen<br />

können Elemente und Attribute bei der Typdeklaration beliebig tief geschachtelt<br />

werden. Ein Typ für das Element aus<br />

Abbildung 2 hat bspw. komplexen Charakter.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 20<br />

‣ Elemente und Attribute: Elemente und Attribute können als global (von<br />

überall im Schema referenzierbar) oder als lokal (nur in <strong>einer</strong> Typdeklaration<br />

referenzierbar) definiert werden.<br />

‣ Schlüssel: Genau wie in DBMS die Primärschlüssel bei den Tabellen gibt es<br />

in XML-Schema die Möglichkeit, Elemente, Attribute oder Kombinationen<br />

von beiden als Schlüssel zu deklarieren, um somit in gewissen Fällen die<br />

Eindeutigkeit sicherzustellen.<br />

XML-Schemata werden häufig verwendet, um komplexere Datenstrukturen zu modellieren.<br />

Durch deren sorgfältige <strong>Definition</strong> und Verwendung können somit Inkonsistenzen<br />

in XML-Dokumenten vermieden werden.<br />

3.1.3 Einsatz bei PSE-Admin<br />

Bei PSE-Admin wurde XML in den folgenden Bereichen eingesetzt:<br />

‣ Musterdefinition: Die Beschreibung von Entwurfsmustern erfolgt anhand<br />

von XML-Dokumenten, siehe Abschnitt 4.5.2 und 4.6.2.<br />

‣ Strukturdefinition: Alle XML-Dokumente, die <strong>zur</strong> Beschreibung von Entwurfsmustern<br />

eingesetzt werden, müssen <strong>einer</strong> festgelegten Struktur folgen,<br />

die mit XML-Schemata definiert wurde, siehe Abschnitt 4.5.1 und 4.6.1.<br />

3.2 Eclipse<br />

Eclipse [Eclipse 2002a] wurde als offene Plattform <strong>zur</strong> Integration von Werkzeugen<br />

von <strong>einer</strong> Gemeinschaft von Werkzeuganbietern (z. B: IBM, Borland, Rational Software,<br />

SUSE) unter der CPL-Lizenz (Common Public License) entwickelt. CPL ermöglicht<br />

eine Aneignung von gebührenfreien Quellcode und eine weltweite Verteilung<br />

der Rechte. Diese Lizenzart erlaubt Entwicklern auch das Erstellen und Vertreiben<br />

von Anwendungen, die auf Eclipse Quellcode basieren. Die Eclipse Plattform<br />

stellt somit den Werkzeugentwicklern höchste Flexibilität und Kontrolle über ihre<br />

Softwaretechnologie <strong>zur</strong> Verfügung.<br />

Abbildung 3 zeigt die Struktur von Eclipse, mit der die vorher erwähnte Offenheit des<br />

Systems erreicht wird.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 21<br />

Abbildung 3: Struktur von Eclipse [Eclipse 2002b, 10]<br />

Die Eclipse Plattform setzt auf <strong>einer</strong> Java Virtual Machine auf, d. h. die Implementierung<br />

erfolgte in der Programmiersprache Java. Auf ihr basieren die Java Entwicklungswerkzeuge<br />

(JDT – Java Development Tools), die als <strong>Erweiterung</strong> der Plattform<br />

entwickelt wurden. Diese Entwicklungswerkzeuge umfassen Editoren, Dateiverwaltung,<br />

Debug-Werkzeuge usw. Eine <strong>Erweiterung</strong> von Eclipse wird als Plugin bezeichnet.<br />

Die letzte Stufe in Abbildung 3 stellt die integrierte Plugin-<strong>Entwicklungsumgebung</strong><br />

(PDE - Plugin Development Environment) dar, mit deren Hilfe die Entwicklung<br />

von Plugins erleichtert wird.<br />

3.3 Plugins<br />

Ein Plugin ist eine <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse, die an den verschiedensten<br />

Stellen stattfinden kann. Diese Stellen werden definiert durch sogenannte<br />

Extension Points. Die <strong>Definition</strong> von Extension Points sowie aller anderen Eigenschaften<br />

von Plugins erfolgt in <strong>einer</strong> Beschreibungsdatei "plugin.xml", die für jedes<br />

Plugin vorhanden sein muss. Der Begriff <strong>Erweiterung</strong> muss in Eclipse sehr weitläufig<br />

betrachtet werden. So kann sowohl ein HTML-Editor als auch eine Aktion <strong>zur</strong> Generierung<br />

von ".zip"-Dateien als Plugin integriert werden.<br />

Im "plugin.xml" werden alle Eigenschaften von Plugins definiert. Abbildung 4 zeigt<br />

den Aufbau des "plugin.xml" von PSE-Admin.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 22<br />

Abbildung 4: Aufbau plugin.xml von PSE-Admin<br />

class<br />

Gibt an, welche Klasse die <strong>Erweiterung</strong> von AbstractUIPlugin aus dem Eclipse<br />

Paket org.eclipse.ui.plugin ist, die <strong>zur</strong> Ausführung eines Plugins benötigt wird.<br />

runtime<br />

Das Element runtime definiert, welche Bibliotheken <strong>zur</strong> Laufzeit benötigt werden. Im<br />

Falle von PSE-Admin sind dies vier ".jar"-Dateien, die in den library-Elementen<br />

aufgelistet sind (siehe Abbildung 5) und auf der gleichen Ebene im Dateisystem wie<br />

"plugin.xml" liegen müssen.<br />

Abbildung 5: runtime-Elemente von plugin.xml<br />

requires<br />

Legt fest, welche Plugins <strong>zur</strong> Ausführung benötigt werden. Diese werden in den<br />

import-Elementen definiert. Für PSE-Admin werden zwei weitere Plugins benötigt,<br />

die in Abbildung 6 definiert sind.<br />

Abbildung 6: requires-Elemente von plugin.xml<br />

extension<br />

Die Datei "plugin.xml" kann mehrere extension-Elemente enthalten, in denen festgelegt<br />

wird, aus welchen Teilen das Plugin besteht und an welcher Stelle es in der


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 23<br />

<strong>Entwicklungsumgebung</strong> aktiv werden soll. Bei PSE-Admin wird ein extension-Element<br />

verwendet, dessen Struktur in Abbildung 7 ersichtlich ist.<br />

Abbildung 7: extension-Element von plugin.xml<br />

Die Subelemente von extension haben folgende Bedeutung:<br />

‣ point: Der Wert "org.eclipse.ui.views" bedeutet, dass die Komponenten dieses<br />

Plugins als View verwendet werden. Eine View ist ein frei positionierbares<br />

Fenster in Eclipse, dass eine gewisse Aufgabe erfüllt und über einen<br />

speziellen Menüpunkt aktiviert werden kann.<br />

‣ category: Gibt an, in welche Kategorie(en) die Views eingeordnet werden<br />

können. Der Wert "pattern" für das Element id dient <strong>zur</strong> Sicherstellung der<br />

Eindeutigkeit und wird für die Referenzierung durch die view-Elemente benötigt.<br />

Je extension-Element können mehrere Kategorien definiert werden.<br />

‣ view: Zur Festlegung der vorhandenen Views ist es notwendig, diese mit<br />

den folgenden Subelementen genauer zu definieren:<br />

o name: Name der View – erscheint in Eclipse in einem Menüpunkt, der<br />

die Auswahl der vorhandenen Views erlaubt.<br />

o icon: Bild, dass bei der Auswahl von Views vor dem Text angezeigt<br />

wird.<br />

o category: Definiert die Kategoriezugehörigkeit dieser View. Der Wert<br />

in category muss einem Wert des Elementes id (bei PSE-Admin ist<br />

dies nur "pattern") entsprechen. Die Kategoriezuordnung ist genau wie<br />

die Vergabe eines Namens wichtig für den Menüpunkt <strong>zur</strong> Auswahl<br />

der vorhandenen Views.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 24<br />

o class: <strong>Erweiterung</strong> der Klasse org.eclipse.ui.views.ViewPart, die<br />

vorhanden sein muss, um eine View in einem Plugin zu verwenden. Bei<br />

PSE-Admin ist liegt diese Klasse in der Bibliothek pattern.jar.<br />

o id: Eindeutiger Name für die View. Meistens verwendet man den Klassennamen,<br />

da dieser in Verbindung mit der Paketangabe sicher eindeutig<br />

ist.<br />

Für die Anwendung von PSE-Admin reichen diese Elementdefinitionen. Im<br />

"plugin.xml" können jedoch bei anderen Anwendungsgebieten weit mehr Konfigurationen<br />

vorgenommen werden, die in [Eclipse 2002b] nachgelesen werden können.<br />

3.4 Inbetriebnahme von PSE-Admin<br />

Für die Inbetriebnahme von PSE-Admin müssen noch einige Komponenten installiert<br />

bzw. Werte in Konfigurationsdateien gesetzt werden. Diese Punkte werden in den<br />

folgenden Abschnitten behandelt.<br />

3.4.1 Pfadstruktur<br />

Der Einsatz von PSE-Admin erfordert eine gewisse Pfadstruktur, da alle Eclipse-<br />

Plugins und auch die verwalteten Muster in einem vordefinierten Verzeichnis liegen<br />

müssen. Daher werden für den weiteren Verlauf dieser Arbeit einige Platzhalter für<br />

Pfade in Tabelle 2 eingeführt.<br />

Platzhalter<br />

ECLIPSE_ROOT<br />

PLUGIN_ROOT<br />

PATTERN_ROOT<br />

Beispielpfad<br />

"e:\eclipse\"<br />

"e:\eclipse\plugins\"<br />

"e:\eclipse\patternFiles\"<br />

Tabelle 2: Pfadstruktur PSE-Admin<br />

ECLIPSE_ROOT gibt das Installationsverzeichnis der <strong>Entwicklungsumgebung</strong><br />

Eclipse an. Als Beispielpfad wurde "e:\eclipse\" gewählt. Das Plugin-Verzeichnis ist<br />

immer das Unterverzeichnis "\plugins\" unter dem Installationsverzeichnis. Gemäß<br />

Tabelle 2 ist dies der Pfad "e:\eclipse\plugins\" für den PLUGIN_ROOT als Platzhalter<br />

verwendet wird.<br />

Die Verwaltung und <strong>Definition</strong> von Entwurfsmustern mit PSE-Admin erfordert eine<br />

zusätzliche Pfadstruktur. Wichtig ist hierbei vor allem ein Wurzelverzeichnis für die


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 25<br />

Verwaltung der Muster anzugeben, z. B: "e:\eclipse\patternFiles\". Als Platzhalter für<br />

das Wurzelverzeichnis wird PATTERN_ROOT verwendet. Für jedes Entwurfsmuster<br />

das verwaltet werden soll, muss weiters ein Verzeichnis unter PATTERN_ROOT mit<br />

dem jeweiligen Namen angelegt werden. Bei dem Muster Abstract Factory lautet ein<br />

vollständiger Pfad daher "e:\eclipse\patternFiles\Abstract Factory". Alle Beschreibungs-<br />

und Dokumentationsdateien des Musters müssen in diesem Ordner liegen.<br />

Welche Dateien für eine <strong>Definition</strong> eines Entwurfsmusters notwendig sind wird in<br />

Abschnitt 4.5.2 und 4.6.2 erläutert.<br />

Neben diesen Verzeichnissen werden auch noch einige Dateien laut Tabelle 3<br />

benötigt.<br />

Datei<br />

pattern_configuration.xml<br />

config_file_description.xsd<br />

pattern_general.xsd<br />

pattern_implementation.xsd<br />

Pfad<br />

ECLIPSE_ROOT<br />

ECLIPSE_ROOT<br />

PATTERN_ROOT<br />

PATTERN_ROOT<br />

Tabelle 3: Benötigte Dateien PSE-Admin<br />

"pattern_configuration.xml" dient <strong>zur</strong> Konfiguration von PSE-Admin und wird ebenso<br />

wie sein XML-Schema "config_file_description.xsd" in Abschnitt 3.4.3 näher behandelt.<br />

"pattern_general.xsd" und "pattern_implementation.xsd" sind XML-Schemata,<br />

welche die <strong>Definition</strong> der Entwurfsmuster regeln. Sie werden in den Abschnitten 4.5.1<br />

und 4.6.1 erläutert.<br />

3.4.2 Benötigte Komponenten<br />

Für die Verwendung von PSE-Admin werden folgende Komponenten benötigt:<br />

‣ <strong>Entwicklungsumgebung</strong> Eclipse: Diese, derzeit für die Programmierung<br />

mit Java konzipierte Umgebung ist bei [Eclipse 2002a] kostenlos erhältlich<br />

und bildet den Rahmen für die Anwendung von PSE-Admin.<br />

‣ Java Runtime Environment (JRE): Da Eclipse in Java implementiert ist,<br />

wird eine Java Virtual Machine benötigt, mit der in Java entwickelte Programme<br />

ausgeführt werden können. Diese wird bspw. durch eine Java Runtime<br />

Environment [Sun 2002b] installiert. Empfohlen werden alle Versionen<br />

ab 1.3.1.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 26<br />

‣ PSE-Admin-Plugin: Das PSE-Admin-Plugin muss in den Pfad<br />

PLUGIN_ROOT kopiert werden. Nach der Initialisierung durch das Starten<br />

von Eclipse kann PSE-Admin verwendet werden.<br />

Da bei der Entwicklung von PSE-Admin Komponenten des Betriebssystems Windows<br />

verwendet wurden (siehe Abschnitt 7.2.4), ist PSE-Admin auf jedem Windows-<br />

Betriebssystem mit installierter Java Virtual Machine und <strong>Entwicklungsumgebung</strong><br />

Eclipse einsetzbar.<br />

3.4.3 Globale Konfigurationsdatei<br />

PSE-Admin benötigt eine globale Konfigurationsdatei mit dem Namen<br />

"pattern_configuration.xml", in dem einige Werte eingetragen werden müssen. Jeder<br />

dieser Werte hat einem ihm zugewiesenem Schlüssel, um die Eindeutigkeit zu gewährleisten.<br />

Die <strong>Definition</strong> dieser Datei und dessen XML-Schema wird in den folgenden<br />

zwei Abschnitten erläutert.<br />

Schema<br />

Das Schema trägt den Namen "config_file_description.xsd" und hat im Verzeichnis<br />

ECLIPSE_ROOT zu liegen. Seine Struktur wird in Abbildung 8 ersichtlich.<br />

Abbildung 8: Schema für globale Konfigurationsdatei<br />

Das Wurzelelement configFile hat den Typ ConfigFileType und besteht somit aus<br />

null bis unendlich vielen configKey-Elementen. ConfigKey besteht wiederum aus<br />

einem Element key (Schlüsselbegriff vom Typ xsd:string) und value (Wert vom<br />

Typ xsd:string).<br />

<strong>Definition</strong><br />

Abbildung 9 zeigt die Werte, die in der globalen Konfigurationsdatei gesetzt werden<br />

müssen. Diese muss das in Abbildung 8 vorgestellte XML-Schema referenzieren.


<strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse 27<br />

Abbildung 9: Werte der globalen Konfigurationsdatei<br />

Die Werte in der Konfigurationsdatei haben folgenden Bedeutung:<br />

‣ "patternRoot": Gibt das Wurzelverzeichnis für die Entwurfmuster an.<br />

‣ "language": Legt die aktuell verwendete Programmiersprache fest. Da mit<br />

PSE-Admin Entwurfsmuster in verschiedenen Programmiersprachen verwaltet<br />

werden können, muss festgelegt werden, mit welcher Sprache das<br />

System arbeiten soll.<br />

‣ "logFile": Gibt an, in welche Datei mitprotokolliert werden soll.<br />

3.5 Zusammenfassung<br />

Dieses Kapitel befasste sich mit dem Konzept und den <strong>Erweiterung</strong>smöglichkeiten<br />

(Plugins) der <strong>Entwicklungsumgebung</strong> Eclipse. Jedes Plugin benötigt eine Beschreibungsdatei<br />

"plugin.xml", die anhand PSE-Admin erläutert wurde. Den Abschluss bildete<br />

eine Beschreibung der Inbetriebnahme von PSE-Admin, wobei mit einem XML-<br />

Exkurs zu Beginn dieses Kapitels die notwendigen Grundlagen geschaffen wurden.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 28<br />

4 PSE-D - <strong>Definition</strong> von Entwurfsmustern<br />

PSE-D wurde für die flexible <strong>Definition</strong> und Verwaltung von Entwurfsmustern und<br />

deren Dokumentation entwickelt. Der Aufbau <strong>einer</strong> Muster-Infrastruktur laut PSE-D<br />

bildet die Basis für die Anwendung des Werkzeuges PSE-V (siehe Kapitel 6), mit<br />

dessen Hilfe die Visualisierung der verwalteten Muster und deren Dokumentation<br />

ermöglicht wird. Auch PSE-Application verwendet über Programmierschnittstellen<br />

(siehe Abschnitt 5.1)die durch PSE-D definierte Datenstruktur.<br />

Dieses Kapitel legt die Struktur und die genaue <strong>Definition</strong> der Entwurfsmuster dar, die<br />

mit Hilfe des Beispielmusters Abstract Factory erläutert wird. Weiters wird der besondere<br />

Stellenwert der Rollen von Mustern hervorgehoben.<br />

4.1 Beispiel: Abstract Factory<br />

Das Muster Abstract Factory bietet eine Schnittstelle zum Erzeugen von verwandten<br />

oder voneinander abhängigen Objekten, ohne Kenntnis ihrer konkreten Klasse. Ein<br />

Beispiel für eine Anwendung ist ein System mit grafischer Benutzerschnittstelle, das<br />

mehrere look and feels 3 (z. B. vom Betriebsystem Windows und Apple-Macintosh)<br />

unterstützen soll. Für diesen Zweck ist es notwendig, die grafischen Komponenten<br />

austauschbar zu gestalten, ohne dass der Rest der Implementierung geändert werden<br />

muss. Abbildung 10 illustriert die allgemeine Architektur von Abstract Factory.<br />

3 Als look and feel wird das Aussehen und Verhalten <strong>einer</strong> Anwendung bezeichnet.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 29<br />

«interface»<br />

AbstractFactory<br />

Client<br />

+createAbstractProductA()<br />

+createAbstractProductB()<br />

«interface»<br />

AbstractProductA<br />

ProductA1<br />

ProductA2<br />

ConcreteFactory1<br />

ConcreteFactory2<br />

+createAbstractProductA()<br />

+createAbstractProductB()<br />

+createAbstractProductA()<br />

+createAbstractProductB()<br />

«interface»<br />

AbstractProductB<br />

ProductB1<br />

ProductB2<br />

Abbildung 10: Allgemeine Architektur von Abstract Factory [Gamma 1995, 88]<br />

Für die Anwendung des Musters sind folgende Rollen relevant:<br />

‣ AbstractFactory: Definiert eine Schnittstelle für die Erzeugung abstrakter<br />

Produkte.<br />

‣ ConcreteFactory: Implementiert die Schnittstellen von AbstractFactory<br />

um Produkte zu erzeugen.<br />

‣ AbstractProduct: Definiert eine Schnittstelle für ein Produkt.<br />

‣ Product: Implementiert die Schnittstellen von AbstractProduct und wird<br />

von ConcreteFactory erzeugt. Product repräsentiert damit ein konkretes<br />

Produkt (bspw. ein Fenster von Windows).<br />

‣ Client: Verwendet nur die Schnittstellen, die in AbstractFactory und<br />

AbstractProduct definiert wurden.<br />

Bei Verwendung dieses Musters für die Unterstützung mehrerer look and feels gestaltet<br />

sich die konkrete Architektur gemäß Abbildung 11.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 30<br />

«interface»<br />

WidgetFactory<br />

Client<br />

+createWindow()<br />

+createScrollbar()<br />

«interface»<br />

Window<br />

WindowsWindow<br />

MacWindow<br />

WindowsFactory<br />

MacFactory<br />

+createWindow()<br />

+createScrollBar()<br />

+createWindow()<br />

+createScrollBar()<br />

«interface»<br />

ScrollBar<br />

WindowsScrollBar<br />

MacScrollBar<br />

Abbildung 11: Beispielarchitektur bei Anwendung von Abstract Factory<br />

WidgetFactory definiert die Schnittstellen mit der die implementierenden Klassen<br />

WindowsFactory und MacFactory die look and feel Komponenten instanzieren. Diese<br />

werden durch die Schnittstellen Window und ScrollBar identifiziert. Eine Klasse<br />

WindowsWindow implementiert bspw. das Aussehen und Verhalten eines Fensters des<br />

Betriebssystem Windows und eine Klasse MacWindow jenes von Apple-Macintosh.<br />

Eine Anwendung (Klasse Client) arbeitet nur mit den Methoden in den Schnittstellen<br />

und braucht sich nicht um die Instanzierung der Komponenten kümmern. Somit<br />

können diese ohne weiteres ausgetauscht werden, ohne dass die Implementierung von<br />

Client geändert werden muss.<br />

4.2 Rollen<br />

Rollen wurden schon im Abschnitt 2.1.2 kurz erwähnt, da sie jedoch in der weiteren<br />

Arbeit vor allem bei der <strong>Definition</strong> der Entwurfsmuster wichtig sind, werden ihre Eigenschaften<br />

noch einmal gesondert behandelt.<br />

Laut [Gamma 1995] sind Rollen Klassen und/oder Objekte, die für die Lösung eines<br />

Entwurfsproblems notwendig sind. Beim Muster Abstract Factory sind dies fünf Rollen,<br />

die in geeigneter Art und Weise zusammenspielen, um das Problem der anonymen<br />

Objektinstanzierung zu lösen (siehe Abbildung 10). Bei <strong>einer</strong> Anwendung eines


PSE-D - <strong>Definition</strong> von Entwurfsmustern 31<br />

Entwurfsmusters müssen verschiedene Klassen die Rollen des Musters spielen. In<br />

Abbildung 11 spielt bspw. die Klasse Window die Rolle AbstractProduct.<br />

Laut [Gamma 1995] hat jede Rolle einen Namen und eine kurze Beschreibung ihrer<br />

Aufgabe. Für die Entwicklung von PSE-Admin wurde der Rollenbegriff um die Eigenschaften<br />

Typ, Codekopf, Codekörper und Häufigkeit erweitert. Folgende Eigenschaften<br />

sind gemäß PSE-Admin <strong>einer</strong> Rolle zuordenbar:<br />

1. Name: Bei der Wahl des Namens gelten dieselben Richtlinien wie bei den<br />

Namen für Muster – sprechende Namen erleichtern die Wiederverwendung.<br />

2. Beschreibung: Legt die Aufgabe der Rolle bei Anwendung des Musters dar.<br />

3. Typ: Beschreibt die Art der Rolle. Sie kann eine Klasse ("class"), eine<br />

Schnittstelle ("interface"), eine Methode ("method") oder eine Variable<br />

("variable") sein.<br />

4. Codekopf: Besteht bei den Typen "class" und "interface" aus <strong>einer</strong><br />

Klassendefinition und bei den Typen "method" und "variable" aus <strong>einer</strong><br />

Methoden- bzw. Variablendefinition.<br />

5. Codekörper: Der Codekörper zeigt eine konkrete Beispielimplementierung<br />

der Rolle. Bei einem Typ "variable" entfällt er, da eine Rolle dieses Typs bereits<br />

im Codekopf die <strong>Definition</strong> bzw. Initialisierung erhält.<br />

6. Häufigkeit: Gibt an, wie oft eine Rolle bei der Anwendung des Musters auftreten<br />

kann. Mögliche Werte sind "*" für 0-n-maliges Vorkommen, ganze<br />

Zahlen und Kombinationen ("1..*, "1..2" usw.).<br />

Die Rolle AbstractProduct des Musters AbstractFactory hat laut PSE-Admin bspw.<br />

folgende die Eigenschaften gemäß Tabelle 4.<br />

Eigenschaft<br />

Name<br />

Beschreibung<br />

Typ<br />

Codekopf<br />

Ausprägung<br />

AbstractProduct<br />

Definiert eine Schnittstelle für ein Produkt<br />

interface<br />

public interface AbstractProduct{}<br />

Codekörper<br />

Häufigkeit 1<br />

Tabelle 4: Eigenschaften der Rolle AbstractProduct


PSE-D - <strong>Definition</strong> von Entwurfsmustern 32<br />

AbstractProduct ist eine Schnittstelle, daher erhält sie den Typ "interface". Der<br />

Codekopf zeigt eine leere Klassendefinition. Die Eigenschaft Codekörper bleibt noch<br />

leer, da im voraus keine Aussagen über die Methoden eines Produktes getroffen werden<br />

können. Als Häufigkeit wurde "1" festgelegt, damit kann bei der Anwendung des<br />

Musters nur eine Klasse diese Rolle spielen.<br />

Durch diese <strong>Erweiterung</strong> des Rollenbegriffs können schon bei der <strong>Definition</strong> konkrete<br />

Richtlinien und Einschränkungen für die Anwendung eines Entwurfsmusters gegeben<br />

werden.<br />

4.3 Struktur der Musterverwaltung<br />

Die <strong>Definition</strong> eines Entwurfsmusters gliedert sich in eine allgemeine und eine oder<br />

mehrere implementierungsspezifische Beschreibung(en), in der die Rollen des<br />

Musters definiert werden. Im weiteren Verlauf dieser Arbeit wird daher auch das Synonym<br />

Rollenbeschreibung für den implementierungsspezifischen Teil verwendet. Das<br />

Hauptziel bei der Entwicklung von PSE-D war die Trennung dieser beiden Teile, um<br />

für ein Muster mehrere Rollenbeschreibungen verwalten zu können. Der Aufbau eines<br />

Entwurfsmusters kann daher laut PSE-D eine Struktur gemäß Abbildung 12 aufweisen.<br />

Rollenbeschreibung<br />

Java (XML)<br />

folgt<br />

allgemeine<br />

Beschreibung (XML)<br />

verweist<br />

XML-Schema f.<br />

Rollenbeschreibung<br />

folgt<br />

folgt<br />

XML-Schema f. allg.<br />

Beschreibung<br />

Rollenbeschreibung<br />

C++ (XML)<br />

Abbildung 12: Struktur der Musterverwaltung von PSE-D<br />

Die allgemeine Beschreibung wird ebenso wie die Rollenbeschreibungen in XML-<br />

Dokumenten abgelegt. Beide haben je einem XML-Schema zu entsprechen, in dem<br />

der Aufbau der Beschreibungsdateien festgelegt wird. Eine allgemeine <strong>Definition</strong><br />

kann auf mehrere Rollenbeschreibungen verweisen, somit kann ein Muster in mehre-


PSE-D - <strong>Definition</strong> von Entwurfsmustern 33<br />

ren Programmiersprachen verwaltet werden. In Abbildung 12 verweist eine allgemeine<br />

Beschreibung auf zwei Rollenbeschreibungen (Java und C++).<br />

4.4 Entwurfsziele<br />

Bei der Entwicklung von PSE-D wurden folgenden Entwurfsziele verfolgt:<br />

‣ Flexibilität bei <strong>Definition</strong> und Verwaltung: Es muss möglich sein, die in<br />

der Literatur derzeit beschriebenen Entwurfsmuster im System abzulegen,<br />

aber auch neue zu definieren. Entwickler erhalten damit die Möglichkeit,<br />

sich eigene Problemlösungen als Muster zu verwalten.<br />

‣ Flexibilität der Dokumentation: Die Dokumentation der Muster muss in<br />

HTML- oder gewöhnlichen ASCII-Dateien, aber auch direkt in der allgemeinen<br />

Beschreibungsdatei (siehe Abschnitt 4.5.2) erfolgen können. Eine<br />

freie <strong>Definition</strong> der Bestandteile ist zusätzlich erforderlich.<br />

‣ Progammiersprachenunabhängigkeit: Entwurfsmuster müssen im System<br />

in verschiedenen Programmiersprachen verwaltet werden können.<br />

Der genaue Aufbau der Entwurfsmuster wird in den folgenden Abschnitten erläutert.<br />

4.5 Allgemeine Beschreibung<br />

Eine allgemeine Beschreibung muss exakt einmal für jedes Entwurfsmuster existieren<br />

und legt folgenden Eigenschaften fest:<br />

‣ Name<br />

‣ Klassifizierung<br />

‣ Kategoriezugehörigkeit<br />

‣ Aufbau der Dokumentation<br />

‣ Anzahl und Art der Rollenbeschreibungen<br />

Sie wird in einem XML-Dokument abgespeichert, das ein globales, einmal im System<br />

vorhandenes XML-Schema referenziert.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 34<br />

4.5.1 Schema<br />

Jede allgemeine Beschreibung muss einem XML-Schema entsprechen. Dieses<br />

Schema wird in <strong>einer</strong> Datei mit dem Namen "pattern_general.xsd" (siehe Abschnitt<br />

3.4.1) abgespeichert. Seine Struktur wird in Abbildung 13 dargestellt.<br />

Abbildung 13: Schema für allgemeinen Beschreibungsteil<br />

Jedes XML-Schema benötigt ein Wurzelelement, dass alle anderen enthält. In<br />

Abbildung 13 lautet der Name dieses Elementes pattern und hat den Typ<br />

PatternType, der aus folgenden Elementen besteht:<br />

name<br />

Gibt den Namen des Musters an. Die Kardinalität dieses Elementes ist "1", da der<br />

Name des Musters innerhalb der Beschreibungsdatei eindeutig sein muss (keine Kardinalitätsangabe<br />

beim Element bedeutet Kardinalität "1"). Der Typ ist xsd:string<br />

(Zeichenkette).<br />

classification<br />

Zeigt die Klassifizierung des Musters. Es gibt Objektmuster und Klassenmuster (siehe<br />

Abschnitt 2.1.2). Der Elementtyp ist daher eine Liste mit den Werten "class" und<br />

"object". Da ein Muster auch beide Klassifizierungen aufweisen kann, wurde eine<br />

Kardinalität "1..2" festgelegt.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 35<br />

description<br />

Jedes Muster kann null bis unendlich viele Beschreibungen enthalten. Ein<br />

description-Element hat den Typ DescriptionType, der aus den folgenden Subelementen<br />

besteht (Ein konkretes Anwendungsbeispiel folgt im nächsten Abschnitt):<br />

‣ headerName: Name des Beschreibungselementes vom Typ xsd:string.<br />

‣ headerType: Typ des Beschreibungselementes. Der Typ ist eine Liste mit<br />

den Werten "overview", "detail" und "category". Der Wert "category" ist<br />

zuständig für die Kategoriedefinition, die Werte "detail" und "overview" für<br />

den Dokumentationsaufbau des Musters.<br />

‣ content: Inhalt des Beschreibungselementes vom Typ xsd:string.<br />

‣ contentType: Typ des Inhalts. contentType ist eine Liste mit den Werten<br />

"file" und "text". Beim Wert "text" für contentType wird der Inhalt des<br />

Elementes content (ASCII-Text im XML-Dokument) verwendet. Beim<br />

Wert "file" enthält das Element content den Namen <strong>einer</strong> Datei. Damit<br />

wird der Inhalt für das Beschreibungselement aus dieser Datei entnommen,<br />

wobei diese im aktuellen Verzeichnis des Entwurfsmusters liegen muss.<br />

implementation<br />

Ein Entwurfsmuster benötigt zumindest eine Rollenbeschreibung, deren Lokalisierung<br />

in diesem Element definiert wird. Der Typ von implementation ist xsd:string.<br />

Tabelle 5 fasst die Elemente des XML-Schemas kurz zusammen.<br />

Element Typ Kurzbeschreibung<br />

name xsd:string Name des Musters<br />

classification<br />

Liste mit den Werten "class" und<br />

"object"<br />

Klassifizierung des Musters<br />

description Komplexer geschachtelter Datentyp Beschreibung des Musters<br />

headerName xsd:string Name des Beschreibungselementes<br />

headerType<br />

Liste mit den Werten "overview",<br />

"detail" und "category"<br />

Typ des Beschreibungselementes<br />

content xsd:string Inhalt des Beschreibungselementes<br />

contentType<br />

Liste mit den Werten "file" und<br />

text"<br />

Typ des Inhalts<br />

implementation xsd:string Lokalisierung der Rollenbeschreibung<br />

Tabelle 5: Elemente des XML-Schemas


PSE-D - <strong>Definition</strong> von Entwurfsmustern 36<br />

4.5.2 <strong>Definition</strong><br />

Die genaue <strong>Definition</strong> der allgemeinen Beschreibung eines Entwurfsmusters hat in<br />

einem XML-Dokument mit dem Namen "manifest.xml" zu erfolgen. Dieses Dokument<br />

muss wie in Abschnitt 3.4.1 beschrieben in dem Verzeichnis des Musters liegen.<br />

Eine vollständige Pfadangabe lautet daher bspw. "e:\eclipse\patternFiles\Abstract<br />

Factory\manifest.xml" lauten. Für die Erstellung der XML-<strong>Definition</strong>en wird ein gängiger<br />

XML-Editor mit XML-Schema Unterstützung empfohlen, z. B. XMLSpy<br />

[Altova 2002].<br />

Um die Struktur der allgemeinen Beschreibung zu erläutern, wird das vorher beschriebene<br />

Muster Abstract Factory verwendet. Abbildung 14 zeigt die allgemeine<br />

Beschreibungsdatei von Abstract Factory, deren Struktur genau dem im vorigen Abschnitt<br />

beschriebenem XML-Schema entsprechen muss. Das Wurzelelement pattern<br />

wird dabei aus Gründen der Übersichtlichkeit der Abbildung nicht dargestellt!<br />

Abbildung 14: Allgemeine Beschreibung von Abstract Factory<br />

name<br />

Der Name des Musters lautet Abstract Factory. Da die allgemeine Beschreibung für<br />

jedes Entwurfsmuster in einem XML-Dokument "manifest.xml" abgespeichert ist und<br />

die Bezeichnung dieser Datei keine Rückschlüsse auf den Namen des Musters zulässt,<br />

dient dieses Element <strong>zur</strong> Identifikation des Musters.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 37<br />

classification<br />

Abstract Factory ist ein Objektmuster. Es verwendet hauptsächlich Objekte und deren<br />

Beziehungen <strong>zur</strong> Problemlösung.<br />

description<br />

Die <strong>Definition</strong> von Abstract Factory besteht unter anderem aus 13 description-Elementen,<br />

wobei eines für die Kategoriezugehörigkeit (Typ "category") und 12 für den<br />

Aufbau der Dokumentation verantwortlich sind (Typ "detail" und "overview").<br />

implementation<br />

Der Wert "java" dieses Elementes setzt voraus, dass eine Rollenbeschreibung für dieses<br />

Muster in einem Dokument "java.xml" existiert, das auf der selben Ebene wie<br />

"manifest.xml" liegen muss.<br />

Durch den geschickten Einsatz von description-Elementen ergeben sich verschiedenste<br />

Möglichkeiten, die am besten durch eine Aufgliederung in die Beschreibungstypen<br />

(headerType) ersichtlich werden. Für die folgenden Abbildungen wurde <strong>zur</strong><br />

Vereinfachung mit nur einem Muster im System (Abstract Factory) gearbeitet.<br />

category<br />

Der Typ "category" ist zuständig für die Kategoriezuordnung des Entwurfsmusters<br />

und damit auch für die Repräsentation in der Navigationsstruktur. Das erste<br />

description-Element aus Abbildung 14 (headerName "Gamma") ergibt eine Navigation<br />

laut Abbildung 15. Als Wurzelknoten wird immer der Wert "Categories" verwendet.<br />

Abbildung 15: Kategoriebeispiel 1<br />

Abstract Factory wird somit als Teil der Kategorie "Creational Patterns" dargestellt,<br />

die wiederum eine Unterkategorie von "Gamma" ist.<br />

Um eine einstufige Kategoriezuordnung zu erzwingen, muss man den Wert "Gamma"<br />

aus Abbildung 14 auf den Wert "Creational Patterns" ändern. Damit haben beide Elemente<br />

denselben Wert, womit eine Einstufigkeit erzwungen wird. Das Ergebnis präsentiert<br />

sich in Abbildung 16.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 38<br />

Abbildung 16: Kategoriebeispiel 2<br />

Um eine Zuordnung eines Musters zu verschiedenen Kategorien zu erreichen (siehe<br />

Abbildung 17), muss man ein zusätzliches Kategorieelement in die allgemeine<br />

Beschreibungsdatei integrieren. Abbildung 18 gibt hierfür ein konkretes Beispiel.<br />

Abbildung 17: Kategoriebeispiel 3<br />

Abbildung 18: Zusätzliches Kategorieelement<br />

Das Muster ist bei dieser Art der <strong>Definition</strong> in beiden Kategoriebäumen dargestellt,<br />

wobei die Dokumentation nur einmal existiert. Eine Zuordnung zu mehreren Kategorien<br />

erscheint jedoch häufig als sinnvoll.<br />

Mit diesen <strong>Definition</strong>arten ist es möglich, auf zwei Ebenen verschiedenste Kategoriezuordnungen<br />

für ein Muster zu definieren.<br />

overview und detail<br />

Diese beiden Ausprägungen definieren, wie sich die Dokumentation des Musters zusammensetzt.<br />

Aus den einzelnen Bausteinen wird <strong>zur</strong> Laufzeit von PSE-V eine<br />

Gesamtdokumentation im HTML-Format mit dem Namen des Musters erstellt (z. B:<br />

"Abstract Factory.html"), die sich gemäß <strong>Definition</strong> laut Abbildung 14 für das Muster<br />

Abstract Factory in Abbildung 19 darstellt.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 39<br />

Abbildung 19: HTML-Dokumentation für Abstract Factory<br />

Der Aufbau der Dokumentation erfolgt nach den folgenden Richtlinien:<br />

Für den Seitenkopf wird ein Inhaltsverzeichnis generiert. Hat ein description-Element<br />

in "manifest.xml" den Wert "oveview", so befindet sich dieser Teil der Dokumentation<br />

im Überblicksbereich (gekennzeichnet durch "Overview"). Mit "detail"


PSE-D - <strong>Definition</strong> von Entwurfsmustern 40<br />

befindet er sich im Detailbereich (gekennzeichnet durch "Detail"). Aus allen<br />

description-Elementen mit einem dieser beiden Werte wird die Gesamtdokumentation<br />

des Musters erstellt, wobei der Inhalt entweder direkt aus "manifest.xml" (beim<br />

Wert "text" für contentType) oder aus der referenzierten Datei entnommen wird<br />

(beim Wert "file" für contentType). Referenziert werden können alle Dateien im<br />

ASCII-Format, empfohlen wird jedoch HTML, da auch die Gesamtdokumentation<br />

dieses Format erhält.<br />

Tabelle 6 zeigt ein Beispiel für ein descriptionElement aus Abbildung 14.<br />

Element<br />

headerName<br />

headerType<br />

content<br />

contentType<br />

Wert<br />

"Motivation"<br />

"detail"<br />

"motivation.html"<br />

"file"<br />

Tabelle 6: Beispiel für description Element<br />

Wichtig bei diesem Teil der Beschreibung ist, dass in der HTML-Datei<br />

"motivation.html” am Beginn keine Überschrift definiert ist, da diese dynamisch aus<br />

dem Element headerName entnommen wird. Weiters dürfen auch keine HTML-Überschriften<br />

(,, usw.) verwendet werden, da diese die Struktur der Gesamtdokumentation<br />

verfälschen.<br />

Der Aufbau der Dokumentation folgt derzeit dem Vorschlag von [Gamma 1995, 6-7],<br />

den Benutzern ist es aber freigestellt, sich einen eigenen Aufbau zu definieren.<br />

4.6 Rollenbeschreibung<br />

Die Rollenbeschreibung legt die implementierungsspezifischen Details eines Entwurfsmusters<br />

fest, indem die Rollen des Musters genau definiert werden. Je Muster<br />

können mehrere Rollenbeschreibungen (z. B. für jede Programmiersprache eine) verwaltet<br />

werden, wobei jede ein globales XML-Schema referenzieren muss.<br />

4.6.1 Schema<br />

Die Rollenbeschreibung eines Entwurfsmusters muss einem XML-Schema mit der<br />

Struktur gemäß Abbildung 20 entsprechen. Dieses Schema wird in <strong>einer</strong> Datei mit<br />

dem Namen "pattern_implementation.xsd" (siehe Abschnitt 3.4.1) abgespeichert.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 41<br />

Abbildung 20: XML-Schema der Rollenbeschreibung<br />

Das Wurzelelement implementation hat den Typ LanguageType, der aus folgenden<br />

Elementen besteht:<br />

language<br />

Gibt an, für welche Programmiersprache die Beschreibungsdatei gilt. Die Kardinalität<br />

dieses Elementes ist "1", da eine Rollenbeschreibung nur für eine Programmiersprache<br />

gültig sein kann. Der Typ dieses Elementes ist xsd:string.<br />

role<br />

Jedes Muster kann verschiedene Rollen (muss aber zumindest eine) haben. Die Subelemente<br />

von role (Typ RoleType) sind jene Eigenschaften, die in Abschnitt 4.2<br />

identifiziert wurden. Sie gliedern sich folgendermaßen:<br />

‣ roleName: Name der Rolle vom Typ xsd:string.<br />

‣ roleDescription: Beschreibung der Rolle vom Typ xsd:string.<br />

‣ typeOfRole: Typ der Rolle. Dieses Element ist eine Liste mit den Werten<br />

"class", "interface", "method" und "variable".<br />

‣ codeHeader: Codekopf der Rolle vom Typ xsd:string.<br />

‣ codeBody: Codekörper der Rolle vom Typ xsd:string. Hat das Element<br />

typeOfRole den Wert "variable", so entfällt dieser.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 42<br />

‣ cardinality: Kardinalität der Rolle vom Typ xsd:string. Mögliche Werte<br />

sind "*" für 0-n-maliges Vorkommen, ganze Zahlen und Kombinationen<br />

("1..*, "1..2" usw.).<br />

Alle Subelemente bis auf codeBody müssen genau einmal auftreten, zumal nicht jede<br />

Rolle über einen Codekörper verfügen muss.<br />

4.6.2 <strong>Definition</strong><br />

Im XML-Dokument von Abbildung 14 wurde festgelegt, dass es eine Rollenbeschreibung<br />

(Element implementation) im Dokument "java.xml" gibt. Dieser Teil ist notwendig,<br />

um die Entwurfsmuster mit PSE-Application [Mayr-Kern 2002] anzuwenden,<br />

da dieses Werkzeug auf die von PSE-D <strong>zur</strong> Verfügung gestellten Schnittstellen zugreift<br />

(siehe Abschnitt 5.1) und damit die Informationen über die verwalteten<br />

Entwurfsmuster verwendet.<br />

Genau wie die allgemeine Beschreibung muss auch die Rollenbeschreibung ein XML-<br />

Schema (siehe Abschnitt 4.6.1) referenzieren, um die Konsistenz der Daten sicher zu<br />

stellen. Abbildung 21 und Abbildung 22 zeigen die Rollenbeschreibung für das Entwurfsmuster<br />

Abstract Factory, wobei diese <strong>zur</strong> besseren Übersichtlichkeit in zwei<br />

Abbildungen geteilt wurde (bei der <strong>Definition</strong> mit XMLSpy ist keine Zweiteilung<br />

erforderlich).<br />

Abbildung 21: Rollenbeschreibung von Abstract Factory (1/2)<br />

Das Element language gibt an, für welche Programmiersprache diese Rollenbeschreibung<br />

gilt. Weiters wird für jede der fünf Rollen der Name (roleName), eine<br />

kurze Beschreibung (roleDescription) und der Typ (typeOfRole) festgelegt.


PSE-D - <strong>Definition</strong> von Entwurfsmustern 43<br />

Abbildung 22: Rollenbeschreibung von Abstract Factory (2/2)<br />

Für jede Rolle muss weiters ein Element codeHeader mit dem Codekopf und<br />

cardinality mit der Kardinalität definiert werden. Ein Codekörper (codeBody) wird<br />

nicht zwingend vorgeschrieben.<br />

Bei der Rolle AbstractFactory enthält das Element codeHeader den Wert "public<br />

interface $AbstractFactory${}". Das Zeichen "$" wird als Schlüsselzeichen für<br />

PSE-Application verwendet und hat folgenden Zweck:<br />

Bei der Anwendung eines Musters kann sich ein Benutzer entscheiden für die Rolle<br />

AbstractFactory einen anderen Namen (z. B. "WidgetFactory") zu wählen. Bei<br />

Vergabe dieses Namens wird somit folgender Quellcode für den Codekopf generiert:<br />

public interface WidgetFactory {}<br />

Alle Rollennamen (Element roleName), können somit bei der Anwendung durch eigene<br />

Werte ersetzt werden. Verweist eine Rolle in den Elementen codeHeader oder<br />

codeBody mit dem Zeichen "$" auf einen Rollennamen, so wird auch dieser durch den<br />

neuen Wert ersetzt. Entscheidet sich ein Benutzer bspw. den Namen "Window" für die<br />

Rolle AbstractProduct zu vergeben, so wird der Code public Window<br />

createWindow(); für den Codekörper von AbstractFactory generiert. Der gesamte<br />

Quellcode für die Rolle AbstractFactory wird aus codeHeader und codeBody zusammengesetzt<br />

und ist in Quellcode 1 ersichtlich.<br />

1 public interface WidgetFactory {<br />

2 public Window createWindow();<br />

3 }<br />

Quellcode 1: Generierter Code für AbstractFactory


PSE-D - <strong>Definition</strong> von Entwurfsmustern 44<br />

Der Codekopf umschließt bei der Anwendung den Codekörper. Analog gestaltet sich<br />

die Anwendung von Rollen des Typs "class" und "method". Lediglich bei <strong>einer</strong> Variable<br />

entfällt der Codekörper.<br />

Durch diese Vorgehensweise wird ein flexibles Anwenden von Entwurfsmustern ermöglicht,<br />

zumal alle variablen Codeteile deklariert und durch die Vergabe von Rollennamen<br />

mit Werten belegt werden können.<br />

Für die <strong>Erweiterung</strong> von Abstract Factory um eine Rollenbeschreibung für z. B. C++,<br />

müssen folgende Schritte vorgenommen werden:<br />

1. Hinzufügen eines Elementes implementation mit den Wert "C++" in der<br />

allgemeinen Beschreibungsdatei "manifest.xml".<br />

2. Erstellen <strong>einer</strong> Implementierungsbeschreibung im Dokument "C++.xml" mit<br />

den <strong>Definition</strong>en für die Rollen gemäß C++ Syntax.<br />

Derzeit wird nur die Verwaltung der Muster in mehreren Programmiersprachen unterstützt.<br />

PSE-Application bietet eine Implementierung <strong>zur</strong> Anwendung von Entwurfsmustern<br />

mit Java-Rollenbeschreibungen, für andere Sprachen fehlen jedoch noch die<br />

nötigen Werkzeuge.<br />

4.7 Zusammenfassung<br />

Dieses Kapitel behandelte die <strong>Definition</strong> und Verwaltung von Entwurfsmustern und<br />

deren Dokumentation. Es wurde festgestellt, dass eine Aufteilung der <strong>Definition</strong> in<br />

einen allgemeinen und eine oder mehrere implementierungsspezifische Beschreibungsteil(e)<br />

ein Verwalten von Mustern in mehreren Programmiersprachen erlaubt.<br />

Diese Beschreibungen werden in XML-Dokumenten angelegt, die alle auf XML-<br />

Schemata, in denen die Datenstruktur festgelegt ist, verweisen müssen. Die Dokumentation<br />

von Mustern kann direkt in die allgemeine Beschreibungsdatei geschrieben<br />

oder in ASCII-Dateien ausgelagert werden, wobei mit dem Werkzeug PSE-V <strong>zur</strong><br />

Laufzeit eine Gesamtdokumentation im HTML-Format erzeugt wird. Die Teile der<br />

Dokumentation sind dabei frei definierbar.<br />

Mit dieser Vorgehensweise wird eine freie, flexible und programmiersprachenunabhängige<br />

<strong>Definition</strong> und Verwaltung von Entwurfsmustern ermöglicht.


PSE-D – Implementierungsbeschreibung 45<br />

5 PSE-D – Implementierungsbeschreibung<br />

Dieses Kapitel beschreibt die Implementierung von PSE-D. Da ein Großteil der Implementierung<br />

die <strong>zur</strong> Verfügung gestellten Programmierschnittstellen für den Zugriff<br />

auf die verwalteten Entwurfsmuster betrifft, liegt der Schwerpunkt in diesem Kapitel<br />

auch in der genauen Beschreibung dieser Schnittstellen. Ein Anwendungsbeispiel soll<br />

dabei den konkreten Zugriff auf die interne Datenstruktur erläutern. Den Abschluss<br />

bildet die Beschreibung der Initialisierung der Datenstruktur.<br />

Die für die Implementierung von PSE-D verantwortlichen Klassen befinden sich ausschließlich<br />

im Paket pattern.base.datatype, daher wurde auf eine Darstellung der<br />

Architektur verzichtet.<br />

5.1 Programmierschnittstellen<br />

PSE-D bietet für bspw. andere Werkzeughersteller die Möglichkeit, auf die verwalteten<br />

Entwurfsmuster über Programmierschnittstellen zuzugreifen. Dafür ist die Repräsentation<br />

der Muster in <strong>einer</strong> internen Datenstruktur notwendig. Diese Struktur, die<br />

Möglichkeiten des Zugriffs und ein detailliertes Anwendungsbeispiel sind Gegenstand<br />

der folgenden Abschnitte.<br />

5.1.1 Interne Datenstruktur<br />

Die Entwurfsmuster werden bei PSE-D auf der Basis von XML im Dateisystem verwaltet.<br />

Um mittels Schnittstellen auf diese Struktur zuzugreifen, ist eine Klassenepräsentation<br />

dieser Muster notwendig, die in Abbildung 23 dargestellt ist.


PSE-D – Implementierungsbeschreibung 46<br />

PatternAdmin<br />

+clear()<br />

+getPatternCategoryList()<br />

+getPatternInfoList()<br />

+getPatternContainer()<br />

1 *<br />

PatternContainer<br />

PatternCategory<br />

PatternInfo<br />

+getPatternCategoryList()<br />

+getPatternInfoList()<br />

+setPatternCategoryList()<br />

+setPatternInfoList()<br />

RoleNotAvailableException<br />

*<br />

1 *<br />

1<br />

+addCategory()<br />

+getCategory()<br />

+getCategoryList()<br />

+getName()<br />

+getPatternInfoList()<br />

+removeCategory()<br />

+setName()<br />

+setPatternInfoList()<br />

1<br />

*<br />

1<br />

1 *<br />

+getCategoryList()<br />

+getClassificationList()<br />

+getDescriptionList()<br />

+getName()<br />

+getPattern()<br />

+setCategoryList()<br />

+setClassificationList()<br />

+setDescriptionList()<br />

+setName()<br />

+setPattern()<br />

1<br />

1<br />

*<br />

PatternRole<br />

Pattern<br />

PatternDescription<br />

+getCardinality()<br />

+setCardinality()<br />

+getCodeBody()<br />

+setCodeBody()<br />

+getCodeHeader()<br />

+setCodeHeader()<br />

+getDescription()<br />

+setDescription()<br />

+getName()<br />

+setName()<br />

+getType()<br />

+setType()<br />

+getClassRoleList()<br />

+getInterfaceRoleList()<br />

+getLanguage()<br />

+getName()<br />

+getMethodRoleList()<br />

+getRole()<br />

+getRoleList()<br />

+getVariableRoleList()<br />

+setName()<br />

+setLanguage()<br />

+getContent()<br />

+getContentType()<br />

+getHeaderName()<br />

+getHeaderType()<br />

+isCategory()<br />

+isDetailed()<br />

+isFile()<br />

+isPartOfOverview()<br />

+setContent()<br />

+setContentType()<br />

+setHeaderName()<br />

+setHeaderType()<br />

Abbildung 23: Klassendiagramm Datenstruktur von PSE-D<br />

Die Klasse PatternAdmin ist zuständig für den Zugriff auf die interne Datenstrukur.<br />

Sie wird gesondert in Abschnitt 0 beschrieben. Die anderen Klassen haben folgende<br />

Bedeutung:<br />

PatternContainer<br />

PatternContainer stellt das Wurzelobjekt der internen Musterdatenstruktur dar. Ein<br />

Objekt dieser Klasse enthält eine Liste der vorhandenen PatternCategory- und<br />

PatternInfo-Objekte. Mit einem PatternContainer-Objekt kann der Einstieg in die<br />

Struktur somit von zwei verschiedenen Punkten erfolgen.


PSE-D – Implementierungsbeschreibung 47<br />

PatternCategory<br />

Ein Objekt der Klasse PatternCategory verwaltet den Namen <strong>einer</strong> Kategorie und<br />

eine Liste aller Objekte vom Typ PatternInfo, die dieser Kategorie angehören. Zumal<br />

Kategoriezuordnungen auf maximal zwei Ebenen erfolgen können (siehe<br />

Abschnitt 4.5.2) ist die Verwaltung <strong>einer</strong> zusätzlichen Liste von PatternCategory-<br />

Objekten erforderlich. Um diese Kindobjekte hinzuzufügen bzw. wieder zu entfernen,<br />

stehen die Methoden addCategory() und removeCategory() <strong>zur</strong> Verfügung. Um ein<br />

Kindobjekt per Namen zu erhalten, kann die Methode getCategory() verwendet<br />

werden.<br />

PatternInfo<br />

Die Klasse PatternInfo kapselt den allgemeinen und den implementierungsspezifischen<br />

Beschreibungsteil eines Entwurfsmusters. Sie enthält den Namen des Musters,<br />

eine Liste der Klassifizierungen und eine Liste von PatternDescription-Objekten<br />

<strong>zur</strong> Repräsentation der allgemeinen Beschreibung. Ein Objekt vom Typ Pattern ist<br />

für den Implementierungsteil zuständig. Weiters wird eine Liste von<br />

PatternCategory-Objekten verwaltet, welche die Kategorien des Musters enthält.<br />

Für alle Eigenschaften wurden wieder get- und set-Methoden implementiert.<br />

PatternDescription<br />

Ein Objekt der Klasse PatternDescription repräsentiert ein description-Element<br />

gemäß der allgemeinen Beschreibungsdatei "manifest.xml". Neben Methoden für den<br />

Zugriff und die Bearbeitung der Subelemente von description stehen weiter Methoden<br />

<strong>zur</strong> Verfügung die in Tabelle 7 dargestellt sind.<br />

Methode<br />

isCategory()<br />

isPartOfOveview ()<br />

isDetailed()<br />

hasPath()<br />

Beschreibung<br />

Überpüft, ob ein Beschreibungselement eine Kategorie ist.<br />

Gibt an, ob ein Beschreibungselement Teil des Überblicks ist.<br />

Gibt an, ob ein Beschreibungselement Teil der Detailbeschreibung ist.<br />

Zeigt, ob der Inhalt des Beschreibungselementes in <strong>einer</strong> externen<br />

Datei liegt oder direkt aus der Beschreibungsdatei entnommen werden<br />

kann.<br />

Tabelle 7: Zusatzfunktionalitäten von PatternDescription<br />

Diese Methoden sind für die Kategoriezuordnung und die Erstellung der Musterdokumentation<br />

notwendig.


PSE-D – Implementierungsbeschreibung 48<br />

Pattern<br />

Mit der Klasse Pattern wird der implementierungsspezifische Beschreibungsteil eines<br />

Entwurfsmusters abgebildet. Sie enthält eine Liste der zugeordneten Rollen, den<br />

Namen und die Programmiersprache des Musters. Um eine spezielle Rolle zu erhalten,<br />

wurde die Methode getRole() implementiert, die bei Anfrage eines Rollennamens<br />

ein Objekt der Klasse PatternRole <strong>zur</strong>ückliefert. Existiert die angeforderte<br />

Rolle nicht, so wird eine Ausnahme vom Typ RoleNotAvailableException geworfen.<br />

Weiters existieren get- bzw. set-Methoden, um Listen von Rollen eines speziellen<br />

Typs zu erhalten bzw. zu setzten (z. B. eine Liste aller Rollen vom Typ "class" à<br />

getClassRoleList()). Um alle Rollen zu erhalten, kann die Methode<br />

getRoleList() verwendet werden.<br />

PatternRole<br />

Die Klasse PatternRole repräsentiert eine Rolle eines Entwurfsmusters mit allen laut<br />

Abschnitt 4.2 identifizierten Eigenschaften und liefert somit die bei der Anwendung<br />

erforderlichen Werte. Für den Zugriff bzw. die Bearbeitung der Eigenschaften existieren<br />

get- und set-Methoden.<br />

5.1.2 Datenzugriff<br />

Der Datenzugriff auf die interne Muster-Infrastruktur erfolgt über die Klasse<br />

PatternAdmin. Die Struktur des Zugriffs wird in Abbildung 24 ersichtlich.<br />

PatternAdmin<br />

+clear()<br />

+getPatternCategoryList()<br />

+getPatternInfoList()<br />

+getPatternContainer()<br />

1 1<br />

1<br />

1<br />

*<br />

PatternContainer<br />

+getPatternCategoryList()<br />

+getPatternInfoList()<br />

+setPatternCategoryList()<br />

+setPatternInfoList()<br />

PatternCategory<br />

+addCategory()<br />

+getCategory()<br />

+getCategoryList()<br />

+getName()<br />

+getPatternInfoList()<br />

+removeCategory()<br />

+setName()<br />

+setPatternInfoList()<br />

*<br />

PatternInfo<br />

+getCategoryList()<br />

+getDescriptionList()<br />

+getName()<br />

+getPattern()<br />

+setCategoryList()<br />

+setDescriptionList()<br />

+setName()<br />

+setPattern()<br />

Abbildung 24: Klassendiagramm Datenzugriff von PSE-D


PSE-D – Implementierungsbeschreibung 49<br />

PatternAdmin<br />

Die Klasse PatternAdmin stellt einige Zugriffsmethoden <strong>zur</strong> Verfügung, die in<br />

Tabelle 8 dargestellt sind.<br />

Methode<br />

getPatternCategoryList()<br />

getPatternInfoList()<br />

getPatternContainer()<br />

Beschreibung<br />

Liefert eine Liste aller im System vorhandenen PatternCategory-<br />

Objekte.<br />

Liefert eine Liste aller im System vorhandenen PatternInfo-<br />

Objekte.<br />

Liefert ein PatternContainer-Objekt, welches Listen der vorhandenen<br />

PatternCategory- und PatternInfo-Objekte verwaltet.<br />

Tabelle 8: Zugriffsmethoden von PatternAdmin<br />

Weiters wurden noch einige Administrationsmethoden integriert, die in Tabelle 9<br />

ersichtlich sind.<br />

Methode<br />

clear()<br />

getPatternPath()<br />

Beschreibung<br />

Löscht die aktuelle interne Datenstruktur. Diese Methode wird benötigt,<br />

wenn sich in den Beschreibungsdateien oder in der Dokumentation<br />

der Inhalt geändert hat und dadurch Navigation und Visualisierung<br />

neu initialisiert werden müssen.<br />

Liefert den aktuellen Wert für PATTERN_ROOT. Dieser Wert wird<br />

aus der globalen Konfigurationsdatei "pattern_configuration.xml"<br />

entnommen, siehe Abschnitt 3.4.3.<br />

Tabelle 9: Administrationsmethoden von PatternAdmin<br />

Mit diesen Schnittstellen wird Entwicklern ermöglicht, die interne Datenstruktur in<br />

ihren Anwendungen weiter zu verwenden. Die Voraussetzung dafür ist jedoch eine<br />

genaue und sorgfältige <strong>Definition</strong> der Entwurfsmuster.<br />

5.1.3 Anwendungsbeispiel<br />

Zum besseren Verständnis der Schnittstellen werden in diesem Kapitel einige Beispiele<br />

zu deren Verwendung dargelegt. Da vor allem die variable Gestaltung der Kategoriezuordnung<br />

viele Möglichkeiten bietet, wird auf diesen Anwendungsbereich ein<br />

erhöhtes Augenmerk gelegt. Für die folgenden Beispiele wurden die drei Muster<br />

Abstract Factory, Interceptor und Observer angelegt, deren Kategoriedefinitionen in<br />

Abbildung 25 - Abbildung 27 dargestellt sind.


PSE-D – Implementierungsbeschreibung 50<br />

Abbildung 25: Kategoriedefinition Abstract Factory<br />

Abbildung 26: Kategoriedefinition Interceptor<br />

Abbildung 27: Kategoriedefinition Observer<br />

Anhand verschiedener Codebeispiele wird im folgenden der Zugriff auf die interne<br />

Datenstruktur erläutert. Als Ausgabefunktion wird dabei die Methode<br />

println()verwendet.<br />

1 PatternContainer container = PatternAdmin.getPatternContainer();<br />

2 PatternInfo info =<br />

3 (PatternInfo)container.getPatternInfoList().get(0);<br />

4 println(info.getName()); // Ausgabe von "Abstract Factory"<br />

5 Pattern pat = info.getPattern();<br />

6 PatternRole role = (PatternRole) pat.getRoleList().get(1);<br />

7 println(role.getRoleName()); // Ausgabe von "AbstractProduct"<br />

8 PatternDescription desc = (PatternDescription)<br />

9 info.getDescriptionList().get(0);<br />

10 println(desc.getHeaderName() // Ausgabe von "Gamma"<br />

Quellcode 2: Abarbeitung über PatternInfo-Liste<br />

Bei Ausführung von Quellcode 2 ergibt sich eine Objektstruktur, die in Abbildung 28<br />

dargestellt ist. Zusätzlich wurden die bei den Ausgaben mit println() betroffenen<br />

Objekte gekennzeichnet.


PSE-D – Implementierungsbeschreibung 51<br />

PatternContainer<br />

PatternInfo<br />

(Abstract Factory)<br />

PatternInfo<br />

(Interceptor)<br />

PatternInfo<br />

(Observer)<br />

Pattern<br />

PatternDescription<br />

(Gamma)<br />

PatternDescription<br />

(Intent)<br />

…<br />

PatternRole<br />

(AbstractFactory)<br />

PatternRole<br />

(AbstractProduct)<br />

…<br />

Abbildung 28: Objektstruktur nach Ausführung von Quellcode 2<br />

Mit den Codezeilen 2 und 3 holt man sich aus einem PatternContainer-Objekt das<br />

erste PatternInfo-Objekt (Index 0) aus der Liste. Da die Entwurfsmuster alphabetisch<br />

sortiert werden, ist dies das Objekt für das Muster Abstract Factory.<br />

info.getPattern() wird das Pattern-Objekt <strong>zur</strong>ückgegeben, welches eine Liste<br />

von PatternRole-Objekten verwaltet, die mit der Methode getRoleList() (Zeile 6)<br />

erhältlich ist. Diese Objekte enthalten die für die Anwendung des Entwurfsmusters<br />

notwendigen Informationen. Die Abfrage eines PatternDescription-Elementes in<br />

den Zeilen 8 und 9 erfolgt nach dem gleichen Schema. Im Beispiel wird das erste entnommen<br />

und dessen Name ("Gamma") ausgegeben.<br />

Um das PatternInfo-Objekt des zweiten Muster (Index 1) zu erhalten müssen folgende<br />

Codezeilen ausgeführt werden:<br />

PatternInfo info =<br />

(PatternInfo)container.getPatternInfoList().get(1);<br />

Beim ersten Codebeispiel war der Ausgangspunkt eine Liste aller vorhandenen Entwurfsmuster.<br />

Eine andere Variante ist, die Abarbeitung über eine Liste der vorhandenen<br />

Kategorien zu starten. Zum besseren Verständnis des Aufbaus der Kategorien<br />

werden für dieses Beispiel drei Codeblöcke verwendet, die zusammenhängend betrachtet<br />

werden müssen.<br />

Mit


PSE-D – Implementierungsbeschreibung 52<br />

// Hauptkategorie<br />

1 PatternContainer container = PatternAdmin.getPatternContainer();<br />

2 PatternCategory cat1 = (PatternCategory)<br />

3 container.getPatternCategoryList().get(1);<br />

4 println(cat1.getName()); // Ausgabe von "Gamma”<br />

5 PatternInfo info1 = (PatternInfo)<br />

6 cat1.getPatternInfoList().get(0);<br />

7 println(info1.getName()); // Ausgabe von "Abstract Factory”<br />

8 PatternInfo info2 = (PatternInfo) '<br />

9 cat1.getPatternInfoList().get(1);<br />

10 println(info2.getName()); // Ausgabe von "Observer”<br />

Quellcode 3: Abarbeitung über PatternCategory-Liste (1/3)<br />

Quellcode 3 hat nach Ausführung eine Objekstruktur gemäß Abbildung 29 <strong>zur</strong> Folge.<br />

PatternContainer<br />

PatternCategory<br />

(Buschmann)<br />

PatternCategory<br />

(Gamma)<br />

PatternInfo<br />

(Abstract Factory)<br />

PatternInfo<br />

(Observer)<br />

Abbildung 29: Objektstruktur nach Ausführung von Quellcode 3<br />

Die Codezeilen 2 und 3 holen sich aus dem PatternContainer-Objekt das zweite<br />

PatternCategory-Objekt, dessen Name "Gamma" ist (das erste ist aufgrund der alphabetischen<br />

Reihenfolge "Buschmann"). Das erste PatternInfo-Objekt aus der<br />

Kategorie "Gamma" ist jenes von Abstract Factory, das zweite jenes des Musters<br />

Observer.<br />

// Subkategorie 1<br />

1 PatternContainer container = PatternAdmin.getPatternContainer();<br />

2 PatternCategory cat1 = (PatternCategory)<br />

3 container.getPatternCategoryList().get(1);<br />

4 PatternCategory cat2 = (PatternCategory)<br />

5 cat1.getCategoryList().get(0);<br />

6 println(cat2.getName()); // Ausgabe von "Behavioral Patterns”<br />

7 PatternInfo info = (PatternInfo)<br />

8 cat2.getPatternInfoList().get(0);<br />

9 println(info.getName()); // Ausgabe von "Observer"<br />

Quellcode 4: Abarbeitung über PatternCategory-Liste (2/3)<br />

Quellcode 4 hat das Ziel, das erste PatternInfo-Objekt der ersten Subkategorie von<br />

"Gamma" auszugeben. Die Objekstruktur wird in Abbildung 30 ersichtlich.


PSE-D – Implementierungsbeschreibung 53<br />

PatternContainer<br />

PatternCategory<br />

(Buschmann)<br />

PatternCategory<br />

(Gamma)<br />

PatternCategory<br />

(Behavioral Patterns)<br />

PatternCategory<br />

(Creational Patterns)<br />

PatternInfo<br />

(Observer)<br />

Abbildung 30: Objektstruktur nach Ausführung von Quellcode 4<br />

Mit den Codezeilen 4 und 5 erhält man das erste Subkategorie-Objekt ("Behavioral<br />

Patterns") aus der Kategorie "Gamma". Diese Kategorie hat genau ein PatternInfo-<br />

Objekt – jenes von Observer.<br />

// Subkategorie 2<br />

1 PatternContainer container = PatternAdmin.getPatternContainer();<br />

2 PatternCategory cat1 = (PatternCategory)<br />

3 container.getPatternCategoryList().get(1);<br />

4 PatternCategory cat2 = (PatternCategory)<br />

5 cat1.getCategoryList().get(1);<br />

6 println(cat2.getName()); // Ausgabe von "Creational Patterns”<br />

7 PatternInfo info = (PatternInfo)<br />

8 cat2.getPatternInfoList().get(0);<br />

9 println(info.getName() // Ausgabe von "Abstract Factory”<br />

Quellcode 5: Abarbeitung über PatternCategory-Liste (3/3)<br />

In Quellcode 5 wird die Abarbeitung der Datenstruktur über die zweite Subkategorie<br />

von "Gamma" dargestellt. Die Objekstruktur nach Ausführung dieses Quellcodes ist<br />

in Abbildung 31 dargestellt.


PSE-D – Implementierungsbeschreibung 54<br />

PatternContainer<br />

PatternCategory<br />

(Buschmann)<br />

PatternCategory<br />

(Gamma)<br />

PatternCategory<br />

(Behavioral Patterns)<br />

PatternCategory<br />

(Creational Patterns)<br />

PatternInfo<br />

(Abstract Factory)<br />

Abbildung 31: Objektstruktur nach Ausführung von Quellcode 5<br />

Die zweite Subkategorie von "Gamma" lautet "Creational Patterns" und hat ein<br />

PatternInfo-Objekt mit dem Namen Abstract Factory.<br />

Die Hauptkategorie "Gamma" verwaltet also zwei PatternInfo-Objekte und ihre<br />

Subkategorien "Behavioral Patterns" und "Creational Patterns" jeweils nur eines, was<br />

genau der <strong>Definition</strong> der Kategorien laut Abbildung 25 bis Abbildung 27 entspricht.<br />

5.2 Initialisierung der Datenstruktur<br />

Abschnitt 5.1 befasste sich mit der Klassenrepräsentation der Entwurfsmuster und den<br />

Zugriffsmethoden auf diese. Die Initialisierung dieser internen Muster-Infrastruktur<br />

wird in diesem Abschnitt näher erläutert.<br />

Die Initialisierung der Datenstruktur erfolgt in der Klasse PatternAdmin mit der Methode<br />

initialize(), die in Quellcode 6 inklusive der notwendigen globalen<br />

Variablendeklarationen dargestellt ist. Folgende Methoden aus Tabelle 10, deren<br />

Implementierung nicht dargestellt ist, werden zusätzlich benötigt.<br />

Methode<br />

getDirectories(path)<br />

getPatternCategoryList<br />

(directory,info)<br />

Beschreibung<br />

Liefert eine Liste aller Verzeichnisse unter path <strong>zur</strong>ück.<br />

Liefert für ein Muster (identifiziert über directory, da für jedes ein<br />

Verzeichnis angelegt sein muss) eine Liste passender PatternCategory-<br />

Objekte <strong>zur</strong>ück. Bspw. liefert diese Methode für Abstract Factory eine<br />

Liste mit den Kategorien "Gamma" und "Creational Patterns".


PSE-D – Implementierungsbeschreibung 55<br />

hasImplementation<br />

(directory)<br />

getClassificationList<br />

(directory)<br />

getDescriptionList<br />

(directory)<br />

initializeCategories()<br />

Überprüft, ob für ein Muster eine Implementierungsbeschreibung mit dem<br />

Wert in "pattern_configuration.xml" (siehe Abschnitt 3.4.3) vorliegt.<br />

Liefert eine Liste der Klassifizierungen des Musters.<br />

Liefert eine Liste aller PatternDescription-Objekte, die zu diesem<br />

Muster gehören.<br />

Ruft von jedem PatternCategory-Objekt in der Variable<br />

patternCategoryTable die Methode initialize() auf und bewirkt<br />

damit eine Neuinitialisierung der Objekte.<br />

Tabelle 10: Methoden für die Musterinitialisierung<br />

1 private static Hashtable patternInfoTable = new Hashtable();<br />

2 private static Hashtable patternCategoryTable = new Hashtable();<br />

3 private static void initialize() throws ConfigFileException,<br />

IOException, JDOMException {<br />

4 List directories = getDirectories(getPatternPath());<br />

5 Iterator it = directories.iterator();<br />

6 boolean changed = false;<br />

7 while (it.hasNext()) {<br />

8 String directory = (String) it.next();<br />

9 File f = new File(getPatternPath() + directory +<br />

10 File.separator + PatternAdmin.MANIFEST);<br />

11 if (f.exists()) {<br />

12 if (patternInfoTable.get(directory)==null) {<br />

13 PatternInfo info = new PatternInfo(directory);<br />

14 info.setCategoryList(getPatternCategoryList<br />

15 (directory,info));<br />

16 if (hasImplementation(directory)) {<br />

17 info.setPattern(new Pattern(directory,<br />

18 ConfigFile.getValue(LANGUAGE)));<br />

19 }<br />

20 info.setClassificationList(<br />

21 getClassificationList(directory));<br />

22 info.setDescriptionList(<br />

23 getDescriptionList(directory));<br />

24 patternInfoTable.put(directory, info);<br />

25 changed = true;<br />

26 }<br />

27 }<br />

28 }<br />

29 if (changed) {<br />

30 initializeCategories();<br />

31 }<br />

32 }<br />

33 }<br />

34 }<br />

Quellcode 6: Methode initialize()<br />

Die beiden globalen Variablen patternInfoTable und patternCategoryTable<br />

(Zeilen 1 und 2) werden verwendet, um alle vorhandenen PatternInfo- sowie<br />

PatternCategory-Objekte abzuspeichern. Es wurden dafür Objekte vom Typ<br />

Hashtable verwendet, da diese eine komfortable Verwaltung von Schlüsseln (Zei-


PSE-D – Implementierungsbeschreibung 56<br />

chenketten) und dazugehörigen Wertobjekten <strong>zur</strong> Verfügung stellen. Weiters haben<br />

Hashtable-Objekte eine Methode get(), die über <strong>Definition</strong> eines Schlüssels ein<br />

passendes Wertobjekt oder null liefern, was bei herkömmlicher Listenverwaltung, z.<br />

B. mit Objekten vom Typ java.util.List, nicht der Fall ist.<br />

Die Methode intialize() hat das Ziel alle Verzeichnisse unter dem Wurzelverzeichnis<br />

der Muster (PATTERN_ROOT) nach <strong>einer</strong> allgemeinen Beschreibungsdatei<br />

"manifest.xml" zu durchsuchen, und bei Auffinden die Musterinitialisierung vorzunehmen.<br />

In Zeile 4 aus Quellcode 6 wird eine Liste dieser Verzeichnisse mit dem Methodenaufruf<br />

getDirectories(getPatternPath()) <strong>zur</strong>ückgeliefert. Diese werden in<br />

<strong>einer</strong> Schleife abgearbeitet, wobei überprüft wird, ob eine Datei "manifest.xml" in<br />

dem Verzeichnis existiert (Zeile 11). Ist dies der Fall, so wird in Zeile 12 abgefragt, ob<br />

dieses Muster schon einmal initialisiert wurde und somit schon in der globalen Variable<br />

patternInfoTable gespeichert ist. Wenn nicht, wird ein neues PatternInfo-<br />

Objekt angelegt und in den Zeilen 14 und 15 mit <strong>einer</strong> Liste der passenden<br />

PatternCategory-Objekte versehen.<br />

Sofern für das Muster eine Implementierungsbeschreibung existiert wird ein Objekt<br />

der Klasse Pattern angelegt, welches im Konstruktor 4 die Initalisierung der<br />

Rollenbeschreibung (PatternRole-Objekte) vornimmt. Weiters werden noch eine<br />

Liste der Klassifizierungen (Zeilen 20 und 21) und eine Liste der Beschreibungen<br />

(PatternDescription-Objekte, Zeilen 22 und 23) für die Initialisierung benötigt.<br />

Danach wird das neu angelegte PatternInfo-Objekt zu der Variable<br />

patternInfoTable hinzugefügt, damit es nicht ein zweites mal initialisiert wird. Die<br />

Variable changed indiziert, dass bei einem Wert true ein neues PatternInfo hinzugefügt<br />

wurde und sich somit alle PatternCategory-Objekte neu initialisieren müssen<br />

(Zeile 30), damit alle Zuordnungen stimmen.<br />

Egal welcher Einstiegspunkt in die interne Datenstruktur gewählt wird (PatternInfo-<br />

Liste oder PatternCategory-Liste), die Methode initialize() wird, sofern die<br />

Initialisierung noch nicht erfolgte, vorher aufgerufen.<br />

4 Ein Konstruktor ist eine Methode, die beim Anlegen eines Objektes aufgerufen wird.


PSE-D – Implementierungsbeschreibung 57<br />

5.3 Zusammenfassung<br />

In diesem Kapitel wurden die Implementierung von PSE-D vorgestellt. Diese besteht<br />

zu einem Großteil aus Programmierschnittstellen mit deren Hilfe andere Anwendungen<br />

auf die verwaltete Muster-Infrastruktur zugreifen können. Die Klasse<br />

PatternAdmin stellt dabei die Methoden für den Zugriff <strong>zur</strong> Verfügung. Die Repräsentation<br />

der Datenstruktur übernehmen die Klassen PatternContainer,<br />

PatternCategory, PatternInfo, PatternDescription, Pattern und<br />

PatternRole. Weiters wurde mit einem Anwendungsbeispiel die konkrete Verwendung<br />

der Schnittstellen vorgestellt. Den Abschluss bildete eine Beschreibung der Initialisierung<br />

der internen Datenstruktur.


PSE-V - Darstellung von Entwurfsmustern 58<br />

6 PSE-V - Darstellung von<br />

Entwurfsmustern<br />

PSE-V ermöglicht als <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse die Navigation<br />

durch die im System verwalteten Muster und die Visualisierung deren Dokumentation.<br />

Voraussetzung für die Anwendung ist eine genaue <strong>Definition</strong> der Entwurfsmuster<br />

und deren Dokumentation laut PSE-D, da PSE-V auf die <strong>zur</strong> Verfügung<br />

gestellten Programmierschnittstellen zugreift, um Daten über die Muster zu erhalten.<br />

Dieses Kapitel befasst sich mit der Struktur, den Entwurfszielen und der Bedienung<br />

von PSE-V.<br />

6.1 Struktur<br />

PSE-V besteht aus einem Teil <strong>zur</strong> Musternavigation ("Pattern Navigator") und einem<br />

Teil <strong>zur</strong> Darstellung der HTML-Dokumentation ("Pattern Browser"). Diese beiden<br />

Komponenten wurden als Views implementiert (siehe Abschnitt 3.3). Die Anwendung<br />

von Views wird in Abschnitt 6.3 näher erläutert. Abbildung 32 illustriert die Struktur<br />

von PSE-V.<br />

Pattern Navigator<br />

(Musternavigation)<br />

steuert<br />

Pattern Browser<br />

(Darstellung Dokumentation)<br />

Abbildung 32: Struktur von PSE-V<br />

In "Pattern Navigator" können die im System vorhandenen Entwurfsmuster ausgewählt<br />

werden. Die Auswahl eines Musters bewirkt die Ansteuerung und Darstellung<br />

der generierten HTML-Dokumentation in "Pattern Browser".<br />

6.2 Entwurfsziele<br />

Bei der Entwicklung von PSE-V wurden folgende Entwurfsziele verfolgt:<br />

‣ Integration in eine <strong>Entwicklungsumgebung</strong>: Derzeit existieren bereits einige<br />

Werkzeuge, die das Verwalten und die Anwendung von Entwurfsmustern<br />

unterstützen, z. B: Pattern by Example [Delta 2002a]. Die meisten davon<br />

sind jedoch nicht in eine <strong>Entwicklungsumgebung</strong> integriert. Der Vorteil


PSE-V - Darstellung von Entwurfsmustern 59<br />

<strong>einer</strong> Integration liegt in der Konsistenz der Benutzerführung, da ein eingebettetes<br />

Werkzeug genau dem look and feel der Umgebung angepasst werden<br />

kann.<br />

‣ Übersichtliche Darstellung: Die verwalteten Entwurfsmuster und deren<br />

Dokumentation sollen in <strong>einer</strong> übersichtlichen Art und Weise dargestellt<br />

werden. Daher wurde <strong>zur</strong> Navigation eine Baumstruktur und für die Dokumentation<br />

das HTML-Format gewählt.<br />

6.3 Bedienung<br />

Die Erklärung der Bedienung von PSE-V bezieht sich auf die Version 2.0 der <strong>Entwicklungsumgebung</strong><br />

Eclipse. Da die Komponenten von PSE-V ("Pattern Navigator"<br />

und "Pattern Browser") als Views implementiert wurden, müssen sie mit einem Menübefehl<br />

von Eclipse gestartet werden. Abbildung 33 und Abbildung 34 illustrieren das<br />

Öffnen der benötigten Views.<br />

Abbildung 33: Auswahl von Views


PSE-V - Darstellung von Entwurfsmustern 60<br />

Abbildung 34: Menüpunkt "Other" bei der Auswahl von Views<br />

Mit dem Menüpunkt "Window à Show View à Other" können unter der Kategorie<br />

"Design Patterns" (Abbildung 34) die für PSE-V relevanten Views "Pattern Navigator"<br />

und "Pattern Browser" ausgewählt werden. Abbildung 33 zeigt die Standardviews von<br />

Eclipse, welche die allgemeinen Aufgaben der <strong>Entwicklungsumgebung</strong> übernehmen.<br />

Mit dem Menüpunkt "Window à Customize Perspective" ist eine Konfiguration dieser<br />

Ansicht möglich, um weitere Views in die Standardansicht zu übernehmen.<br />

Nach Auswahl von "Pattern Navigator" präsentiert sich eine beispielhafte Musterdefinition<br />

laut Abbildung 35. Es wurden zu diesem Zweck 12 Entwurfsmuster aus den<br />

verschiedensten Kategorien definiert.


PSE-V - Darstellung von Entwurfsmustern 61<br />

Abbildung 35: View "Pattern Navigator"<br />

Mit dieser Darstellung ist eine komfortable Navigation durch die verwalteten Muster<br />

möglich. Ändert sich etwas an der Struktur der XML-Beschreibungsdateien oder dem<br />

Inhalt der Dokumentation, so erneuert ein Klick auf den Button mit den Symbol die<br />

Struktur der Navigation und die Dokumentation. Die weiteren Symbole sind für das<br />

Navigieren innerhalb des Baumes hilfreich bzw. das "X" zum Schließen der View.<br />

Alle diese Möglichkeiten (außer das Schließen) stehen auch in einem Kontextmenü<br />

bei Klicken der rechten Maustaste <strong>zur</strong> Verfügung.<br />

Um eine Musterdokumentation zu betrachten, genügt die Auswahl eines Musters in<br />

der Navigation. Dadurch wird die generierte Dokumentation in "Pattern Browser"<br />

sichtbar. Abbildung 36 illustriert die Verwendung bei Auswahl des Musters Adapter.


PSE-V - Darstellung von Entwurfsmustern 62<br />

Abbildung 36: Dokumentation für Adapter dargestellt in "Pattern Browser"


PSE-V - Darstellung von Entwurfsmustern 63<br />

Anwendung von Entwurfsmustern<br />

Neben dem Betrachten der Dokumentation liegt vor allem die Anwendung der Entwurfsmuster<br />

im Interesse eines Benutzers. Bei der Anwendung soll konkreter Quellcode<br />

erzeugt werden, der in den zu entwickelnden Systemen verwendet werden kann.<br />

Für diesen Zweck wurde ebenfalls für die <strong>Entwicklungsumgebung</strong> Eclipse das Werkzeug<br />

PSE-Application entwickelt, das eingehend in [Mayr-Kern 2002] beschrieben<br />

wird. Dieses Werkzeug verwendet die von PSE-D <strong>zur</strong> Verfügung gestellten Schnittstellen,<br />

um auf die interne Datenstruktur zuzugreifen.<br />

6.4 Zusammenfassung<br />

Dieses Kapitel beschäftigte sich mit der Beschreibung des Werkzeuges PSE-V <strong>zur</strong><br />

Visualisierung von Entwurfsmustern und deren Dokumentation. PSE-V verwendet<br />

dabei die von PSE-D <strong>zur</strong> Verfügung gestellten Programmierschnittstellen. Es wurde<br />

dargelegt, welche Entwurfsziele bei der Entwicklung von PSE-V verfolgt wurden und<br />

aus welchen Komponenten das Werkzeug besteht. Bei der Bedienung von PSE-V<br />

können über eine Baumnavigation einzelne Muster ausgewählt werden, deren Dokumentation<br />

daraufhin in einem eigenem Fenster dargestellt wird.


PSE-V-Implementierungsbeschreibung 64<br />

7 PSE-V-Implementierungsbeschreibung<br />

PSE-V ist eine <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse, die in Java implementiert<br />

wurde. Somit musste die Entwicklung von PSE-V ebenfalls in Java vorgenommen<br />

werden. Dieses Kapitel zeigt den Aufbau der Implementierung, legt deren<br />

Architektur dar und beschreibt die einzelnen Teile. Den Abschluss bilden einige ausgewählte<br />

Implementierungsdetails.<br />

7.1 Struktur<br />

Die Implementierung von PSE-V gliedert sich in vier Pakete und die Klasse<br />

BasePlugin (siehe Abbildung 37). Alle Teile tragen dabei den Präfix pattern.base<br />

und werden daher in der weiteren Arbeit auch mit ihrem vollen Namen wie z. B.<br />

pattern.base.html oder pattern.base.BasePlugin angesprochen. Da<br />

BasePlugin eine allgemeine Aufgabe erfüllt, wurde auf eine Zuordnung zu einem der<br />

Detailpakete verzichtet.<br />

treeview<br />

+ViewContentProvider<br />

+TreeObject<br />

+TreeParent<br />

+ViewLabelProvider<br />

+PatternTreeView<br />

system<br />

+Debug<br />

+ConfigFileException<br />

+ConfigFile<br />

+Log<br />

+PatternComparator<br />

htmlview<br />

+PatternWebBrowser<br />

+PatternBrowserView<br />

+HTMLTag<br />

+PatternDoku<br />

html<br />

AbstractUIPlugin<br />

BasePlugin<br />

Abbildung 37: Aufbau Implementierung von PSE-V


PSE-V-Implementierungsbeschreibung 65<br />

pattern.base.BasePlugin<br />

Jedes Plugin benötigt eine Klasse, die AbstractUIPlugin aus dem Eclipse-Paket<br />

org.eclipse.ui.plugin erweitert. BasePlugin übernimmt diese Funktion und<br />

ermöglicht damit die Anwendung von "PatternNavigator" und "PatternBrowser". Sie<br />

initialisiert die verwendeten Bilder und Schriften und stellt weiters eine Methode für<br />

den Zugriff auf die Eigenschaften von Plugins <strong>zur</strong> Verfügung (siehe Abschnitt 7.3.3).<br />

pattern.base.system<br />

Diese Paket ist zuständig für allgemeine Aufgaben. Es stellt unter anderem Funktionalitäten<br />

für den Zugriff auf die globale Konfigurationsdatei<br />

"pattern_configuration.xml" und für die Protokollierung <strong>zur</strong> Verfügung.<br />

pattern.base.html<br />

Die Klassen in diesem Paket generieren die HTML-Dokumentation und die Musternavigation<br />

gemäß <strong>Definition</strong> in den XML-Beschreibungsdateien.<br />

pattern.base.treeview<br />

Dieses Paket ist verantwortlich für den Aufbau der View "Pattern Navigator", welche<br />

die Musternavigation ermöglicht. Es verwendet dafür unter anderem Methoden der<br />

Klasse pattern.base.html.PatternDoku.<br />

pattern.base.htmlview<br />

Die Klassen in diesem Paket werden verwendet, um die View "Pattern Browser" <strong>zur</strong><br />

Darstellung der HTML-Dokumentation zu generieren.<br />

7.2 Pakete<br />

Die folgenden Abschnitte erläutern die Aufgaben und die Zusammenarbeit der einzelnen<br />

Pakete.<br />

7.2.1 pattern.base.html<br />

Dieses Paket ist zuständig für die Generierung der Musternavigation und der HTML-<br />

Dokumentation. Die folgenden Klassen spielen dabei eine Rolle:<br />

PatternDoku<br />

Die statische Klasse PatternDoku liefert über eine öffentliche Methode das Wurzelelement<br />

der Navigation <strong>zur</strong>ück. Beim Aufruf dieser Methode wird das Verzeichnis<br />

PATTERN_ROOT nach Unterverzeichnissen mit <strong>einer</strong> Beschreibungsdatei


PSE-V-Implementierungsbeschreibung 66<br />

"manifest.xml" durchsucht. Ist diese Datei vorhanden (ein Muster ist somit identifiziert),<br />

so werden folgende Aufgaben durchgeführt:<br />

‣ Aufnahme dieses Musters in die Navigation anhand der Kategoriedefinition(en)<br />

in "manifest.xml".<br />

‣ Generieren der HTML-Gesamtdokumentation des Entwurfsmusters aus den<br />

einzelnen Dokumentationsteilen. Diese trägt den Namen des Musters (z. B:<br />

"Abstract Factory.html").<br />

HTMLTag<br />

Diese Klasse enthält einige Konstanten für HTML-Code zum Aufbau der Dokumentation.<br />

7.2.2 pattern.base.system<br />

Das Paket pattern.base.system wird für allgemeine Systemaufgaben verwendet<br />

und besteht aus den folgenden Klassen:<br />

ConfigFile<br />

ConfigFile ist eine statische Klasse, die Lesezugriff auf Werte in der globalen Konfigurationsdatei<br />

"pattern_configuration.xml" erlaubt.<br />

ConfigFileException<br />

Diese Klasse wird für die Ausnahmebehandlung verwendet, falls mit ConfigFile ein<br />

falscher Schlüsselwert abgefragt wurde.<br />

Debug<br />

Wird für Testausgaben bei der Entwicklung verwendet.<br />

Log<br />

Protokolliert in eine mit der Konfigurationsdatei "pattern_configuration.xml" definierte<br />

Datei (Schlüssel "patternLog").<br />

PatternComparator<br />

Wird für die Sortierung der Entwurfsmuster benötigt.<br />

7.2.3 pattern.base.treeview<br />

Das Paket pattern.base.treeview wird für die Darstellung der Musternavigation<br />

verwendet. Diese wird durch ein Objekt der Klasse TreeView aus dem Eclipse-Paket<br />

org.eclipse.jface.viewers repräsentiert, das folgende Klassen benötigt:


PSE-V-Implementierungsbeschreibung 67<br />

TreeObject<br />

Ein Objekt dieser Klasse repräsentiert ein Muster im Navigationsbaum. Es enthält<br />

einen Pfad für eine HTML-Datei mit dem die Dokumentation angesteuert werden<br />

kann. Bei Auswahl eines Musters wird dieser Wert <strong>zur</strong>ückgeliefert und in der View<br />

"Pattern Browser" die passende Dokumentation angesteuert und dargestellt.<br />

TreeParent<br />

Objekte dieses Typs sind <strong>Erweiterung</strong>en der Klasse TreeObject und repräsentieren<br />

eine Kategorie im Navigationsbaum. Ein TreeParent-Objekt kann mehrere<br />

TreeObject-Objekte verwalten und damit beliebige hierachische Strukturen aufbauen.<br />

Auch das Wurzelobjekt der Navigation ist vom Typ TreeParent.<br />

ViewContentProvider<br />

Ein Objekt der Klasse ViewContentProvider ist zuständig für den Inhalt der<br />

TreeView. Es liefert mit Hilfe der Klasse pattern.base.html.PatternDoku das<br />

Wurzelobjekt der Navigation.<br />

ViewLabelProvider<br />

Mit der Klasse ViewLabelProvider wird das Aussehen des TreeView-Objektes<br />

festgelegt. Es bestimmt die Darstellung der Bildsymbole und des Textes der Navigationselemente.<br />

PatternTreeView<br />

Die Klasse PatternTreeView ist eine <strong>Erweiterung</strong> von ViewPart aus dem Paket<br />

org.eclipse.ui.part und stellt die Hauptkomponente der View "Pattern Navigator"<br />

dar. Beim Starten von "Pattern Navigator" über das Eclipse-Menü wird ein Objekt<br />

dieser Klasse angelegt, das die Navigation und sämtliche Menüs initialisiert.<br />

7.2.4 pattern.base.htmlview<br />

Die Klassen aus dem Paket pattern.base.htmlview sind zuständig für den Aufbau<br />

der View "Pattern Browser" <strong>zur</strong> Visualisierung der Musterdokumentation. Sie sind<br />

<strong>Erweiterung</strong>en von Beispielimplementierungen aus dem Eclipse-Paket<br />

org.eclipse.swt.examples.ole.win32, die mit Hilfe von Windows-Komponenten<br />

einen HTML-Browser aufbauen.


PSE-V-Implementierungsbeschreibung 68<br />

PatternWebBrowser<br />

Ein Objekt der Klasse PatternWebBrowser kapselt die Funktionalitäten eines HTML-<br />

Browsers 5 , der in der Klasse PatternBrowserView verwendet wird. Es stellt dabei die<br />

verschiedensten Methoden <strong>zur</strong> Verfügung, um die gewohnten Funktionalitäten von<br />

herkömmlichen HTML-Browsern nachzubilden, z. B. Vorwärtsnavigation, Rückwärtsnavigation<br />

und Aktualisierung.<br />

PatternBrowserView<br />

Diese Klasse ist als <strong>Erweiterung</strong> von org.eclipse.ui.part.ViewPart die Hauptkomponente<br />

von "Pattern Browser". Sie enthält eine Instanz von<br />

PatternWebBrowser. Diese liefert zwar die Methoden, die man von HTML-Browsern<br />

gewohnt ist, jedoch nicht die grafischen Elemente (Buttons, Textfeld für URL-<br />

Eingabe usw.). Daher ist auch die Initialisierung der Benutzerschnittstelle eine Aufgabe<br />

von PatternBrowserView.<br />

7.3 Ausgewählte Details<br />

Dieser Abschnitt befasst sich mit einigen ausgewählten Implementierungsdetails von<br />

PSE-V. Da bei der Entwicklung vor allem der Zugriff auf XML eine große Rolle<br />

spielte, werden mit einem Exkurs über XML-Programmierschnittstellen (API's – application<br />

programming interfaces) die Zugriffsmöglichkeiten kurz erläutert.<br />

7.3.1 Exkurs: XML-API's<br />

Mit der Entwicklung von XML wurden auch nach und nach einige Werkzeuge entwickelt.<br />

Für diese Werkzeuge mussten Möglichkeiten geschaffen werden, um XML-Dokumente<br />

zu lesen bzw. zu schreiben. Um eine einheitliche Schnittstelle für den Zugriff<br />

auf XML-Dokumente zu gewährleisten, wurden einige API's entwickelt, von denen<br />

die bekanntesten kurz vorgestellt werden. Genauere Details können in [Kappel 2001c]<br />

nachgelesen werden.<br />

Das Konzept <strong>einer</strong> XML-API wird in Abbildung 38 ersichtlich.<br />

5<br />

Ein HTML-Browser ist ein Werkzeug <strong>zur</strong> Darstellung von Dateien, die im HTML-Format<br />

abgespeichert wurden.


PSE-V-Implementierungsbeschreibung 69<br />

Anwender<br />

benutzt<br />

Anwendung<br />

API<br />

interagiert<br />

mit<br />

Parser<br />

liest<br />

XML-Dokument<br />

DTD/XML-Schema<br />

Abbildung 38: Konzept <strong>einer</strong> XML-API [Kappel 2001c, 4]<br />

Die Anwendung kommuniziert mit dem Parser mittels vordefinierter Schnittstelle<br />

(API), wobei der Parser genau diese API implementieren muss. Der Parser liest vom<br />

XML-Dokument die Daten ein, prüft diese (falls vorhanden) anhand <strong>einer</strong> DTD oder<br />

einem XML-Schema und sendet sie an die Anwendung, die sie ihrerseits verarbeitet.<br />

Durch dieses Konzept ist es möglich Komponenten in einem Softwaresystem ohne<br />

größeren Aufwand auszutauschen.<br />

Die bekanntesten derzeit existierenden XML-APIs sind DOM, SAX und JAXP die im<br />

folgenden kurz erläutert werden.<br />

DOM<br />

DOM (Document Object Model) wurde vom W3C [W3C 2002d] entwickelt und definiert<br />

die logische Struktur eines XML-Dokumentes in Form eines Baumes. Es ermöglicht<br />

das Lesen, Verändern und Erstellen dieser Dokumente und legt keine spezielle<br />

Programmiersprache für die Verwendung fest. Folgende Vor- bzw. Nachteile ergeben<br />

sich bei Verwendung von DOM:<br />

+ W3C Standard, der von vielen Parsern implementiert ist.<br />

+ Einfache Bearbeitung von XML-Dokumenten.<br />

+ Bietet auch die Möglichkeit, XML-Dokumente zu manipulieren.<br />

−<br />

Hoher Speicherbedarf bei großen XML-Dokumenten.


PSE-V-Implementierungsbeschreibung 70<br />

−<br />

−<br />

Hohe Geschwindigkeitsverluste bei großen XML-Dokumenten.<br />

Nicht für Streaming 6 geeignet, da das Parsen erst möglich ist, wenn das Dokument<br />

vollständig geladen wurde.<br />

SAX<br />

SAX (Simple API for XML) wurde von Megginson Technologies [Megginson 2002]<br />

entwickelt und ermöglicht nur das Lesen von XML-Dokumenten. Es erstellt keine<br />

interne Repräsentation des Dokumentes, sondern arbeitet auf der Basis von Ereignissen,<br />

wobei jeder Knoten in einem XML-Dokument ein Ereignis auslöst, welches von<br />

der Anwendung abgefangen und verarbeitet wird. Die Schnittstellen wurden für Java<br />

spezifiziert, sind jedoch auch schon in mehreren anderen Programmiersprachen umgesetzt.<br />

Folgende Vor- bzw. Nachteile ergeben sich bei der Anwendung von SAX:<br />

+ Sehr gut für Streaming-Anwendungen geeignet, da SAX das XML-Dokument<br />

verarbeitet, bevor es vollständig übertragen wird.<br />

+ Daher auch bei großen XML-Dokumenten schnell und speicherplatzsparend.<br />

−<br />

Bietet keine Möglichkeit XML-Dokumente zu bearbeiten.<br />

JAXP<br />

JAXP (Java API for XML Processing) wurde von Sun [Sun 2002a] entwickelt und<br />

stellt eine Abstraktionsebene für SAX- und DOM-Parser dar. Der Entwickler spricht<br />

die Parser über die JAXP-Schnittstellen an, wobei dieser entweder DOM oder SAX<br />

verwendet. Somit ist es möglich, die Parser ohne Aufwand auszuwechseln. Die Verwendung<br />

von JAXP bringt folgende Vor- bzw. Nachteile mit sich:<br />

+ Entwickeln von Applikationen unabhängig von den verwendeten Parsern.<br />

+ Parserwechsel ohne Codeänderung der Anwendung.<br />

−<br />

−<br />

Nur in Java umgesetzt.<br />

Noch junge Technologie.<br />

6 Internettechnologie, die erlaubt Audio- oder Video-Dateien bereits während dem Herunterladen<br />

anzuhören bzw. anzusehen. Man spricht daher auch von Echtzeitübertragungen, da Daten ohne größere<br />

Zeitverschiebung wiedergegeben werden [Glossar 2002].


PSE-V-Implementierungsbeschreibung 71<br />

Grundsätzlich sollte die Wahl der geeigneten API nach Abwägung der Vor- und<br />

Nachteile erfolgen, wobei der Grundsatz gilt, bei zeitkritischen Anwendungen SAX<br />

und bei Anwendungen <strong>zur</strong> XML-Manipulation DOM zu verwenden.<br />

Einsatz bei PSE-V<br />

Für den Zugriff auf die XML-Dokumente wurde JDOM [JDOM 2002], eine Java-<br />

Implementierung von DOM verwendet. DOM eignet sich wegen der internen Baumstruktur<br />

besonders gut für PSE-V. Zumal die von PSE-D verwalteten XML-Beschreibungen<br />

nicht speicherintensiv sind, machen sich auch die Nachteile von DOM nicht<br />

bemerkbar.<br />

7.3.2 Zugriff auf globale Konfigurationsdatei<br />

Ein Zugriff auf XML-Dokumente ist mit JDOM im Schreib- und im Lesemodus möglich,<br />

wobei bei PSE-V nur lesend zugegriffen wird. Die folgenden Codebeispiele zeigen<br />

die Verwendung von JDOM beim Zugriff auf die globale Konfigurationsdatei<br />

"pattern_configuration.xml" und haben das Ziel den Wert für das Element value mit<br />

den Schlüssel "patternRoot" zu ermitteln. Dieser Wert ist laut Abbildung 9<br />

"e:\eclipse\patternFiles\".<br />

1 private static final String CONFIG_FILE =<br />

2 "pattern_configuration.xml"<br />

3 private static final String KEY = "key";<br />

4 private static final String VALUE = "value";<br />

5 private Hashtable allValues();<br />

Quellcode 7: Globale Deklarationen<br />

1 private static void fillHashtable() throws JDOMException {<br />

2 allValues = new Hashtable();<br />

3 DOMBuilder builder = new DOMBuilder();<br />

4 Document doc = builder.build(new File(CONFIG_FILE));<br />

5 Element root = doc.getRootElement(); // Wurzelelement<br />

6 List elementList = root.getChildren();<br />

7 for (int i=0; i


PSE-V-Implementierungsbeschreibung 72<br />

Quellcode 7 zeigt die globalen Deklaraktionen, die für den Zugriff nötig sind. In<br />

Quellcode 8 wird in der Methode fillHashtable()zuerst eine globale Variable<br />

allValues angelegt, in der alle Schlüssel mit ihren Werten verwaltet werden sollen.<br />

Dann wird ein Objekt der Klasse DOMBuilder angelegt, um die Konfigurationsdatei<br />

mit der Methode build() (Zeile 4) in ein Objekt vom Typ Document einzulesen. Das<br />

gesamte XML-Dokument wird nach Aufruf dieser Methode in der Variable doc repräsentiert.<br />

Mit root = doc.getRootElement() erhält man das Wurzelelement<br />

configFile aus Abbildung 9. Die Methode getChildren() gibt eine Liste vom Typ<br />

List aus dem Paket com.sun.java.collections <strong>zur</strong>ück, in der alle Subelemente (in<br />

diesem Fall configKey-Elemente) aufgelistet sind. Mit dem Durchlaufen der Liste<br />

(Zeilen 7-14) wird die Variable allValues initialisert, wobei die Methoden<br />

getChild() und getText() verwendet werden, um ein Element bzw. dessen Inhalt<br />

zu erhalten.<br />

Verwendet wird fillHashtable() von der Methode getValue(), deren Implementierung<br />

in Quellcode 9 dargestellt ist.<br />

1 public static String getValue(String key) {<br />

2 if (allValues == null) {<br />

3 try {<br />

4 fillHashtable(); // Initialisierung<br />

5 }catch (JDOMException e) {<br />

6 // Keine Initialisierung möglich<br />

7 allValues = null;<br />

8 throw new ConfigFileException(e.toString());<br />

9 }<br />

10 }<br />

11 Object o = allValues.get(key);<br />

12 if (o!=null) {<br />

13 return (String) o;<br />

14 } else {<br />

15 throw new ConfigFileException(" the element with the<br />

16 name " + key + " could not be found!");<br />

17 }<br />

18 }<br />

Quellcode 9: Methode getValue()<br />

getValue() versucht in Zeile 4 die Variable allValues mit der Methode<br />

fillHashtable() zu initialisieren. Falls dies aufgrund eines Fehlers im XML-Dokument<br />

nicht gelingt, so wird eine Instanz von ConfigFileException mit der Beschreibung<br />

des Fehlers geworfen. Bei <strong>einer</strong> erfolgreichen Initialisierung wird versucht, das<br />

Objekt für den Schlüsselwert in der Variable key aus der Hashtable allValues zu<br />

entnehmen (Zeile 11). Ist dieser nicht in der Konfigurationsdatei enthalten, so wird<br />

wiederum mit <strong>einer</strong> Instanz der Klasse ConfigFileException eine entsprechende


PSE-V-Implementierungsbeschreibung 73<br />

Fehlermeldung in der Ausnahmenbehandlung <strong>zur</strong>ückgeliefert. Ansonsten wird das<br />

Objekt in eine Zeichenkette umgewandelt und <strong>zur</strong>ückgegeben.<br />

Diese beiden Methoden sind in der statischen Klasse ConfigFile implementiert. Ein<br />

Aufruf, um den Wert für den Schlüssel "patternRoot" zu erhalten lautet somit<br />

ConfigFile.getValue("patternRoot"). JDOM ermöglicht weiters den Zugriff auf<br />

Attribute von Elementen, das Erzeugen neuer Elemente usw. Die vollständige Dokumentation<br />

der Einsatzmöglichkeiten von JDOM kann auf [JDOM 2002] nachgelesen<br />

werden.<br />

7.3.3 Zugriff auf Plugin-Eigeschaften<br />

Eine ASCII-Datei "plugin.properties", die auf derselben Ebene wie "plugin.xml" liegen<br />

muss, ermöglicht eine dynamische Konfiguration von Plugins ohne Änderung des<br />

Quellcodes. Der Aufbau der Datei hat in der Art "Schlüssel = Wert" zu erfolgen. Das<br />

"plugin.properties" von PSE-V hat bspw. unter anderem folgende Einträge:<br />

browser.Back.text = Backward<br />

browser.Back.tooltip = Surf to previously Viewed Web site<br />

browser.Forward.text = Forward<br />

browser.Forward.tooltip = Surf to next Viewed Web site<br />

Den Zugriff auf die Werte ermöglichen zwei Methoden der Klasse<br />

pattern.base.BasePlugin, deren Implementierung in Quellcode 10 dargestellt ist.<br />

1 private BasePlugin plugin;<br />

2 private ResourceBundle resourceBundle;<br />

3 public BasePlugin(IPluginDescriptor descriptor) {<br />

4 super(descriptor);<br />

5 plugin = this;<br />

6 // Initialisierung<br />

7 resourceBundle = descriptor.getResourceBundle();<br />

8 }<br />

9 public static String getResourceString(String key) {<br />

10 try {<br />

11 return resourceBundle.getString(key);<br />

12 } catch (MissingResourceException e) {<br />

13 return key;<br />

14 } catch (NullPointerException e) {<br />

15 return "!_" + key + "_!";<br />

16 }<br />

17 }<br />

Quellcode 10: Zugriff auf plugin.properties<br />

Der Konstruktur von BasePlugin initialisiert die Variable resourceBundle mit der<br />

ein Zugriff auf "plugin.properties" ermöglicht wird (Zeile 4). Diese hat eine Methode


PSE-V-Implementierungsbeschreibung 74<br />

getString(), die den angeforderten Wert für einen definierten Schlüssel <strong>zur</strong>ückliefert.<br />

Ein Aufruf mit dem Wert "browser.Back.text" liefert daher "Backward". Ein Aufruf<br />

von "browser.Back.tex" liefert "!_browser.Back.tex_!", da kein Wert für diesen<br />

Schlüssel gefunden werden kann (Ausnahmebehandlung der Zeilen 14 -17). Ist bei der<br />

Initialisierung der Variable resourceBundle ein Fehler passiert (z. B: keine Datei<br />

"plugin.properties" vorhanden), so wird in der Ausnahmebehandlung der Zeilen 12<br />

und 13 der angeforderte Schlüssel <strong>zur</strong>ückgeliefert.<br />

Alle grafischen Benutzerschnittstellen von "Pattern Browser" erhalten ihre Bezeichnung<br />

durch die Werte in "plugin.properties". Somit ist es bspw. möglich, ohne Änderung<br />

von Quellcode die Sprache von Englisch auf Deutsch umzustellen.<br />

7.4 Zusammenfassung<br />

Dieses Kapitel befasste sich mit der Implementierung des Werkzeuges PSE-V, dessen<br />

Architektur sich aus vier Java-Paketen und der Klasse BasePlugin zusammensetzt.<br />

Jedes dieser Pakete ist für bestimmte Aufgaben zuständig, die durch die Beschreibung<br />

der darin enthaltenen Klassen erläutert wurde. Bei den Implementierungsdetails wurde<br />

der Zugriff auf XML und die Eigenschaften von Plugins anhand konkreten Codebeispielen<br />

aufgezeigt.


Vergleichbare Werkzeuge 75<br />

8 Vergleichbare Werkzeuge<br />

In diesem Kapitel werden zwei mit PSE-Base vergleichbare Werkzeuge vorgestellt:<br />

PBE (Pattern By Example) und FRED (FRamework Editor for Java). Da sich diese<br />

Arbeit mit der <strong>Definition</strong>, Verwaltung und Visualisierung von Entwurfsmustern beschäftigt,<br />

werden auch nur die für diese Punkte relevanten Teilbereiche der Werkzeuge<br />

mit Hilfe des Beispielmusters Abstract Factory aus Abschnitt 4.1 erläutert. Teilweise<br />

sind für das Verständnis der <strong>Definition</strong> jedoch auch Querverbindungen <strong>zur</strong> Anwendung<br />

der definierten Muster notwendig.<br />

Die Auswahl von PBE und FRED begründet sich anhand folgender Punkte:<br />

‣ Verfügbarkeit: Jedes dieser Werkzeuge war zumindest als Demoversion<br />

verfügbar, womit die Funktionalitäten direkt erprobt werden konnten.<br />

‣ Ausreichende Dokumentation: Für jedes Werkzeug war eine umfassende<br />

Dokumentation vorhanden.<br />

‣ Verschiedene Ansätze: FRED orientiert sich genauso wie PSE-D an den<br />

Rollen von Entwurfsmustern. PBE ignoriert Rollen und definiert die Muster<br />

indem es einem bestehendem Quellcode gewisse Eigenschaften zuweist.<br />

Durch den Vergleich der Werkzeuge werden die Vor- und Nachteile dieser<br />

verschiedenen Ansätze ersichtlich.<br />

[Paulisch 1996, 99] erläutert kurz einige weitere Werkzeuge <strong>zur</strong> Unterstützung der<br />

Softwareentwicklung mit Entwurfsmuster, von denen jedoch keines für den Vergleich<br />

herangezogen wurde, da bei keinem eine ausreichende Dokumentation und eine voll<br />

funktionsfähige Demoversion vorhanden war.<br />

8.1 PBE<br />

PBE wurde von der Delta Software Technologie Group [Delta 2002a] <strong>zur</strong> Unterstützung<br />

der Programmierung mit Entwurfsmustern entwickelt. Das Ziel von PBE ist die<br />

flexible <strong>Definition</strong> und Verwaltung von Entwurfsmustern die durch Parametrisierung<br />

angewandt werden können, um somit den gewünschten Quellcode zu erzeugen. Die<br />

folgenden Abschnitte konzentrieren sich auf die Beschreibung der <strong>Definition</strong> und<br />

Verwaltung der Entwurfsmuster und deren Dokumentation anhand PBE, wobei als


Vergleichbare Werkzeuge 76<br />

Basis das Benutzerhandbuch [Delta 2002b] und eigene Erkenntnisse durch Evaluierung<br />

des Werkzeuges dienen.<br />

8.1.1 Aufbau der Musterdefinition<br />

Bei der <strong>Definition</strong> von Entwurfsmustern werden auf Basis eines Codefragments einzelne<br />

Codeteile als variabel definiert, die dann bei der Anwendung die ihnen zugewiesenen<br />

Werte erhalten. PBE orientiert sich somit nicht an den Rollen von Mustern,<br />

sondern definiert deren Eigenschaften direkt im Quellcode. Diese so festgelegten<br />

Muster können in verschiedenen Programmiersprachen abgelegt werden. Abbildung<br />

39 zeigt die grundsätzliche Vorgehensweise bei der <strong>Definition</strong>.<br />

Parameter<br />

Ausdrücke<br />

variable Codeteile<br />

Initiales<br />

Codefragment<br />

Ein Codefragment stellt den Ausgangspunkt für die <strong>Definition</strong> eines Musters dar. Der<br />

Code kann mit Hilfe des Werkzeuges aus <strong>einer</strong> Quellcode-Datei (z. B. ".java", ".cpp")<br />

importiert, aber auch manuell geschrieben werden. Quellcode 11 zeigt ein vereinfach-<br />

Codemuster-<br />

Datei<br />

Einfügemarken<br />

Codeblöcke<br />

Bedingungen<br />

Abbildung 39: PBE-<strong>Definition</strong> von Entwurfsmustern [Delta 2002b, 6]<br />

Ausgangspunkt <strong>einer</strong> jeden Musterdefinition ist ein initiales Codefragment, das mit<br />

verschiedenen Komponenten (Parameter, variable Codeteile, Einfügemarken usw.)<br />

konfiguriert wird, um schließlich die fertige Codemuster-Datei abzubilden. In den<br />

nachfolgenden Abschnitten wird jeder Teil der Musterdefinition genauer erläutert.<br />

8.1.2 Initiales Codefragment


Vergleichbare Werkzeuge 77<br />

tes initiales Codefragment wie es <strong>zur</strong> <strong>Definition</strong> des Musters Abstract Factory verwendet<br />

werden kann.<br />

1 public interface AbstractFactory {<br />

2 public AbstractProduct createAbstractProduct();<br />

3 }<br />

4 public class ConcreteFactory implements AbstractFactory {<br />

5 public AbstractProduct createAbstractProduct(){<br />

6 return new Product();<br />

7 }<br />

8 }<br />

9 public class AbstractProduct {}<br />

10 public class Product implements AbstractProduct {}<br />

11 public class Client {}<br />

Quellcode 11: Initiales Codefragment für Abstract Factory<br />

Die Deklarationen in Quellcode 11 bilden die Struktur des Musters Abstract Factory<br />

aus Abbildung 10 nach. Ein Vergleich mit Abbildung 21 und Abbildung 22 zeigt, dass<br />

auch PSE-D in den einzelnen Rollen, abgesehen von den Identifizierungszeichen "$",<br />

diesen Code verwendet. Bei PSE-D ist er jedoch in den Codekopf und Codekörper der<br />

Rolle aufgeteilt.<br />

8.1.3 Variable Codeteile<br />

Bei der <strong>Definition</strong> des Musters müssen im Codefragment alle variablen Teile gekennzeichnet<br />

werden, die bei der Anwendung neue Werte erhalten sollen. In Quellcode 11<br />

werden folgende Codeteile als variabel definiert:<br />

‣ AbstractFactory (Zeilen 1 und 4)<br />

‣ ConcreteFactory (Zeile 4)<br />

‣ AbstractProduct (Zeilen 5, 9 und 10)<br />

‣ Product (Zeile 10)<br />

‣ Client (Zeile 11)<br />

Wichtig ist, dass jedes Auftreten der Codeteile als variabel definiert wird. Quellcode<br />

12 zeigt das Ergebnis der <strong>Definition</strong>.


Vergleichbare Werkzeuge 78<br />

1 public interface AbstractFactory {<br />

2 public AbstractProduct createAbstractProduct();<br />

3 }<br />

4 public class ConcreteFactory implements AbstractFactory {<br />

5 public AbstractProduct createAbstractProduct(){<br />

6 return new Product();<br />

7 }<br />

8 }<br />

9 public class AbstractProduct {}<br />

10 public class Product implements AbstractProduct {}<br />

11 public class Client {}<br />

Quellcode 12: <strong>Definition</strong> variabler Codeteile für Abstract Factory<br />

Nur durch ein konsequentes Definieren der variablen Codeteile kann sichergestellt<br />

werden, dass bei der Anwendung jeder variable Codeteil durch die neu vergebenen<br />

Werte ersetzt wird.<br />

8.1.4 Parameter<br />

Für die Zuweisung eines Wertes bei der Anwendung wird je variablem Codeteil ein<br />

Parameter benötigt. Dieser kann mit einem Standardwert belegt werden, der bei der<br />

Anwendung des Musters automatisch vergeben wird, aber auch überschrieben werden<br />

kann. Tabelle 11 illustiert die Vergabe von Parameternamen und Werten für die Codeteile,<br />

die bei der Anwendung des Musters zum Ergebniscode laut Quellcode 13 führen.<br />

Variabler Codeteil Parameter Parameterwert bei Anwendung<br />

AbstractFactory aFactory "WidgetFactory"<br />

ConcreteFactory cFactory "MacFactory"<br />

AbstractProduct aProduct "Window"<br />

Product cProduct "MacWindow"<br />

Client client "Client"<br />

Tabelle 11: Parameterwerte für Abstract Factory


Vergleichbare Werkzeuge 79<br />

1 public interface WidgetFactory {<br />

2 public Window createWindow();<br />

3 }<br />

4 public class MacFactory implements WidgetFactory{<br />

5 public Window createWindow(){<br />

6 return new MacWindow();<br />

7 }<br />

8 }<br />

9 public class Window {}<br />

10 public class MacWindow implements Window{}<br />

11 public class Client {}<br />

Quellcode 13: Ergebniscode nach Anwendung des Entwurfsmusters<br />

Alle variablen Codeteile werden durch die Werte in den Parametern bei der Anwendung<br />

ersetzt. Dieser Quellcode kann nun kopiert und <strong>zur</strong> Entwicklung weiterverwendet<br />

werden.<br />

8.1.5 Ausdrücke<br />

Eine Besonderheit bei der <strong>Definition</strong> der Muster stellen Ausdrücke dar. Mit ihnen ist<br />

es möglich, komplexere Bedingungen bei der Musterdefinition zu formulieren. Für<br />

diesen Zweck können eine Reihe gängiger Operatoren und Methoden bei der Erstellung<br />

verwendet werden, die im folgenden mit einigen Beispielen illustriert werden.<br />

Verwendung eines Präfixes mit dem Operator "&"<br />

Die <strong>Definition</strong> des Ausdrucks "Simple" & aFactory beim variablen Codeteil<br />

AbstractFactory generiert bei der Anwendung des Musters mit dem Wert<br />

"WidgetFactory" für den Parameter aFactory ein Ergebnis laut Quellcode 14.<br />

1 public interface SimpleWidgetFactory {<br />

2 public Window createWindow();<br />

3 }<br />

Quellcode 14: Ergebniscode bei Verwendung eines Verknüpfungsoperators<br />

Das Ergebnis ist somit eine Verknüpfung von "Simple" und des Wertes, den der Parameter<br />

aFactory enthält. Der Verknüpfungsoperator kann z. B. eingesetzt werden,<br />

wenn ein Teil eines variablen Codeteils bekannt ist (wird fix beim Ausdruck hinterlegt),<br />

der Rest jedoch erst bei der Anwendung eingesetzt wird.


Vergleichbare Werkzeuge 80<br />

Entfernen von Leerzeichen<br />

Eine <strong>Definition</strong> eines Ausdrucks Trim(aFactory) bei AbstractFactory generiert<br />

bei der Anwendung mit dem Wert " Widget Factory " für den Parameter aFactory ein<br />

Ergebnis laut Quellcode 15.<br />

1 public interface WidgetFactory {<br />

2 public Window createWindow();<br />

3 }<br />

Quellcode 15: Ergebniscode bei Entfernen der Leerzeichen<br />

Die Funktion Trim(str) schneidet aus der Zeichenkette str sämtliche Leerzeichen<br />

heraus. In diesem Fall wird der Wert " Widget Factory " in "WidgetFactory" umgewandelt.<br />

Diese Funktion kann bspw. <strong>zur</strong> vorbeugenden Fehlervermeidung verwendet<br />

werden, da unbeabsichtigte Leerzeichen bei der Anwendung des Musters kein<br />

Problem mehr darstellen.<br />

Die Operatoren und einige Beispielmethoden von PBE sind in Tabelle 12 und<br />

Tabelle 13 aufgelistet.<br />

Operator<br />

Beschreibung<br />

? : Ternärer If-Operator<br />

OR, AND, NOT<br />

Logische Operatoren<br />

=, , , = Relationale Operatoren<br />

+, -, &, *, &, /, MOD Arithmetische Operatoren<br />

Tabelle 12: Operatoren von PBE [Delta 2002b, 13]<br />

Methode<br />

LCase(str)<br />

Len(str)<br />

Trim(str)<br />

Beschreibung<br />

Wandelt das Argument str in Kleinbuchstaben<br />

um.<br />

Liefert die Länge des Argumentes str.<br />

Liefert das Argument str ohne Leerzeichen<br />

<strong>zur</strong>ück.<br />

Tabelle 13: Beispielmethoden von PBE [Delta 2002b, 14]<br />

Eine genaue Auflistung aller <strong>zur</strong> Verfügung stehenden Methoden kann in [Delta<br />

2002b] nachgelesen werden.


Vergleichbare Werkzeuge 81<br />

8.1.6 Codeblöcke und Bedingungen<br />

Codeblöcke bieten die Gelegenheit, größere Codeteile an gewisse Bedingungen zu<br />

knüpfen. Im Quellcode 11 kann man den Teil public class Client(){} (Zeile 11)<br />

als Codeblock definieren und von einem Parameter createClient abhängig machen.<br />

Dieser Parameter dient damit als Bedingung und regelt, dass bspw. bei einem Wert<br />

"ja" des Parameters der Codeblock bei der Anwendung des Musters eingeblendet,<br />

ansonsten ausgeblendet wird. Bei den Codeblöcken wird zwischen optionalen und<br />

wiederholbaren unterschieden. Optionale Codeblöcke regeln über Parametersteuerung<br />

das Ein- bzw. Ausblenden von Code. Bei wiederholbaren kann zusätzlich noch bei der<br />

Anwendung definiert werden, wie oft der Codeblock im Ergebniscode erscheinen soll.<br />

Beim Muster Abstract Factory kann ein wiederholbarer Codeblock verwendet werden,<br />

um in einem Schritt für den variablen Codeteil AbstractProduct (siehe Quellcode<br />

11, Zeile 9) mehrere Ausprägungen bei der Anwendung zu erhalten. Daher wurde der<br />

Teil public class AbstractProduct{} als wiederholbarer Codeblock definiert.<br />

Das Besondere bei den wiederholbaren Codeblöcken ist, dass bei der Anwendung für<br />

jeden Parameter innerhalb des Codeblocks mehrere Instanzen definiert werden können.<br />

Bei Anwendung des Musters mit den beiden Instanzen "Window" und<br />

"ScrollBar" für den Parameter aProduct (gebunden an den variablen Codeteil<br />

AbstractProduct) ergibt sich folgender Ergebniscode:<br />

public class Window{}<br />

public class ScrollBar{}<br />

Quellcode 16: Ergebniscode bei wiederholbarem Codeblock<br />

Für jeden variablen Codeteil wird bei der Anwendung der jeweilige Instanzwert eingetragen<br />

und damit in diesem Fall zwei Codesequenzen erzeugt. Durch geschicktes<br />

Definieren der Codeblöcke können somit mit <strong>einer</strong> relativ schlanken Musterdefinition<br />

variable Quellcodeausprägungen realisiert werden.<br />

8.1.7 Einfügemarken<br />

Durch das Setzen von Einfügemarken werden Stellen im Code definiert, an denen der<br />

Benutzer eigene Methoden implementieren soll. Diese Stellen sind jedoch nur eine<br />

Richtlinie, zumal es ohne weiteres möglich ist, den gesamten Quellcode unabhängig<br />

der Beachtung der Einfügemarken zu bearbeiten.


Vergleichbare Werkzeuge 82<br />

8.1.8 Verwaltung und Dokumentation<br />

Das mit den verschiedenen Elementen festgelegte Entwurfsmuster kann als Codemuster-Datei<br />

mit der Endung ".pdef" abgespeichert und jederzeit aufgerufen und verändert<br />

werden. Als Dokumentation können je Muster kurze Beschreibungen im<br />

ASCII-Format gemäß der Struktur aus [Gamma 1995, 6-7] integriert werden.<br />

8.2 FRED<br />

FRED (FRamework Editor for Java) wurde in der ersten Version 1997 an der Universität<br />

Tampere <strong>zur</strong> Generierung und Nutzung von Java-Frameworks entworfen [Hakala<br />

1997] und ist derzeit in der Version 1.3 erhältlich [Tampere 2002]. Die Entwickler<br />

erkannten, dass die Anwendung von Entwurfsmustern den Aufbau von Frameworks<br />

flexibler gestalten lässt und integrierten daher das Werkzeug Pattern Editor <strong>zur</strong> <strong>Definition</strong><br />

und Verwendung von Mustern. Mit diesen sogenannten FRED-Mustern können<br />

dann Frameworks modelliert werden. FRED bietet weiters die Unterstützung, von<br />

Frameworks Anwendungen abzuleiten, wobei durch die FRED-Muster schon Beispielcode,<br />

Einschränkungen, Schablonen usw. für die Anwendung definiert werden<br />

können. Die folgenden Abschnitte konzentrieren sich auf die Beschreibung der <strong>Definition</strong><br />

und Verwaltung der FRED-Muster, wobei als Basis die Arbeit von [Viljamaa<br />

2002] und eigene Erkenntnisse durch Evaluierung des Werkzeuges dienen.<br />

8.2.1 Rollen<br />

FRED-Muster bestehen aus verschiedenen Rollen. Eine Rolle spezifiziert, wie bei der<br />

Anwendung des Musters Quellcode generiert wird. Eine angewandte Rolle wird im<br />

folgenden als "Instanz" bezeichnet. Die wichtigsten Rollenarten von FRED-Mustern<br />

sind in Tabelle 14 ersichtlich.<br />

Typ<br />

ClassClause<br />

MethodClause<br />

ExceptionClause<br />

FieldClause<br />

Code snippet<br />

Beschreibung<br />

Klassen und Schnittstellen<br />

Methoden<br />

Exceptions, die von <strong>einer</strong> Methode oder einem Konstruktor geworfen<br />

werden<br />

Felder (Variablen)<br />

Codekörper<br />

Tabelle 14: Beispiele f. Rollentypen von FRED-Mustern [Viljaama 2001, 53]


Vergleichbare Werkzeuge 83<br />

Jede Rolle hat eine Kardinalität, die bestimmt, wie oft sie bei der Anwendung instanziert<br />

werden kann. Tabelle 15 zeigt die für FRED-Muster zulässigen Kardinalitäten.<br />

Kardinalität<br />

Beschreibung<br />

0..1 0 oder 1<br />

1 Exakt 1<br />

0..* 0 oder mehr<br />

1..* 1 oder mehr<br />

Tabelle 15: Kardinalitäten von FRED-Mustern [Viljaama 2002, 54]<br />

Die Kardinalitäten sind von zwei Faktoren abhängig, die mit der Beispieldefinition<br />

eines Musters in Quellcode 17 ersichtlich werden. Die genaue Notation wird in später<br />

in einem Beispiel noch näher erläutert.<br />

1 class role AbstractFactory 1{<br />

2 method role createAbstractProduct {}<br />

3 }<br />

4 class role ConcreteFactory 1..* [x: AbstractFactory] {<br />

5 inheritance x<br />

6 taskTitle: "Subclass ";<br />

7 }<br />

Subrolle<br />

Quellcode 17: Beispieldefinition für FRED-Muster [Viljaama 2001, 54]<br />

Ist eine Rolle Teil <strong>einer</strong> anderen (Subrolle), so ist ihre Kardinalität relativ zu der übergeordneten<br />

zu sehen. Bei <strong>einer</strong> Anwendung des Musters tritt z. B. die Methodenrolle<br />

createAbstractProduct (Zeile 2) mit der Kardinalität 1 (keine Angabe bedeutet die<br />

Kardinalität "1") genauso oft wie die Klassenrolle AbstractFactory auf. Hat die<br />

Methodenrolle jedoch eine Kardinalität von "1..*", so können je Instanz von<br />

AbstractFactory ein oder mehrere Instanzen von createAbstractProduct existieren.<br />

Abhängigkeiten<br />

Die Kardinalität von abhängigen Rollen verhält sich ähnlich wie bei den Subrollen.<br />

Laut Quellcode 17 hängt die Klassenrolle ConcreteFactory (Kardinalität "1..*") von<br />

der Klassenrolle AbstractFactory mit <strong>einer</strong> Abhängigkeit "x" ab (Zeile 4). Bei <strong>einer</strong><br />

Anwendung des Musters können somit je Instanz von AbstractFactory eine oder<br />

mehrere Instanzen von ConcreteFactory angelegt werden.


Vergleichbare Werkzeuge 84<br />

8.2.2 Einschränkungen<br />

Neben Abhängigkeiten kann man für Rollen auch Einschränkungen (Constraints) definieren.<br />

Sie werden für die Sicherstellung der Codegültigkeit bei der Anwendung<br />

eines Musters verwendet. Tabelle 16 zeigt vordefinierte Einschränkungen, die für eine<br />

<strong>Definition</strong> von FRED-Mustern verwendet werden können.<br />

Constraint Beschreibung Anzuwenden für Rollentyp<br />

inheritance Erzwungene Vererbung Klassenrollen<br />

overriding<br />

returnType<br />

Erzwungenes Überschreiben<br />

von Methoden<br />

Erzwungener Rückgabetyp bei<br />

Methoden<br />

Methodenrollen<br />

Methodenrollen<br />

type Erzwungener Typ Parameter-, Exception- und Feldrollen<br />

Tabelle 16: Einschränkungen für Rollen [Viljaama 2002, 55]<br />

Ein Beispiel für eine Einschränkung ist das Schlüsselwort inheritance in Quellcode<br />

17, Zeile 5. Es bedeutet, dass bei Anwendung des Musters eine Instanz der Rolle<br />

ConcreteFactory von <strong>einer</strong> Instanz der Rolle AbstractFactory erben bzw. diese<br />

implementieren muss. Bei <strong>einer</strong> Verletzung der Einschränkung wird der Benutzer auf<br />

den Fehler hingewiesen und muss diesen korrigieren.<br />

8.2.3 Schablonen<br />

Mit Schablonen (Templates) ist es möglich, Standardwerte für Rollen zu definieren<br />

oder eine Hilfestellung für dessen Anwendung bereitzustellen. Einige vordefinierte<br />

Schablonen von FRED sind in Tabelle 17 ersichtlich. Beginnt eine Schablone mit<br />

default, so wird sie <strong>zur</strong> Codegenerierung eingesetzt. taskTitle und<br />

taskDescription werden bspw. für die Bereitstellung von Hilfetexten verwendet.<br />

Template Beschreibung Anzuwenden für Rollentyp<br />

defaultImplementation<br />

defaultKind<br />

Standardimplementierung für<br />

Methoden und Konstruktoren<br />

Standardwert für Klassenrollen<br />

("interface" oder "class")<br />

Methoden- und Konstrukturrollen<br />

Klassenrollen<br />

defaultName Standardname für Rollen Alle Rollentypen<br />

taskDescription Beschreibung für Benutzer Alle Rollentypen<br />

taskTitle Titel der Rolle Alle Rollentypen<br />

Tabelle 17: Beispielschablonen von FRED [Viljaama 2001, 56]


Vergleichbare Werkzeuge 85<br />

Ein Beispiel für eine Schablone ist die <strong>Definition</strong> taskTitle: "Subclass<br />

" in Quellcode 17, Zeile 6. Es verweist mit dem Ausdruck in der Spitzklammer<br />

auf die Abhängigkeit "x", die festlegt, dass ConcreteFactory von<br />

AbstractFactory erben bzw. diese implementieren muss. Der Ausdruck ".name"<br />

nach "x" ist eine Hilfsfunktion, die den Namen <strong>einer</strong> Rolleninstanz <strong>zur</strong>ückliefert. Vergibt<br />

man nun bei der Anwendung des Musters für die Rolle AbstractFactory den<br />

Wert "WidgetFactory", so erscheint als Hilfetext bei der Instanzierung von<br />

ConcreteFactory der Ausdruck "Subclass WidgetFactory". Somit ist sofort ersichtlich,<br />

dass eine Subklasse von "WidgetFactory" generiert werden muss. Mit dieser<br />

Methodik kann Benutzern bei der Anwendung von Mustern eine wertvolle Hilfestellung<br />

gegeben werden. Tabelle 18 zeigt einige Hilfsfunktionen und deren Funktionalität.<br />

Funktion<br />

class<br />

name<br />

parent<br />

self<br />

Beschreibung<br />

Gibt den Klassennamen der Rolleninstanz <strong>zur</strong>ück<br />

Gibt den Namen der Rolleninstanz <strong>zur</strong>ück<br />

Gibt den Namen der (falls vorhanden) umschließenden Rolle <strong>zur</strong>ück<br />

Verweist auf die eigenen Rolleninstanz<br />

Tabelle 18: Beispielfunktionen von FRED [Viljaama 2001, 56]<br />

8.2.4 Beispieldefinition Abstract Factory<br />

Die <strong>Definition</strong> eines Entwurfsmusters erfolgt mit dem integrierten FRED-Werkzeug<br />

Pattern Editor. Eine Beschreibung von Pattern Editor ist nicht Teil dieser Arbeit,<br />

kann jedoch in [Viljamaa 2001] nachgelesen werden. Quellcode 18 zeigt die Notation<br />

der <strong>Definition</strong> von Abstract Factory.


Vergleichbare Werkzeuge 86<br />

1 pattern AbstractFactory;<br />

2 class role AbstractFactory{<br />

3 description: "Declares an interface for operations that<br />

4 create abstract product objects.";<br />

5 defaultKind: "interface";<br />

6 method role createAbstractProduct [p: AbstractProduct] {<br />

7 returnType: p;<br />

8 defaultName: "create"";<br />

9 description: "Method for creating .";<br />

10 }<br />

11 }<br />

12 class role AbstractProduct{<br />

13 description: "Declares an interface for a type of product<br />

14 object";<br />

15 defaultKind: "interface";<br />

16 }<br />

17 class role ConcreteFactory 1..* [f: AbstractFactory] {<br />

18 defaultName: "Concrete";<br />

19 inheritance: f;<br />

20 description: "Implements the operations to create concrete<br />

21 product<br />

22 objects. Implements the interface.";<br />

23 method role createAbstractProduct<br />

24 [cp: f.createAbstractProduct] {<br />

25 defaultName: "";<br />

26 overriding: cp;<br />

27 }<br />

28 }<br />

29 class role Product 1..* [p: AbstractProduct] {<br />

30 defaultName: "Concrete";<br />

31 inheritance: p;<br />

32 description: "Defines a product object to be created by the<br />

33 corresponding concrete factory. Implements the <br />

34 interface.";<br />

35 }<br />

Quellcode 18: FRED-<strong>Definition</strong> von Abstract Factory<br />

Die Klassenrolle AbstractFactory (Zeilen 2-11) hat die Kardinalität "1", somit muss<br />

von ihr genau eine Instanz erzeugt werden. Die Schablone defaultKind gibt den<br />

Standardtyp von AbstractFactory an - in diesem Fall "interface". Mit defaultName<br />

wird bei Anwendung des Musters ein Standardwert vergeben. Der Ausdruck ""<br />

gibt den aktuellen Namen von "p" <strong>zur</strong>ück. Der Standardwert bei Vergabe des Namens<br />

"Window" für die Rolle AbstractProduct ist daher "createWindow". Auch die<br />

Schablone description erhält dynamisch den Hilfetext. Die Methodenrolle<br />

createAbstractProduct (Zeilen 6-10) bildet die Schnittstelle <strong>zur</strong> Objekterzeugung.<br />

Sie hat eine Abhängigkeit "p" von der Klassenrolle AbstractProduct. Aufgrund dieser<br />

Abhängigkeit muss für jede Instanz der Rolle AbstractProduct eine Instanz von<br />

createAbstractProduct existieren.


Vergleichbare Werkzeuge 87<br />

Die Klassenrolle AbstractProduct (Zeilen 12-16) definiert die Schnittstellen für die<br />

Instanzen der Rolle Product. Sie wird von AbstractFactory und Product in den<br />

Zeilen 6 und 29 über Abhängigkeiten referenziert.<br />

Die Klassenrolle ConcreteFactory (Zeilen 17-28) repräsentiert die implementierenden<br />

Klassen von AbstractFactory. Sie ist durch den Ausdruck [f:<br />

AbstractFactory] in Zeile 17 von AbstractFactory abhängig und enthält weiters<br />

eine Schablone für den Standardnamen und für die Beschreibung. Mit inheritance:<br />

f; aus Zeile 19 wird das Ableiten von der Klassenrolle AbstractFactory erzwungen.<br />

Eine Methodenrolle createAbstractProduct (Zeilen 23-27) wurde als Subrolle für<br />

ConcreteFactory <strong>zur</strong> Spezifikation der Objekterzeugung eingeführt. Sie besitzt in<br />

Zeile 24 die Abhängigkeit "cp" von der Methodenrolle createAbstractProduct<br />

("f" ist die Abhängigkeit von AbstractFactory). Die Einschränkung overriding<br />

bestimmt, dass sie die Instanz der Methodenrolle createAbstractProduct aus<br />

AbstractFactory überschreiben muss. Weiters wurde eine Schablone für einen Standardnamen<br />

eingeführt, die den Wert der Instanz createAbstractProduct von<br />

AbstractFactory liefert.<br />

Die Klassenrolle Product (Zeilen 29-35) definiert die Subklassen von<br />

AbstractProduct. Daher hat sie eine Abhängigkeit "p" (Zeile 29), die auf<br />

AbstractProduct verweist. Durch die Kardinalität "1..*" können ein oder mehrere<br />

Instanzen von Product je Instanz von AbstractProduct erzeugt werden. Durch den<br />

Wert inheritance "p" aus Zeile 31 muss Product von AbstractProduct erben.<br />

Weiters existiert eine Schablone description <strong>zur</strong> Generierung des Hilfetextes. Der<br />

Ausdruck "" gibt dabei den Klassennamen der Rolleninstanz von<br />

AbstractProduct <strong>zur</strong>ück.<br />

Mit dieser Methodik ist es möglich, verschiedenste Musterstrukturen und deren Verhalten<br />

zu modellieren. Für Abstract Factory kann man bspw. noch mit Rollen vom<br />

Typ "code snippet" die einzelnen Methodenkörper genau ausformulieren. Für eine<br />

genauere <strong>Definition</strong> der Möglichkeiten bzw. der Bedienung des Werkzeuges sei auf<br />

die Quellen [Tampere 2002] und [Viljamaa 2001] verwiesen.<br />

8.2.5 Verwaltung und Dokumentation<br />

FRED-Muster können als Datei mit der Endung ".pat" abgespeichert und jederzeit<br />

wieder aufgerufen und neu konfiguriert werden. Zur Dokumentation benutzt FRED<br />

das HTML-Format. Für jedes Muster können verschiedene HTML-Dateien definiert


Vergleichbare Werkzeuge 88<br />

werden, die zusammen die Gesamtdokumentation bilden. Weiters ist es auch möglich<br />

für Rollen eine HTML-Dokumentation in die Schablonen taskDescription und<br />

taskTitle zu integrieren. Visualisiert wird die Dokumentation mit einem integrierten<br />

HTML-Browser.<br />

8.3 Vergleich<br />

Nachfolgender Vergleich von PBE, FRED und PSE-Base soll die Unterschiede und<br />

Gemeinsamkeiten der Werkzeuge aufdecken und durch eine Gegenüberstellung die<br />

Stärken bzw. Schwächen ermitteln.<br />

8.3.1 Kriterien<br />

Die Kriterien für den Vergleich wurden anhand verschiedener in der Literatur gefundenen<br />

Anforderungen und eigenen Erfahrungen zusammengestellt. Sie gliedern sich in<br />

folgende Punkte:<br />

Kategorisierung<br />

Unter Kategorisierung versteht man die Möglichkeiten <strong>zur</strong> Einteilung von Entwurfsmustern<br />

in Kategorien. Diese gestalten das Arbeiten mit Mustern übersichtlicher. Die<br />

Ausprägungen für dieses Kriterium sind "gut integriert", "mittelmäßig integriert" und<br />

"nicht integriert".<br />

Flexibilität der <strong>Definition</strong><br />

Als Flexibilität werden die Möglichkeiten <strong>zur</strong> Musterdefinition verstanden. Eine hohe<br />

Flexibilität erlaubt die programmiersprachenunabhängige Verwaltung der in der Literatur<br />

vorhandenen und eigenen Muster [Meijers 1996, 58]. Weiters sind für eine hohe<br />

Flexibilität auch Funktionalitäten für Musterdefinitionen komplexerer Art notwendig.<br />

Diese umfassen bspw. Bedingungen, Schablonen, Hilfetexte und Einschränkungen.<br />

Die Ausprägungen reichen von "hoch" über "mittel" bis "niedrig".<br />

Flexibilität der Dokumentation<br />

Die Dokumentation ist ein wichtiger Bestandteil, um dem Benutzer die Möglichkeiten<br />

der Anwendung eines bestimmten Musters aufzuzeigen. Bei <strong>einer</strong> hohen Flexibilität<br />

werden verschiedene ASCII-Dokumentationsformate unterstützt und keine Struktur<br />

festgelegt. Eine niedrige beschränkt sich auf ein vorgegebenes Format und eine fixierte<br />

Struktur. Die Ausprägungen reichen daher von "hoch" über "mittel" bis "niedrig".


Vergleichbare Werkzeuge 89<br />

Suchfunktionalitäten<br />

Bei der Suche nach Entwurfsmustern sind laut [Greene 2002, 2] folgende Suchmodi<br />

relevant:<br />

‣ Suche nach Schlüsselwörtern: Durchsuchen nach gewissen Schlüsselwörtern,<br />

die vorher für das Muster definiert wurden.<br />

‣ Volltextsuche: Durchsuchen der gesamten Musterdefinition anhand eingegebener<br />

Suchbegriffe.<br />

‣ Erweiterte Suche: Durchsuchen bestimmter Teilbereiche eines Musters wie<br />

z. B. "Motivation" oder "Konsequenzen".<br />

Die Ausprägungen für dieses Kriterium sind "reichlich vorhanden", "mittelmäßig vorhanden"<br />

und "nicht vorhanden".<br />

Komplexität<br />

Die Komplexität gibt an, wie aufwendig die <strong>Definition</strong> eines Musters ist. Da die drei<br />

Werkzeuge große Unterschiede in den Ansätzen und der Werkzeugunterstützung aufweisen<br />

(bspw. definiert PBE die Entwurfsmuster durch Parametrisierung direkt im<br />

Quellcode und nicht wie PSE-Admin und FRED über Rollen), erfolgt die Bewertung<br />

durch eine subjektive Einschätzung, wobei die Ausprägungen von "hoch" über "mittel"<br />

bis "niedrig" reichen.<br />

Verwaltung<br />

Die Verwaltung zeigt, in welcher Weise die definierten Entwurfsmuster im System<br />

abgelegt werden. Eine fixe Einteilung der Ausprägungen ist dabei nicht möglich.<br />

Visualisierung<br />

Dieses Kriterium zeigt, wie gut die Visualisierung der Entwurfsmuster und deren<br />

Dokumentation aufbereitet wurde. Eine adäquate Aufbereitung verbessert die<br />

Navigation und gibt dem Benutzer einen besseren Überblick über die Muster [Yacoub<br />

1999, 3]. Die Ausprägungen sind "gut aufbereitet", "mittel aufbereitet" und "schlecht<br />

aufbereitet".


Vergleichbare Werkzeuge 90<br />

8.3.2 Ergebnisse<br />

Tabelle 19 illustriert die gesammelten Ergebnisse des Vergleichs. Da bei allen Kriterien<br />

bis auf "Verwaltung" drei verschiedene Ausprägungen möglich sind, wird <strong>zur</strong><br />

besseren Übersichtlichkeit folgende Skala <strong>zur</strong> Darstellung der Ergebnisse verwendet:<br />

‣ + für die beste Wertung.<br />

‣ +ο für eine Wertung zwischen + und ο.<br />

‣ ο für eine durchschnittliche Wertung.<br />

‣ ο- für eine Wertung zwischen ο und -.<br />

‣ - für eine schlechte Wertung.<br />

Vergleichskriterium PBE FRED PSE-Base<br />

Kategorisierung − − +<br />

Flexibilität d. <strong>Definition</strong> +ο + ο<br />

Flexibilität d. Dokumentation − +ο +<br />

Suchfunktionalitäten − − −<br />

Komplexität + ο +<br />

Verwaltung<br />

ASCII-Dateien<br />

(".pdef")<br />

ASCII-Dateien<br />

(".pat")<br />

ASCII-Dateien<br />

(".xml")<br />

Visualisierung − ο +<br />

Tabelle 19: Gesamtergebnis des Vergleichs<br />

Kategorisierung<br />

Bei PBE und FRED ist eine Kategorisierung der Entwurfsmuster nicht integriert. PSE-<br />

Base hingegen unterstützt den Aufbau von Kategoriehierachien auf maximal zwei<br />

Ebenen. Weiters ist die Zuordnung von einem Muster auf mehrere Kategorien möglich.<br />

Flexibilität der <strong>Definition</strong><br />

Alle drei Werkzeuge erlauben eine flexible und programmiersprachenunabhängige<br />

<strong>Definition</strong> von Entwurfsmustern. Entwickler können somit mit diesen Werkzeugen<br />

auch eigene Problemlösungsverfahren als Muster definieren. Für komplexere Musterdefinition<br />

sind hingegen nur FRED und PBE geeignet, da in PSE-Base keine Funktionalitäten<br />

für diesen Bereich integriert sind. FRED erlaubt dem Benutzer mit der Anwendung<br />

von Schablonen, Einschränkungen, Zusatzmethoden usw. Muster auf ver-


Vergleichbare Werkzeuge 91<br />

schiedenste Art und Weise zu definieren bzw. einzuschränken. Weiters wird auch die<br />

Generierung dynamischer Hilfetexte unterstützt. Daher sind mit FRED äußerst mächtige<br />

Musterdefinitionen möglich. PBE bietet mit dem Einsatz von optionalen und wiederholbaren<br />

Codeblöcken, sowie mit Ausdrücken einige Möglichkeiten für komplexere<br />

<strong>Definition</strong>en, erreicht jedoch nicht die Mächtigkeit von FRED.<br />

Flexibilität der Dokumentation<br />

Mit PBE ist nur eine Dokumentation gemäß der Struktur aus [Gamma 1995, 6-7]<br />

möglich. Das Format ist auf gewöhnlichen ASCII-Text beschränkt. Eine umfangreiche<br />

und übersichtliche Dokumentation mit Bildern und Formatierungen ist somit nicht<br />

möglich.<br />

FRED erlaubt den Aufbau <strong>einer</strong> Dokumentation im HTML-Format, wobei die Struktur<br />

nicht vorgegeben ist. Verschiedene, einem Muster zugeordnete HTML-Dateien,<br />

bilden die Gesamtdokumentation, die mit einem integrierten Browser dargestellt werden<br />

kann.<br />

PSE-Base schreibt weder eine Struktur noch ein ASCII-Format vor. Empfohlen wird<br />

jedoch das HTML-Format, zumal <strong>zur</strong> Laufzeit eine HTML-Gesamtdokumentation mit<br />

Inhaltsverzeichnis aus den einzelnen Dokumentationsteilen erstellt wird. Der Inhalt<br />

dieser Teile kann direkt in der allgemeinen Beschreibungsdatei ("manifest.xml") eines<br />

Musters oder in ASCII-Dateien (z. B. ".html", ".txt") liegen.<br />

Suchfunktionalitäten<br />

Keines der drei Werkzeuge bietet Funktionalitäten für die Suche nach Entwurfsmuster<br />

an.<br />

Komplexität<br />

Die subjektive Einschätzung der Komplexität erfolgte durch eine Beispieldefinition<br />

von Abstract Factory mit allen drei Werkzeugen. Dabei war eine <strong>Definition</strong> des<br />

Musters mit PBE und PSE-Base relativ schnell und komfortabel umzusetzen.<br />

FRED benötigt hingegen auch bei einfachen Mustern eine komplexere Struktur, um<br />

eine Basis für die vielen Funktionalitäten zu ermöglichen, auch wenn diese nicht verwendet<br />

werden. Aus diesem Grund gestaltete sich die <strong>Definition</strong> von Abstract Factory<br />

bei FRED aufwendiger.<br />

Verwaltung<br />

Alle drei Werkzeuge verwalten die Entwurfsmuster anhand ASCII-Dateien mit verschiedenen<br />

Endungen.


Vergleichbare Werkzeuge 92<br />

Visualisierung<br />

PBE erlaubt weder die Visualisierung der vorhandenen Entwurfsmuster noch eine<br />

geeignete Darstellung der Dokumentation. Die verwalteten Muster werden nur durch<br />

ein Durchsuchen des Dateisystems, in dem sie mit der Endung ".pdef" abgelegt sind,<br />

ersichtlich. Die Dokumentation ist gewöhnlicher ASCII-Text, der in Tabellenform<br />

dargestellt wird.<br />

Bei FRED erfolgt die Visualisierung der Muster genau wie in PBE anhand des Dateisystems.<br />

Für die Darstellung der Dokumentation kann ein integrierter HTML-Browser<br />

verwendet werden.<br />

PSE-Base visualisiert die verwalteten Entwurfsmuster und deren Kategorien in <strong>einer</strong><br />

Baumstruktur. Die Dokumentation wird durch eine Selektion eines Musters angesteuert<br />

und in einem eigenem HTML-Browser ("Pattern Browser" von PSE-V) dargestellt.<br />

8.4 Zusammenfassung<br />

In diesem Kapitel wurden zwei weitere Werkzeuge <strong>zur</strong> <strong>Definition</strong> und Verwaltung<br />

von Entwurfsmustern und deren Dokumentation vorgestellt. Diese beiden und PSE-<br />

Base wurden anhand verschiedener Kriterien miteinander verglichen.<br />

Bei allen drei wird ein hohes Augenmerk auf die <strong>Definition</strong> von Entwurfsmustern<br />

gelegt. Jeder der Ansätze erlaubt eine flexible und programmiersprachenunabhängige<br />

Verwaltung der Muster. Sehr mächtige Musterdefinition sind jedoch nur mit PBE, vor<br />

allem aber mit FRED durch viele Zusatzfunktionalitäten möglich. PSE-Base bietet in<br />

diesem Bereich keine Unterstützung an.<br />

Bei der Dokumentation erlaubt nur PSE-Base eine zufriedenstellende <strong>Definition</strong> der<br />

Dokumentationsteile. Auch die Integration der Kategorisierung bzw. der Aufbau der<br />

Visualisierung wurde nur von PSE-Base gut gelöst. Die beiden anderen Ansätze weisen<br />

in diesen Punkten einige Mängel auf. Keines der drei Werkzeuge bietet Funktionalitäten<br />

für die Suche innerhalb der verwalteten Entwurfsmuster an, was bei einem<br />

umfangreicheren Musterkatalog ein erheblicher Nachteil ist.<br />

Der Vergleich der Verwaltung und <strong>Definition</strong> der Entwurfsmuster und deren Dokumentation<br />

kann nicht die gesamten Vor- und Nachteile der jeweiligen Werkzeuge aufzeigen,<br />

da für diesen Zweck auch ein Vergleich der Anwendung von Enwurfsmustern<br />

notwendig ist. Mehr Aufschluss gibt daher eine Gegenüberstellung des Anwendungsbereiches<br />

der Werkzeuge wie er in [Mayr-Kern 2002] durchgeführt wurde.


Zusammenfassung und Ausblick 93<br />

9 Zusammenfassung und Ausblick<br />

Dieses Kapitel fasst die Erkenntnisse dieser Arbeit zusammen und gibt einen Ausblick<br />

auf die <strong>Erweiterung</strong>smöglichkeiten von PSE-Base.<br />

9.1 Zusammenfassung<br />

In dieser Arbeit wurde ein Werkzeug <strong>zur</strong> <strong>flexiblen</strong> <strong>Definition</strong>, Verwaltung und Visualisierung<br />

von Entwurfsmustern und deren Dokumentation vorgestellt. Dieses Werkzeug<br />

(PSE-Base) besteht aus den Teilen PSE-D (<strong>Definition</strong> und Verwaltung) und<br />

PSE-V (Visualisierung) und ist Teil eines Gesamtwerkzeuges <strong>zur</strong> Unterstützung der<br />

Softwareentwicklung mit Entwurfsmustern (PSE). Alle Komponenten von PSE wurden<br />

mit Java entwickelt und sind eine <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong><br />

Eclipse.<br />

Entwurfsmuster stellen Lösungsvorschläge für bestimmte grundlegende Entwurfsprobleme<br />

dar und sind beim Aufbau <strong>einer</strong> <strong>flexiblen</strong> und wiederverwendbaren Systemarchitektur<br />

hilfreich. Sie haben in der objektorientierten Softwareentwicklung einen<br />

hohen Stellenwert erhalten und werden daher häufig werkzeugunterstützt bei der Entwicklung<br />

oder Transformation von Softwaresystemen verwendet.<br />

PSE-D beschreibt eine Vorgehensweise <strong>zur</strong> <strong>flexiblen</strong> <strong>Definition</strong> und Verwaltung von<br />

Entwurfsmustern und deren Dokumentation auf der Basis von XML. Laut PSE-D<br />

gliedert sich ein Muster in einen allgemeinen und einen oder mehrere implementierungsspezifische<br />

Beschreibungsteil(e). Damit wird eine programmiersprachenunabhängige<br />

Verwaltung der Entwurfsmuster unterstützt. Für die Dokumentation der<br />

Muster ist eine freie Struktur und ein beliebiges ASCII-Format wählbar. Diese können<br />

mit ihren Dokumentationsteilen in einem frei wählbarem Verzeichnis verwaltet werden,<br />

wobei für jedes Muster ein Unterverzeichnis mit seinem Namen existieren muss.<br />

Neben der Verwaltung und <strong>Definition</strong> ist vor allen der Zugriff auf die interne Datenstruktur<br />

für andere Anwendungen wichtig. Für diesen Zweck werden von PSE-D Programmierschnittstellen<br />

bereitgestellt, mit denen man Zugriff auf die interne Muster-<br />

Infrastruktur erhält. Diese wird durch mehrere Java-Klassen abgebildet, die den allgemeinen<br />

und den/die implementierungsspezifischen Beschreibungsteil(e) der Muster<br />

kapseln.


Zusammenfassung und Ausblick 94<br />

Für die Visualisierung der verwalteten Entwurfsmuster und deren Dokumentation<br />

wurde das Werkzeug PSE-V entwickelt. Durch die Integration von PSE-V in die <strong>Entwicklungsumgebung</strong><br />

Eclipse werden dessen Komponenten (die Views "Pattern Navigator"<br />

und "Pattern Browser") über eigene Menübefehle von Eclipse gestartet.<br />

"Pattern Navigator" generiert dabei beim Starten die Musternavigation in Form <strong>einer</strong><br />

Baumstruktur, wobei <strong>zur</strong> besseren Übersichtlichkeit die Muster je nach Kategoriezugehörigkeit<br />

gruppiert werden. Die Dokumentation wird von "Pattern Browser" visualisiert<br />

und lässt sich über die Selektion eines Musters in "Pattern Navigator" ansteuern.<br />

PSE-V ermöglicht somit einen komfortablen Überblick über die verwalteten<br />

Muster und deren Aufbau.<br />

Die Implementierung von PSE-V wurde in mehrere Pakete mit verschiedenen Aufgabengebieten<br />

eingeteilt. Da die Verwaltung der Muster und die Konfiguration des<br />

Werkzeuges in XML erfolgt, wurde der Zugriff auf diese Dokumente in einem Anwendungsbeispiel<br />

erläutert.<br />

Neben PSE-Base existieren natürlich auch weitere Werkzeuge, die sich unter anderem<br />

mit der <strong>Definition</strong> und Verwaltung von Entwurfsmustern beschäftigen. Daher wurde<br />

eine Musterdefinition anhand zweier vergleichbarer Werkzeuge (PBE und FRED)<br />

erläutert. Durch einen abschließenden Vergleich aller drei Werkzeuge anhand verschiedener<br />

Kriterien wurden die Stärken bzw. Schwächen herausgearbeitet und damit<br />

mögliche Ansatzpunkte für eine Verbesserung aufgedeckt.<br />

9.2 Ausblick<br />

Obwohl mit PSE-Admin eine flexible <strong>Definition</strong> und Verwaltung von Entwurfsmustern<br />

und deren Dokumentation möglich ist, sind doch einige Ansatzpunkte gegeben,<br />

an denen eine Weiterentwicklung die Qualität des Werkzeuges verbessert.<br />

<strong>Definition</strong> auf <strong>einer</strong> höheren Abstraktionsebene<br />

Die <strong>Definition</strong> der Beschreibungsdateien für die Entwurfsmuster erfolgt auf der Basis<br />

von XML. Da jedes XML-Dokument auf ein XML-Schema verweisen muss, wird ein<br />

XML-Editor mit Schema-Unterstützung <strong>zur</strong> <strong>Definition</strong> empfohlen, um die Konsistenz<br />

der Daten sicherzustellen. Ein in Eclipse integriertes Werkzeug <strong>zur</strong> <strong>Definition</strong> der<br />

Muster auf <strong>einer</strong> höheren Abstraktionsebene ohne XML-Vorkenntnisse zu benötigen,<br />

ist aufgrund der Konsistenz der Benutzerführung besser als die direkte Bearbeitung<br />

der XML-Dokumente.


Zusammenfassung und Ausblick 95<br />

Integration von Suchfunktionalitäten:<br />

Eine Integration verschiedenster Suchfunktionalitäten (Stichwortsuche, Volltextsuche<br />

usw.) gestaltet eine Verwaltung eines umfangreichen Musterkataloges einfacher und<br />

erspart dem Benutzer Zeit bei der Suche nach gewissen Eigenschaften von Mustern.<br />

Integration von Funktionalitäten für komplexere <strong>Definition</strong>en<br />

Derzeit sind keine Funktionalitäten wie bspw. Einschränkungen, Ausdrücke, Schablonen<br />

und dynamische Hilfetexte vorgesehen. Ein selektives Angebot in diesem Bereich<br />

kann dem Benutzer beim Entwerfen s<strong>einer</strong> Entwurfsmuster in vielen Anwendungsbereichen<br />

eine Hilfestellung bieten.<br />

Eine Weiterentwicklung von PSE-Admin in den angesprochenen Punkten kann<br />

Entwicklern in Zukunft verhelfen, Entwurfsmuster und deren Dokumentation noch<br />

komfortabler zu definieren und zu verwalten.


Anhang A: Glossar 96<br />

Anhang A: Glossar<br />

ASCII-Format (American Standard Code for Information Interchange)<br />

Format, dass Zeichen mit einem Zahlencode aus 7 (Standard ASCII-Zeichensatz) oder<br />

8 Bit (erweiterter Zeichensatz mit Sonderzeichen) definiert.<br />

CPL (Common Public License)<br />

Lizenz, die gebührenfreien Quelltext und weltweite Vergabe der Rechte ermöglicht.<br />

DTD (Document Type <strong>Definition</strong>)<br />

Vorgänger von XML-Schema <strong>zur</strong> <strong>Definition</strong> <strong>einer</strong> Struktur von XML-Dokumenten.<br />

Gilt als veraltert und weist weniger Möglichkeiten wie XML-Schema auf.<br />

Eclipse<br />

Von einem Konsortium verschiedener Softwareunternehmen entwickelte kostenlose<br />

Java-<strong>Entwicklungsumgebung</strong>. Der große Vorteil von Eclipse ist die Erweiterbarkeit<br />

durch Plugins und der freie Zugang auf den Quellcode der Umgebung [Eclipse<br />

2002a].<br />

Framework<br />

Ansammlung von Klassen, welche einen abstrakten Entwurf für Lösungen zu <strong>einer</strong><br />

Familie verwandter Probleme enthalten. Der Programmierer muss nur Codes schreiben,<br />

wenn er das Verhalten des Framework verändern oder erweitern will [Freiberg<br />

2002].<br />

HTML-Browser<br />

Werkzeug <strong>zur</strong> Darstellung von Dateien, die im HTML-Format abgespeichert sind.<br />

Bekannte HTML-Browser sind "Microsoft Internet Explorer" und "Netscape Navigator".<br />

Java Virtual Machine<br />

Wird für die Ausführung von Java-Programmen benötigt und muss auf dem <strong>zur</strong> Ausführung<br />

bestimmten Betriebssystem installiert werden. Durch die Java Virtual<br />

Machine sind Java-Programme nicht an ein bestimmtes Betriebssystem gebunden.<br />

look and feel<br />

Bezeichnung des Verhaltens und Aussehens <strong>einer</strong> Anwendung. Bei PSE war die Eingliederung<br />

in die <strong>Entwicklungsumgebung</strong> Eclipse ein Ziel, um damit dem Werkzeug


Anhang A: Glossar 97<br />

das look and feel von Eclipse zu verleihen und dadurch konsistente Benutzerführung<br />

zu ermöglichen.<br />

Pattern Navigator<br />

Teil von PSE-V, der für die Darstellung der Musternavigation zuständig ist.<br />

Pattern Browser<br />

Teil von PSE-V, der für die Darstellung der HTML-Dokumentation der Muster zuständig<br />

ist.<br />

Plugin<br />

<strong>Erweiterung</strong>smöglichkeit von Eclipse. Jede <strong>Erweiterung</strong> von Eclipse trägt die Bezeichnung<br />

Plugin.<br />

PSE (Pattern Support for Eclipse)<br />

Werkzeug <strong>zur</strong> Unterstützung der Softwareentwicklung mit Hilfe von Entwurfsmustern,<br />

das als <strong>Erweiterung</strong> der <strong>Entwicklungsumgebung</strong> Eclipse konzipiert wurde. Besteht<br />

aus den Teilen PSE-Base und PSE-Application.<br />

PSE-Application<br />

Werkzeug <strong>zur</strong> Anwendung von Entwurfsmustern. Teil von PSE.<br />

PSE-Base<br />

Werkzeug <strong>zur</strong> <strong>Definition</strong>, Verwaltung und Visualisierung von Entwurfsmustern und<br />

deren Dokumentation. Besteht aus den Teilen PSE-D (<strong>Definition</strong>) und PSE-V (Visualisierung)<br />

und ist Teil von PSE.<br />

PSE-D (Pattern Support for Eclipse – <strong>Definition</strong>)<br />

Werkzeug <strong>zur</strong> <strong>Definition</strong> und Verwaltung von Entwurfsmustern und deren Dokumentation<br />

auf der Basis von XML. Stellt weiters Schnittstellen für den Zugriff auf die<br />

interne Muster-Infrastruktur <strong>zur</strong> Verfügung und wird daher von PSE-V und PSE-Application<br />

verwendet.<br />

PSE-V (Pattern Support for Eclipse – Visualisation)<br />

Werkzeug <strong>zur</strong> Visualisierung der durch PSE-D verwalteten Muster-Infrastruktur. Es<br />

unterstützt die Baumnavigation durch die verwalteten Entwurfsmuster, die je nach<br />

ihrer Kategoriezugehörigkeit dargestellt werden. Durch Selektion eines Musters wird<br />

dessen Dokumentation dargestellt.<br />

Streaming<br />

Internettechnologie, die erlaubt Audio- oder Video-Dateien bereits während dem Herunterladen<br />

anzuhören bzw. anzusehen. Man spricht daher auch von Echtzeitübertra-


Anhang A: Glossar 98<br />

gungen, da Daten ohne größere Zeitverschiebung wiedergegeben werden [Glossar<br />

2002].<br />

View<br />

Ein in Eclipse frei positionierbares Fester, dass eine gewisse Aufgabe erfüllt. Teil eines<br />

Plugin.<br />

XML (eXtensible Markup Language)<br />

Ein vom W3C entwickelter Standard <strong>zur</strong> strukturierten Darstellung von Daten in<br />

ASCII-Dokumenten mit der Endung ".xml". XML trennt das Layout vom Inhalt der<br />

Dokumente.<br />

XML-Schema<br />

Nachfolger der DTD. Ermöglicht für XML-Dokumente die Struktur deren Inhalt vorzuschreiben<br />

und kann aufgrund s<strong>einer</strong> Flexibilität auch für komplexere Modellierungen<br />

verwendet werden.


Anhang B: Literaturverzeichnis 99<br />

Anhang B: Literaturverzeichnis<br />

[Agerbo 1998]<br />

[Alexander 1995]<br />

[Altova 2002]<br />

[Anti Pattern 2002]<br />

[Buschmann 2000]<br />

[Chambers 2000]<br />

[Coplien 1992]<br />

[Delta 2002a]<br />

E. Agerbo, A. Cornils, How to preserve the benefits<br />

of Design Patterns, Conference on Object-oriented<br />

programming systems, languages, and applications<br />

in Vancouver, British Columbia, Canada,<br />

ACM-Press, 1998<br />

C. Alexander, S. Ishikawa, M. Silverstein, Eine<br />

Muster-Sprache, Löcker Verlag, 1995<br />

Altova Gmbh, XMLSpy, XML-Editor, Online im<br />

Internet: URL: http://www.xmlspy.com [Stand<br />

16.7.2002]<br />

Tu Graz, Anti Pattern, Online im Internet: URL:<br />

http://xarch.tu-graz.ac.at/autocad/wiki/AntiPattern<br />

[Stand 11.7.2002]<br />

F. Buschmann, H. Rohnert, M. Stal, D. Schmidth,<br />

Pattern Oriented Software Architecture Vol. 2,<br />

John Wiley and Sons Ltd, Chichester, UK, 2000<br />

C. Chambers, B. Harrison, J. Vlissides, A Debate<br />

on Language and Tool Support for Design Patterns,<br />

27th ACM SIGPLAN-SIGACT symposium<br />

on Principles of programming languages, ACM-<br />

Press, 2000<br />

J. O. Coplien, Advanced C++ Programming Styles<br />

and Idioms, Massachusetts, Addison-Wesley, 1992<br />

Delta Software Technology Group, Pattern by<br />

Example, Werkzeug <strong>zur</strong> Unterstützung der Programmierung<br />

mit Entwurfsmustern, Online im Internet:<br />

URL: http://www.delta-softwaretechnology.com<br />

[Stand 18.7.2002]


Anhang B: Literaturverzeichnis 100<br />

[Delta 2002b]<br />

[Eclipse 2002a]<br />

[Eclipse 2002b]<br />

[Freiberg 2002]<br />

[Gamma 1995]<br />

[Glossar 2002]<br />

[Greene 2002]<br />

[Helm 1995]<br />

[JDOM 2002]<br />

[Kappel 2001a]<br />

Delta Software Technology Group, Pattern by<br />

Example-Manual, Online im Internet: URL:<br />

http://www.delta-software-technology.com [Stand<br />

18.7.2002]<br />

Eclipse Consortium, <strong>Entwicklungsumgebung</strong><br />

Eclipse 2.0, Online im Internet: URL:<br />

http://www.eclipse.org [Stand 12.7.2002]<br />

Eclipse Consortium, Eclipse project briefing<br />

materials, Online im Internet: URL:<br />

http://www.eclipse.org/eclipse/index.html [Stand:<br />

24. 9. 2002]<br />

TU-Freiberg, Begriffsdefinitionen, Online im Internet:<br />

URL: http://www.informatik.tu-freiberg.de/<br />

forschung/bpaframe/bpaframe.htm [Stand<br />

25.7.2002]<br />

E. Gamma, R. Helm, R. Johnson, J. Vlissides,<br />

Design Patterns – Elements of Reusable Object-<br />

Oriented Software, Addison-Wesley, 1995<br />

Online Glossar/Lexikon, Online im Internet: URL:<br />

http://www.glossar.de [Stand 26.8.2002]<br />

S. L. Greene, P. Matchen, L. Jones, Patterns in<br />

Pracice: A Workshop for UI Designers, IBM 2002<br />

R. Helm, Patterns in Practice, Conference on Object-oriented<br />

programming systems, languages and<br />

applications in Austin, Texas, USA, ACM-Press,<br />

1995<br />

JDOM – XML-API, Online im Internet: URL:<br />

http://www.jdom.org<br />

G. Kappel, E. Kapsammer, W. Retschitzegger,<br />

XML-Grundlagen, Vorlesungsskript Spezielle Fragen<br />

aus IS – Modellierung von Web-Applikationen,<br />

Universität Linz, 2001


Anhang B: Literaturverzeichnis 101<br />

[Kappel 2001b]<br />

[Kappel 2001c]<br />

[Mayr-Kern 2002]<br />

[McCormick 1998]<br />

[Megginson 2002]<br />

[Meijers 1996]<br />

[OMG 2002]<br />

[Paulisch 1996]<br />

[Pomberger 1998]<br />

G. Kappel, E. Kapsammer, W. Retschitzegger,<br />

XML-Schema, Vorlesungsskript Spezielle Fragen<br />

aus IS – Modellierung von Web-Applikationen,<br />

Universität Linz, 2001<br />

G. Kappel, E. Kapsammer, W. Retschitzegger,<br />

XML-API's, Vorlesungsskript Spezielle Fragen aus<br />

IS – Modellierung von Web-Applikationen, Universität<br />

Linz, 2001<br />

I. Mayr-Kern, <strong>Erweiterung</strong> <strong>einer</strong> Programmierumgebung<br />

<strong>zur</strong> Unterstützung pattern-basierter<br />

Softwareentwicklung, Diplomarbeit an der Johannes<br />

Kepler Universität Linz, 2002<br />

H. W. McCormick, AntiPatterns Refactoring Software<br />

Architectures and Projects in Crisis, Online<br />

im Internet: URL: http://www.antipatterns.com/<br />

briefing/sld003.htm[Stand: 11.7.2002]<br />

Megginson Technologies, SAX – Simple API for<br />

XML, Online im Internet: URL:<br />

http://www.saxproject.org/[Stand 16.7.2002]<br />

Marco Meijers, Tool Support For Object Oriented<br />

Design Patterns, Master Thesis at the Department<br />

of Computer Science, Utrecht University, 1996<br />

Object Management Group, OMG Unified Modeling<br />

Language Specification V1.4, Online im Internet:<br />

URL: http://www.omg.org/ technology/<br />

documents/formal/uml.htm [Stand: 10.7.2002]<br />

F. Paulisch, Tool Support for Software Architecture,<br />

SIGSOFT 96 Workshop, San Francisco CA<br />

USA, ACM 1996<br />

G. Pomberger, Methoden und Werkzeuge für das<br />

Software Engineering, Vorlesungsskript Software<br />

Engineering, Universität Linz, 1998


Anhang B: Literaturverzeichnis 102<br />

[Pree 1994]<br />

[Rumbaugh 1991]<br />

[Sun 2002a]<br />

[Sun 2002b]<br />

[Tampere 2002]<br />

[Viljaama 2001]<br />

[W3C 2002a]<br />

[W3C 2002b]<br />

[W3C 2002c]<br />

[W3C 2002d]<br />

W. Pree, Design Patterns for Object-Oriented Software<br />

Development, Addison-Wesley, 1994<br />

J. Rumbaugh, M. Blaha, W. Premerlani, F. Eddy,<br />

W. Lorenson, Object-Oriented Modeling and Design,<br />

Prentice Hall, Englewood Cliffs, New York,<br />

1991<br />

Sun Microsystems Inc, JAXP – Java API for XML<br />

Processing, Online im Internet: URL:<br />

http://java.sun.com/xml/jaxp/index.html [Stand<br />

16.7.2002]<br />

Sun Microsystems Inc., JRE 1.3.1 -Java Runtime<br />

Environment, Online im Internet: URL:<br />

http://java.sun.com/j2se/1.3/download.html [Stand<br />

17.7.2002]<br />

Universität Tampere, FRED-Framework Editor for<br />

JAVA, Online im Internet: URL:<br />

http://practise.cs.tut.fi/fred/download.html [Stand:<br />

7.8.2002]<br />

A. Viljaama, Pattern Based Framework Annotation<br />

and Adaption, University of Helsinki, Department<br />

of Computer Science, Licentiate Thesis, Report C-<br />

2001-52, Helsinki, Juni 2001<br />

W3C, XML-Standard, Online im Internet: URL:<br />

http://www.w3.org/XML/ [Stand 16.7.2002]<br />

W3C, HTML-Standard, Online im Internet: URL:<br />

http://www.w3.org/MarkUp/, [Stand 16.7.2002]<br />

W3C, XML-Schema-Standard, Online im Internet:<br />

URL: http://www.w3.org/XML/Schema/ [Stand:<br />

16.7.2002]<br />

W3C, Document Object Model, Online im Internet:<br />

URL: http://www.w3.org/DOM/ [Stand 16.7.2002]


Anhang B: Literaturverzeichnis 103<br />

[Yacoub 1999]<br />

S. M. Yacoub, H. M. Ammar, Tool Support for<br />

Developing Pattern-Oriented Architectures, Computer<br />

Science and Electrical Engineering Dept.<br />

West Virginia University, USA, 1999

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!