kapitel 7. „objektentwurf“ - software engineering · 2018-02-08 · kapitel 7. „objektentwurf...
TRANSCRIPT
Vorlesung „Softwaretechnologie“Wintersemester 2010 R O O T S
Kapitel 7. „Objektentwurf“
Teilweise nach „Brügge & Dutoit“, Kap. 8
Stand: 16.12.2010
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-2 R O O T S
Objektentwurf Definition Aktivitäten
Wichtige Aktivitäten Spezifikation von Schnittstellen Fortgeschrittene UML-Konzepte
und ihre Umsetzung in bisher bekannte „Kern-UML“-Konzepte
Umsetzung von „Kern-UML“ in implementierungsnahe, einfachere Designs
Wichtige Hilfsmittel CRC-Karten „Design by Contract“ Verhaltensprotokolle (Behaviour
Protocols) „Split-Object“-Entwurfsmuster
Überblick
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-3 R O O T S
Der Objektentwurf als Produkt
… ist das komplette Modell des zu realisierenden Systems Klassendiagramme und dynamische Diagramme Verteilungs- und Komponentendiagramme
… dient als Basis für die Implementierung Automatische Code-Generierung aus Klassendiagrammen
Mittels CASE-Tools (CASE = Computer Aided Software Engineering = Computer-unterstütze Software Entwicklung)
Beispiel: Together, RationalRose, EnterpriseArchitect, ArgoUML, … Manuelle Implementierung des „Restes“
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-4 R O O T S
Der Objektentwurf als Prozess
… bezeichnet die Ergänzung und Veränderung der Ergebnisse der Anforderungsanalyse und des Systementwurfs auf Basis von Implementierungsentscheidungen, die die gesetzten Anforderungen erfüllen.
… bezeichnet die Identifikation verschiedener Möglichkeiten, das Analyse- und Systemmodell zu implementieren sowie die begründeteAuswahl zwischen den Alternativen (siehe auch Kapitel „Rationale Management“).
Die Auswahl orientiert sich immer an den gesetzten Anforderungen und deren Prioritäten.
Aber: Betreiben wir nicht schon in der Anforderungserfassung Objektentwurf?
Objektentwurf: Die Lücke schließen
Problem
Maschine
System
Anwendungsobjekte
Lösungsobjekte
Spezielle Objekte
DBMSCORBA Registry
Standard Komponenten
Objektentwurf
Anforderungen
SystementwurfKamera
Roboterarm
Hardware
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-6 R O O T S
Aufgaben des Objektentwurfs
Vollständige Definition aller Klassen und Assoziationen Auswahl von Algorithmen und Datenstrukturen Bestimmung neuer Klassen, die unabhängig von der
Anwendungsdomäne sind (z.B. “Cache”, Abstraktionen, Enturfsmuster, ...)
Überdenken der Typ- und Vererbungshierarchien Entscheidungen über den Kontrollfluss Optimierung
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-7 R O O T S
Aktivitäten während des Objektentwurfs
1. Schnittstellenspezifikation Spezifikation der Schnittstellen aller Typen (Klassen und Interfaces)
2. Auswahl vorhandener Komponenten Bestimmung von Standardkomponenten und zusätzlicher Objekte der
Lösungsdomäne 3. Restrukturierung des Objektmodells
Umformen des Modell des Objektentwurfs zur Verbesserung von Verständlichkeit und Erweiterbarkeit sowie Realisierung von UML-Konzepten, die keine Entsprechung in Ihrer Programmiersprache haben
4. Optimierung des Objektmodells Umformen des Objektmodells unter Berücksichtigung von
Performanzkriterien, wie Reaktionszeit (z.B. der Benutzerschnittstelle) oder Speicherbedarf.
Fortsetzung aus dem Systementwurf
R O O T S
Kapitel 7: Objektentwurf
Schnittstellenspezifikation
Schnittstellenidentifikation: CRC-KartenSchnittstellenfestlegung: Signatur-SpezifikationSchnittstellenverfeinerung: Verhaltens-Spezifikation durch Design by ContractSchnittstellenverfeinerung: Interaktions-Spezifikation durch Behaviour ProtocolsSchnittstellenverfeinerung: Spezifikation der „ausgehenden“ Schnittstelle
R O O T S
Kapitel 7: Objektentwurf
Schnittstellen-Identifikation: CRC-Cards
OO Modellierung: Class-Responsibility-Collaboration (CRC) Karten Class
Welche Klasse betrachten wir?
Responsibility Beschreibt die Aufgaben der Klasse
Collaboration Welche anderen Klassen werden
für die Aufgabe gebraucht?
Nutzen regt Diskussionen an lenkt den Blick auf das Wesentliche Hilft auf Schnittstelle statt Daten zu fokussieren beugt Konzentration von zu vielen
Verantwortlichkeiten an einer Stelle vor
“Schreib nie mehr auf, als auf eine Karte paßt!” eher die Klasse in zwei Klassen / Karten aufteilen! 1 Karte = höchstens DIN A5 groß (halbes DIN A4 Blatt)
Bestellung
Prüfe ob Artikel auf Lager
Bestimme Preis
Prüfe Zahlungseingang
Ausliefern
Lager
Artikel
Kunde, Kasse
Logistik
Class (Klassen-Name)
Responsibility(Aufgaben)
Collaboration(Zusammenarbeit)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-11 R O O T S
Einsatz von CRC-Cards
Wann in Analyse und früher Design-Phase
Wozu Identifikation von Klassen, Operationen und „Kollaborations“-Beziehung Einzig relevante Beziehung ist „Kollaboration“ mit anderen Klassen Instanzvariablen werden weitgehend ignoriert Fokus liegt auf Operationen und evtl. den Parametern und Ergebnissen,
die sie im Rahmen einer Kollaboration brauchen
CRC-Cards sind sehr hilfreiche für Anfänger in der OO Modellierung, da verhaltenszentriertes Denken gefördert wird!
Fokus auf Schnittstellenstatt auf Instanzvariablen, Aggregationen, Kardinalitäten, ...
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-12 R O O T S
Was kommt nach CRC-Cards?
Ausarbeitung der Beziehungen, Kardinalitäten, ... Herkömliche Datenmodellierung (IS-Vorlesung)
Verfeinerung des Verhaltens Design by Contract
(Re)Strukturierung des Objektmodells Objekt-Orientierte Modellierungs-Prinzipien
R O O T S
Kapitel 7: Objektentwurf
Schnittstellen-Spezifikation:Signaturen = Schnittstellen-Syntax
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-14 R O O T S
Spezifikation der Schnittstellen
In Anforderungsanalyse: Identifikation von Attributen - ohne ihren Typ anzugeben Operationen - ohne ihre Parameter(typen)
anzugeben
Im Entwurf: Hinzufügen von Typsignaturen … weiteres später …
Im Systementwurf werden Typsignaturen für Dienste festgelegt.
Im Objektentwurf werden Typsignaturen für alle Typen des Designs festgelegt. Typen = Klassen und Interfaces
Hashtable
-numElements
+put()+get()+remove()+containsKey()+size()
Hashtable
-numElements: int
+put(key: Object, entry:Object)+get(key: Object): Object+remove(key: Object)+containsKey(key: Object): boolean+size(): int
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-16 R O O T S
Warum reichen Typsignaturen nicht aus?
Sie sagen nur etwas darüber, wie man eine Operation aufruft.
Sie sagen nichts darüber, was die aufgerufene Operation macht. keine Verhaltensspezifikation Verhaltenszusicherungen (Contracts)
Sie sagen nichts darüber, in welcher Reihenfolge verschiedene Operationen des gleichen Objektes aufgerufen werden müssen. keine Interaktionsspezifikation Behaviour Protocols
Sie sagen nichts darüber, was der spezifizierte Typ selber von seiner Umgebung braucht, um die angebotenen Operationen realisieren zu können. keine explizite Spezifikation von Abhängigkeiten Benutzte Schnittstellen
(Required Interfaces)
Sie unterscheiden nicht verschiedene Clients Sichtbarkeitsinformationen
put(key: Object, entry:Object)
R O O T S
Kapitel 7: Objektentwurf
Schnittstellen-Spezifikation:Verhaltensspezifikation durch
„Design by Contract“
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-18 R O O T S
Design by Contract (DBC)
Behauptung (Assertion) Logische Aussage, die wahr sein muss Macht die Annahmen explizit, unter denen ein Design funktioniert Lässt sich automatisch überprüfen
Vertrag (Contract) Menge aller Assertions, die festlegen, wie zwei Partner interagieren Auftraggeber = aufrufende Operation / Klasse Auftragnehmer = aufgerufene Operation / benutzte Klasse
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-19 R O O T S
Design by Contract: Vorbedingungen (‚Preconditions’) Definition
Eine Precondition ist eine Voraussetzungen dafür, dass eine Operation korrekt ausgeführt werden kann
Technische Realisierung Assertion die wahr sein muss, bevor eine Operation ausgeführt wird.
Beispiel: Operation “Ziehe die Wurzel einer Zahl” Signatur: squareRoot(input int) Pre-condition: input >= 0
Verantwortlichkeiten Der aufgerufene Code formuliert die Vorbedingung Der aufrufende Code muss die Einhaltung der Vorbedingung sicherstellen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-20 R O O T S
Design by Contract: Nachbedingung (Postcondition) Definition
Postcondition beschreibt deklarativ das Ergebnis eines korrekten Aufrufs Sagt aus, was getan wird, nicht wie es getan wird
Technische Realisierung Assertion die wahr sein muss, nachdem eine Operation ausgeführt wird.
Beispiel: Operation “Ziehe die Wurzel einer Zahl” Signatur: squareRoot(input i) Post-condition: input = result * result
Verantwortlichkeiten Der aufgerufene Code formuliert die Nachbedingung Der aufgerufene Code garantiert die Einhaltung der Nachbedingung …
aber nur wenn die Vorbedingung wahr ist!
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-21 R O O T S
Design by Contract: Klasseninvariante (Class Invariant) Definition
Invariante beschreibt deklarativ legale Zustände von Instanzen einer Klasse
Technische Realisierung Assertion die für alle Instanzen einer Klasse immer wahr ist.
Beispiel: Klasse eines Benutzerkontos Invariante: Der Kontostand ist immer die Summe aller Buchungen “kontostand == summe(buchungen.betrag ())”
Verwendung Invarianten werden verwendet, um Konsistenzbedingungen zwischen
Attributen zu formulieren.
Verantwortlichkeiten Diese Bedingungen einzuhalten liegt in der gemeinsamen
Verantwortlichkeit aller Operationen einer Klasse.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-22 R O O T S
Zustand zu einem Zeitpunkt = Die Werte aller Instanzvariablen Mindestens der eigenen Var. Konzeptionell ist auch der
Zustand aller aggregierten Teil-Objekte eigener Zustand
legale Zustände werden durch Klasseninvarianten definiert Dame und Springer haben
gleichen Zustandsraum (jedes Schachbrett-Feld)
Figuren dürfen Spielfeldnicht verlassen
Legale Schachbrett-Zustände: pro Feld max. eine Figur
DBC spezifiziert legale Zustände
1
2
3
4
5
6
7
8
a b c d e f g h
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-23 R O O T S
1
2
3
4
5
6
7
8
a b c d e f g h
Verhalten der Dame Verhalten = Zustandsübergänge
und daran gekoppelte Aktionen Dame bewegt sich horizontal
und diagonal beliebig weit Springer bewegt sich L-förmig
Legales Verhalten Mindestens:
Zustandsübergänge die nicht in illegale Zustände führen
Meist gibt es zusätzliche applikationsspezifische Bedingungen („Constraints“) s. nächste Folie
DBC spezifiziert legales Verhalten
Verhalten der Springer
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-24 R O O T S
1
2
3
4
5
6
7
8
a b c d e f g h
DBC spezifiziert legales Verhalten
DDBC definiert legale Zustandsübergänge durch Vor- und Nachbedingungen
Beispiel: Eigene Figuren schlagenist verboten Vorbedingung der Operation
“zieheNach(Feld)”:Feld nicht von eigener Figurbelegt
Beispiel: Keine Figur ausser demSpringer kann über anderehinüberspringen Weitere Vorbedingung der
Operation “zieheNach(Feld)”
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-25 R O O T S
OCL erlaubt die formale Spezifikation von Bedingungen (Constraints) für Werte von Modellelementen oder Gruppen von Modellelementen Noch keine Bedingungen an den Kontrollfluss möglich.
Ein Constraint wird in Form eines OCL Ausdrucks angegeben, der entweder den Wert wahr oder falsch hat. „Constraint“ in OCL = „Assertion“ in DBC
Beispiel: OCL Constraints für Hashtabellen Invariante:
inv: Bedeutet: „Für den Typ ‚Hashtable‘ gilt die Invariante ‚numElements >= 0‘.“
Vorbedingung: pre:
Nachbedingung: post: containsKey(key) and get(key) = entry
!containsKey(key)context Hashtable::put(key, entry)
context Hashtable::put(key, entry)
context Hashtable numElements >= 0
Formulierung von Kontrakten in UML: OCL (Object Constraint Language)
OCL Ausdruck: Namen beziehen sich auf
Elemente des Modells
Dargestellte Art von Assertion
Gültigkeits-bereich
Notation für “Methode ‘put’ aus Typ ‘Hashtable’ ”
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-26 R O O T S
Formulierung von Kontrakten in UML
Jede Assertion kann auch als Notiz dargestellt und an des jeweilige UML Element “angehängt” werden. Die Art der Assertion wird als Stereotyp angegeben
Hashtable
numElements:int
put(key, entry:Object)get(key):Objectremove(key:Object)containsKey(key:Object):booleansize():int
Besondere Schlüsselworte in Nachbedingungen (‚postconditions‘) Wenn nichts explizit angegeben ist bezieht man sich in Nachbedingun-
gen auf den Nachzustand und in Vorbedingungen auf den Vorzustand. In Nachbedingungen muss aber manchmal explizit der Zustand vor
und nach der Ausführung der Operation in Beziehung gesetzt werden. Syntax
expr@pre = Der Wert des Ausdrucks expr vor Ausführung der Operationauf die sich die Nachbedingung bezieht.
expr@post = Der Wert des Ausdrucks expr nach Ausführung der Operation auf die sich die Nachbedingung bezieht.
Beispiele context Person::birthdayHappens() post: age = age@pre + 1 age@pre bezieht sich hier auf den Wert des Feldes age vor Begin der
Ausführung der Operation birthdayHappens() „Alter Wert“ [email protected] – Alter Wert des Feldes b von a. Darin der neue Wert des
Feldes c. [email protected]@pre – Alter Wert des Feldes b von a. Darin der alte Wert des
Feldes c.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-28 R O O T S
Weitere OCL-Schlüsselworte
result Bezug auf den Ergebniswert einer Operation (in Nachbedingungen).
self Bezug auf das ausführende Objekt (wie „this“ in Java).
Literatur OCL 2.0 Specification, Version 2.0, Date: 06/06/2005,
http://www.omg.org/docs/ptc/05-06-06.pdf
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-29 R O O T S
DBC-Unterstützung in Java
Assertions Seit Java 1.4. Zur Ausführung des Java-Bytecodes mit Assertions wird
eine JVM 1.4 oder höher vorausgesetzt. Werden auch in den API-Klassen eingesetzt Können per Option des java-Aufrufs eingeschaltet (enabled)… …und abgeschaltet (disabled: Default) werden
Vorbedingungen, Nachbedingung und Invarianten …werden als boolesche Ausdrücke in den Quelltext geschrieben.
Vorteile von Assertions Schnelle, effektive Möglichkeit Programmierfehler zu finden. Bieten die Möglichkeit, Annahmen knapp und lesbar im Programm zu
beschreiben. Die Nutzung von Assertions zur Entwicklungszeit erlaubt es zu zeigen,
dass alle Annahmen richtig sind. Die Qualität des Codes erhöht sich somit.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-30 R O O T S
Anwendung Man kann Assertions an beliebigen Stellen des Quellcodes verwenden um
logische Ausdrücke zu überprüfen. Liefert ein solcher Ausdruck false zurück, wird ein AssertionError
ausgelöst und die Ausführung des Programms stoppt. Die ausgelösten Fehler sind vom Typ Error und nicht vom Typ Exception
Sie müssen daher nicht abgefangen werden!
Syntax
assert <boolean expression> : <String>;
assert (c != null) : "Customer is null“;
assert <boolean expression>;
assert (c != null);
DBC-Unterstützung in Java
oder:
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-31 R O O T S
Warum DBC-Unterstützung in Java?
Der Effekt des assert Statements könnte auch mit einer if-Anweisung und explizitem Werfen von ungeprüften Ausnahmen realisiert werden.
Die Vorteile von sprachunterstützten Assertions sind Lesbarkeit
Der Quellcode wird klarer und kürzer Auf den ersten Blick ist zu erkennen, dass es sich um eine
Korrektheitsüberprüfung handelt und nicht um eine Verzweigung im Programmablauf
Effizienz Sie lassen sich für die Laufzeit wahlweise an- oder ausschalten Somit verursachen sie praktisch keine Verschlechterung des
Laufzeitverhaltens.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-32 R O O T S
Design by Contract: Sprachunterstützung
Java Assertions werden ab JDK 1.4 unterstützt Formulierung von pre -und, postconditions und invariants ist damit möglich
Contract4J Contracts als assertions für JDK 1.5 (Java 5) formuliert http://www.contract4j.org
Eiffel Kontrakte voll unterstützt (preconditions, postconditions und invariants) http://en.wikipedia.org/wiki/Eiffel_(programming_language)
Spec# C# mit voller Kontraktunterstützung und vielen anderen Erweiterungen http://research.microsoft.com/specsharp/
Andere Sprachen Kontrakte zumindestens in der Dokumentation explizit machen
In allen Sprachen Kontrakte als wichtiges Kriterium beim Entwurf mit beachten Ersetzbarkeit
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-33 R O O T S
Subtyping / Ersetzbarkeit und Kontrakte
Instanzen von B sind immer für Instanzen von A einsetzbar
Instanzen von B bieten mindestens und fordern höchstensdas gleiche wie Instanzen von A
B ist ein Subtyp von A
Instanzen von B haben mindestens alle Methoden von A, und zwar mit (gleichen oder) stärkeren Nachbedingungen
und (gleichen oder) schwächeren Vorbedingungen
R O O T S
Kapitel 7: Objektentwurf
Schnittstellen-Spezifikation:Interaktionsspezifikation durch „Behavour Protocols“
Gegeben Folgende Typspezifikation ... und sogar zugehörige Contracts
Problem Wir wüssten trotzdem nicht, wie das
beabsichtigte Zusammenspiel der einzelnen Methoden ist.
Kann man jede in jeder beliebigen Reihenfolge aufrufen, unabhängig von dem was man vorher aufgerufen hat?
Lösung Zu jedem Typ wird sein
„Verhaltensprotokoll“ mit angegeben Es ist ein regulärer Ausdruck der
legale Aufrufsequenzen und Wiederholungen spezifiziert
Beispiel „Erst Verbindung zuer Datenbank
erstellen, dann beliebig oft anfragen und in jedem Anfrageergebnis beliebig oft Teilergebnisse abfragen, dann Verbindung wieder schließen.“
Interaktionsspezifikation durch „Behaviour Protocoll“
DB_Interface
open(DB_descr) : Connectionclose(Connection)query(Connection,SQL) : ResultSetgetNext(ResultSet) : Result
protocoll DB_Interface_Use = open(DB_descr) ,( query(Connection,SQL) : ResultSet ,( getNext(ResultSet) : Result )* ,
)* ,close(Connection)
R O O T S
Kapitel 7: Objektentwurf
Schnittstellen-Spezifikation:Sichtbarkeitsinformationen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-37 R O O T S
Hinzufügen von SichtbarkeitsinformationenUML definiert drei Sichtbarkeitsgrade: Private (-)
Auf diese Attribute/Operationen kann nur aus der sie definierenden Klassezugegriffen werden.
Protected (#) Auf diese Attribute/Operationen kann nur aus der sie definierenden Klasse
und deren Subklassen zugegriffen werden. Public (+)
Auf diese Attribute/Operationen kann aus jeder Klasse zugegriffen werden.
Die in Java bekante „package Sichtbarkeit“ gibt es in der UML nicht. Wenn gewünscht, entsprechenden Stereotyp benutzen, z.B. <<package_visible>>.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-38 R O O T S
Windowsize: Areavisibility: Booleandisplay()hide()Window
Window{ status=tested }
+ default-size: Rectangle+ size: Area = (100,100)# visibility: Boolean- xwin: XWindow+ display()+ hide()+ create()
Verschiedene Sichten von Klassen
Detaillierungsgrad Implementierung Analyse / Design „eingeklappt“
Notation public: + protected: # private: – Klassenvariable / -methode Abstrakte Klasse / Methode
Fließender ÜbergangCASE-Tools unterstützen einen fließenden Übergang, indem verschiedene Sichten definiert bzw. verschiedene Detail-Level ein-und ausgeblendet werden können.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-39 R O O T S
Sichtbarkeiten Zuletzt
Festlegung der Sichtbarkeiten ist schon sehr implementierungsnah.
Daher ist das der letzte Schritt, nach all den verschiedenen Formen der Festlegung der Typen über Signatur, Kontrakte und Protokolle.
R O O T S
Kapitel 7: Objektentwurf
Schnittstellen-Spezifikation:Explizite Spezifikation von „Benutzten Schnittstellen“
Siehe Abschnitt über „Komponenten“ im Kapitel „Systementwurf“
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-47 R O O T S
Aktivitäten während des Objektentwurfs
1. Schnittstellenspezifikation Spezifikation der Schnittstellen aller Typen (Klassen und Interfaces)
2. Auswahl vorhandener Komponenten Bestimmung von Standardkomponenten
3. Restrukturierung des Objektmodells Umformen des Objektmodell zur Verbesserung von Verständlichkeit und
Erweiterbarkeit sowie Realisierung von UML-Konzepten, die keine Entsprechung in Ihrer Programmiersprache haben
4. Optimierung des Objektmodells Umformen des Objektmodells unter Berücksichtigung von
Performanzkriterien, wie Reaktionszeit (z.B. der Benutzerschnittstelle) oder Speicherbedarf.
R O O T S
Kapitel 7: Objektentwurf
Wiederverwendung
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-49 R O O T S
Wiederverwendung
Wähle passende Datenstrukturen zu den jeweiligen Algorithmen Container-Klassen Arrays, Listen, Queues, Stacks, Mengen, Bäume
Suche nach vorhandenen Klassen in Klassenbibliotheken JSAPI, JTAPI, …
Definiere neue interne Klassen und Operationen nur wenn nötig. Komplexe Operationen erfordern eventuell Zerlegung
in neue Teiloperationen in neue Klassen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-50 R O O T S
Nutzung bestehender Software
Komponenten-Suchmaschinen Bsp: MeroBase, CodeConjurer Prof. Atkinson, Universität Mannheim
Auswahl existierender Standardklassenbibliotheken, Frameworks oder Komponenten Eigene oder von Drittanbietern (open source oder kommerziell)
Anpassung der Standardklassenbibliotheken, Frameworks oder Komponenten Nutzung vorgesehener Anpassungsmöglichkeiten
Parametrisierung Bildung von Unterklassen Konfiguration per „deployment descriptor“
Unvorhergesehene Anpassung Änderungen der API, falls der Quellcode verfügbar ist Sonst: Adapter oder Bridge Pattern Sonst: Aspektorientierte Programmierung
R O O T S
Kapitel 7: Objektentwurf
Erweiterung und Restrukturierung des Objektmodells
Umsetzung von fortgeschrittenen UML-Konzepten in „Kern-UML“ Umsetzung von Kern-UML in implementierungsnahes UML
Verbesserung von Verständlichkeit und Erweiterbarkeit
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-52 R O O T S
Aktivitäten während des Objektentwurfs
1. Schnittstellenspezifikation Spezifikation der Schnittstellen aller Typen (Klassen und Interfaces)
2. Auswahl vorhandener Komponenten Bestimmung von Standardkomponenten zusätzliche Objekte der
Lösungsdomäne 3. Ergänzung und Restrukturierung des Objektmodells
Umformen des Objektmodell zur Umsetzung von UML-Konzepten, die nicht direkt von der Realisierungsumgebung unterstützt werden
... sowie zur Verbesserung von Verständlichkeit und Erweiterbarkeit 4. Optimierung des Objektmodells
Umformen des Objektmodells unter Berücksichtigung von Performanzkriterien, wie Reaktionszeit (z.B. der Benutzerschnittstelle) oder Speicherbedarf.
R O O T S
Kapitel 7: Objektentwurf
Erweiterung und Restrukturierung Fortgeschrittene UML-Konzepte
Abgeleitete AttributeAssoziationen als Klassen
AssoziationsklassenQualifizierte Assoziationen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-54 R O O T S
Bezug von UML zu gängigen OO Sprachen
C++
sprachspezifische Details
Konzepte ohne direkter Entsprechung in
gängigen Sprachen
direkt ineinander abbildbarer
gemeinsamer „Kern“
UML
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-55 R O O T S
UML, statisches Modell: Multiple Vererbung Eine Klasse mit mehreren Oberklassen
studentische Hilfskraft
Student Angestellter
UML, statisches Modell: Multiple Klassifikation Ein Objekt kann Instanz mehrerer Klassen sein
Person
Patient ArztKranken-gymnast
Kranken-schwester
Hausarzt Chirurg
Frau Mann
hahnemann : Mann, Hausarzt
Multiple Instanz
Diskriminator
Geschlecht Gesundheit Beruf
Fachgebiet
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-57 R O O T S
UML, statisches Modell: Dynamische Klassifikation Eine Objekt kann Instanz mehrerer Klassen sein ... und seine Klassenzugehörigkeit ändern
Person
IngenieurManager HändlerFrau Mann
Geschlecht {static} Beruf {dynamic}
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-58 R O O T S
obligatorisch (mandatory) Objekte müssen einer Klasse
aus dieser Partition angehören optional (optional) (default)
Objekte müssen nicht ...
statisch (static) (default) Objekte bleiben lebenslang in
einer Klasse dynamisch (dynamic)
Objekte können Klasse wechseln
impliziert "optional"
UML: Partitionierung von Unterklassen
Person
PatientFrau Mann
Geschlecht Gesundheit{optional, dynamic}
{mandatory, static}
hahnemann : Mann
hahnemann : Mann, Patient
hahnemann : Mann
t1
t2
t3
ZeitLegale Instanziierungen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-59 R O O T S
vollständig (complete) (default) impliziert Abstraktheit der
Oberklasse (falls es keine andere unvollständige Partition gibt)
überlappung (overlapping) impliziert Existenz
gemeinsamer Subtypen der Unterklassen
unvollständig (incomplete) hat oft konkrete Oberklasse für
alle nicht explizit gemachten weiteren Alternativen
disjunkt (disjoint) (default) impliziert Fehlen gemeinsamer
Subtypen der Unterklassen
UML: Partitionierung von Unterklassen
Figur
Linie PolygonKurve
Tier
Herbivore Carnivore
{incomplete, disjoint}
{complete, overlapping }
Omnivore
Können aus anderen Attributen berechnet werden Geben Hinweis auf Abwägung zwischen Neuberechnungsaufwand und
Konsistenzproblem bei redundanter Speicherung
UML: Abgeleitete Attribute
Account/balance:Money
Entryamount:Money
*
SummaryAccount
DetailAccount
*
{balance=sum of amounts of entries}
/entries
0..1 1
Abgeleitetes Attribut
Abgeleitete Rolle
*
/entries role is derived usingcomponent.entries
Anmerkung zur Berechnung eines abgeleiteten Attributs
components
OCL-Bedingung zur Berechnung eines abgeleiteten Attributs
R O O T S
Kapitel 7: Objektentwurf
Erweiterung und Restrukturierung Umsetzung fortgeschrittener
UML-Konzepte in „Kern-UML“ „Split Object“-Entwurfsmuster
Strategy Pattern als motivierendes BeispielEssenz von Split Objects
Weitere wichtige „Split-Object“-Patterns: State, Multiple Vererbung, Decorator
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-62 R O O T S
UMLHigh
Dynamische Klassifikation Multiple Instanziierung Multiple Vererbung
Bidirektionale Assoziationen Qualifizierte Assoziationen
UMLCore
Statische Klassifikation Einfache Instanziierung Einfache Vererbung
Unidirektionale Assoziationen (Felder)
Restrukturierung des Objektmodells: UMLHigh UMLCore
„Split object“
Design
Patterns
Assoziations-
realisierung
Transformation von konzeptionellem Entwurf in „UMLHigh“ in implementierungsnahen Entwurf in „Kern-UML“
Umsetzung in verfügbare Zielsprache danach einfach, da die Kern-UML-Konzepte 1:1 in Programmiersprachen unterstützt sind
In diesem Abschnitt
Restrukturierung des Objektmodells: UMLHigh UMLLow
Typische Umsetzungsbeispiele Multiple Vererbung
Wiederverwendung: durch Aggregation und Forwarding Subtyping: durch Implementation eines gemeinsamen Interfaces Overriding: durch „Rückreferenzen“ (als Parameter oder Feld)
Multiple Instanziierung / Multiple Sichten Decorator (evtl. mit obiger Simulation von Subtyping und Overriding)
Dynamische Klassifikation / Dynamische Änderung der Klassenzugehörigkeit Strategy
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-64 R O O T S
Motivation: Ein Beispiel
tuDas() ist geschlechtsspezifisch einheitlich
tuDies() ist personenspezifisch verschieden
Wie modelliert man objektspezifisches zustandsspezifisches dynamisch veränderbares
Verhalten?
?
Person...
tuDies(...)tuDas(...)
Man...
tuDas(...)
Woman...
tuDas(...)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-65 R O O T S
Schlecht, denn jede neue Alternative („begeistert“, „depresiv“, …) erfordert Änderung einer jeden mit Stimmungen befassten „case“-Anweisung
Typischerweise ist ja nicht nur eine Aktion (hier: tuDies) stimmungsabhängig…
1. Versuch: “Fest Kodieren”
Person...
tuDies(...)tuDas(...)
Man...
tuDas(...)
Woman...
tuDas(...)
tuDies(...) {...
case mood {happy: doItOneWay();sad: doItAnotherWay();
}}
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-67 R O O T S
klassenspezifisch festes Verhalten :SadWoman
2. Versuch: “Multiple Vererbung”
Person...
tuDies(...)tuDas(...)
Man...
tuDas(...)
Woman...
tuDas(...)
Strategie...
tuDies(...)
Happy...
tuDies(...)
Sad...
tuDies(...)
SadWomanHappyMan HappyWoman SadMan
kombinatorische Explosion
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-69 R O O T S
Person...
tuDies(...)tuDas(...)
setStrategy(…)
Man...
tuDas(...)
Woman...
tuDas(...)
Strategie...
tuDies(...)
Happy...
tuDies(...)
Sad...
tuDies(...)
strategy
:Woman :Happy
tuDies(...) {strategy.tuDies(...)
}setStrategy(s:Strategie) {
strategy = s}
tuDies(...) tuDies(...)
setStrategy(sad)
:Sad
3. Versuch: “Strategy Pattern”
R O O T S
Kapitel 7: Objektentwurf
Das Strategy Pattern
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-71 R O O T S
Das Strategy Pattern: Einführung
Absicht Kapselung einer Familie von Algorithmen mit der Möglichkeit, sie beliebig
auszutauschen. Motivation
Berechnung von Zeilenumbrüchen mehrere Algorithmen können eingesetzt werden neue Varianten sollen später hinzugefügt werden können
Struktur (für obiges Beispiel)
Composition
traverse()repair()
Compositor
compose()
ArrayCompositor
compose()
TeXCompositor
compose()
SimpleCompositor
compose()
compositor.compose()
compositor
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-72 R O O T S
Das Strategy Pattern: Anwendbarkeit und Struktur Anwendbar in folgendem Kontext
Einige ähnliche Klassen unterscheiden sich nur in gewissen Aspekten des Verhaltens. Diese können in ein Strategie-Objekt ausgelagert werden.
Verhalten ist abhängig von äußeren Randbedingungen Verschiedene Varianten eines Algorithmus werden benötigt
z.B. mit unterschiedlicher Zeit-/Platzkomplexität. Kapselung von Daten eines komplexen Algorithmus
Struktur (allgemein)
Context
contextOperation()
Strategy
algorithm()
ConcreteStrategyC
algorithm()
ConcreteStrategyB
algorithm()
ConcreteStrategyA
algorithm()
strategy
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-73 R O O T S
Alternative Schnittstellen zwischen Kontext und Strategien1. Kontext übergibt alle relevanten Daten an die Strategie-Methode2. Kontext übergibt nur this an Strategie-Methode flexibelste Lösung3. Strategie-Objekt speichert bei Initialisierung feste Referenz auf Kontext
Implementierung von Default-Verhalten möglich In der Kontext-Klasse wird ein Default-Verhalten verwendet, wenn kein
Strategie-Objekt gesetzt ist.
ConcreteStrategyC
algorithm()
ConcreteStrategyB
algorithm()
ConcreteStrategyA
algorithm()
Das Strategy Pattern: Implementierung
default
Context
contextOperation()
Strategy
algorithm()
strategy
(Context)(T1,...,Tn)
(Context)(Context) (T1,...,Tn)(T1,...,Tn) (Context)(T1,...,Tn)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-74 R O O T S
Implementierung: Fallunterscheidung in Kontext
Vorteile ???
Nachteile Uneinheitliche Lösung: Kontext muss Default-Strategie kennen
...
if (strategy == null) ... default ...
else strategy.algorithm();
...
Context
contextOperation()
Strategy
algorithm()
ConcreteStrategyC
algorithm()
ConcreteStrategyB
algorithm()
strategy
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-75 R O O T S
Implementierung: „Default-Strategie“-Klasse
Idee Jede Zuweisung "Strategy s = null;"
ersetzen durch "Strategy s = new DefaultStrategy();" Abfragen auf null und entsprechende Fallunterscheidungen löschen
Vorteile lesbarerer Code einheitliche Lösung, klare Trennung von Kontext und Strategien
...strategy.algorithm();...
... default ...Dies Variante ist als das
"Null Pattern"
bekannt.
Dies Variante ist als das "Null Pattern"
bekannt.
Dies ist das "Null Object Pattern"
Strategy
algorithm()
DefaultStrategy
algorithm()
ConcreteStrategyB
algorithm()
Context
contextOperation()
strategy
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-76 R O O T S
Das Strategy Pattern: Konsequenzen
Konzeptuell Familie von zusammengehörigen Algorithmen Auswahl verschiedener Implementierungen desselben Verhaltens dynamische Alternative zu Unterklassenbeziehung Polymorphismus statt Fallunterscheidungen (if-then-else, switch-case) leichtere Erweiterbarkeit
Konsequenzen aus Implementierung Kontext übergibt evtl. Parameter, die nicht jedes Strategie-Objekt benötigt
this zu übergeben ist allgemeiner Zusätzliche Nachrichten zwischen Kontext und Strategie Erhöhte Anzahl an Objekten
Möglicherweise können aber Strategie-Objekte gemeinsam verwendet werden Flyweight-Pattern
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-77 R O O T S
Prinzip Dekomposition: 2 Objekte Weiterleitung von Anfragen
Vorteile Dynamik Multiplizität Erweiterbarkeit
Strategy Pattern: Bewertung
R O O T S
Kapitel 7: Objektentwurf
Split Objects: Prinzipien
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-79 R O O T S
Was sind also "Split Objects"?
Definition verschiedene Objekte die konzeptuell als eine Einheit agieren (schienbar) gemeinsame Identität (schienbar) gemeinsamer Zustand (schienbar) gemeinsames Verhalten Clients glauben mit einem einzigen Objekt zu interagieren
Motivation Vorausschauende Dekomposition
Aus konzeptuellem Objekt Teilaspekte (Zustand / Verhalten) extrahieren, die austauschbar sein sollen
Unvorhergesehene Komposition Zu existierendem Objekt nachträglich Teilaspekte (Zustand / Verhalten)
hinzufügen, die konzeptuell dazugehören
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-80 R O O T S
Technik Mehrere physikalische Objekte Nur eines davon ist nach außen hin sichtbar Es stellt das Interface des konzeptuellen Gesamtobjektes zur Verfügung ... indem es die Fähigkeiten der anderen mit benutzt
Szenarien
Split Objects
TransitivitätGemeinsamkeiten Dynamik
Migrationverzögerte Erzeugung
Strategy,
State
Chain of responsibilityDecorator,
Flyweight
ProxyProxy
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-81 R O O T S
Split Objects sind die Grundlage vieler Design Patterns Vorausschauende Dekomposition
Proxy Strategy State Flyweight
Unvorhergesehene Komposition Adapter Decorator Chain of Responsibility
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-82 R O O T S
Gemeinsame Struktur
Aggregation Kind-Klasse ist "Ganzes" Eltern-Klasse ist "Teil" modellieren zusammen den
prinzipiellen Ablauf der Interaktion
evtl. Unterklassen modellieren Variabilität beliebige Kombination der
Instanzen
Forwarding Kind leitet empfangene Nachricht
an Eltern-Objekt weiter Grundlage für Code-
Wiederverwendung
Kind-Klasse
m()f()
Eltern-Klassem()
K_1 K_Nf()
E_1m()
E_Nm()
kindObj : K_1 elternobj : E_N
m(){
parent.m()
}
parent
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-83 R O O T S
Beziehung zwischen Kind- und Elternobjekt
Elementare Beziehungen
Forwarding Kind leitet empfangene
Nachricht an Eltern-Objekt weiter
Subtyping Kind bietet volles Eltern-
Interface Overriding
im Kontext weitergeleiteter Nachrichten werden Methoden des Kindobjekts benutzt
... anstelle entsprechender Methoden des Elternobjekts
Zusammengesetzte Beziehungen
Resending forwarding ... ohne subtyping ... ohne overriding
Consultation forwarding ... mit subtyping ... ohne overriding
Delegation („Objektvererbung“) forwarding ... mit subtyping ... mit overriding
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-84 R O O T S
Implementierung der Subtypbeziehung: Variante 1 Idee
Kind-Klasse ist Unterklasse
Vorteil allgemein anwendbar
Nachteil Kindklasse erbt auch die
Variablen der Elternklasse Duplizierung von Daten
Speicherverschwendung Konsistenzprobleme
Kind-Klasse
m()f()
Eltern-Klassem()
K_1 K_Nf()
E_1m()
E_Nm()
kindObj : K_1 elternobj : E_N
m(){
parent.m()
}
parent
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-85 R O O T S
Implementierung der Subtypbeziehung: Variante 2 Idee
Kind implementiert gleiches Interface wie die Elternklasse
Eltern-Interface anstatt Eltern-Klasse in Typdeklarationen verwenden
Vorteil keine Datenduplizierung saubere Trennung
Subtyping Code Wiederverwendung
<<interface>>Eltern-Interf
m()
<<implements>>
Kind-Klasse
m()f()
Eltern-Klassem()
K_1 K_Nf()
E_1m()
E_Nm()
kindObj : K_1 elternobj : E_N
m(){
parent.m()
}
parent
R O O T S
Kapitel 7: Objektentwurf
Wie modelliert man Overriding?
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-87 R O O T S
Man WomantuDas(...) tuDas(...)
TuDies-StrategietuDies(...)
Person tuDies(...) {this.ueben();this.tuDas();
}
Happy Sadueben(...) ueben(...)
tuDies(...)
this
tuDies(...)
this
“Schizophrene Objekte”: verschiedenes “this” in ursprünglicher Nachricht und weitergeleiteter Nachricht, obwohl
beide das gleiche konzeptionelle ein Objekt „fröhliche Frau“ ansprechen.
Strategy Pattern als Beispiel des Overriding-Problems
:Woman :Happy
strategy
tuDies(…)tuDas(…)
tuDies(...) {strategy.tuDies(...)
}
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-89 R O O T S
Man WomantuDas(...) tuDas(...)
TuDies-StrategietuDies(...)
Person tuDies(trueSelf,…) {this.ueben();trueSelf.tuDas();
}
Happy Sadueben(...) ueben(...)
:Woman :Happy
strategy
tuDies(…)tuDas(…)
tuDies(...) {strategy.tuDies(this,...)
}
trueSelf
ueben()
tuDas()
Heureka! Heureka?
Overriding-Simulation: "this" explizit machen
Typ?!?
tuDies(...)
this
tuDies(...)
this
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-90 R O O T S
Overriding-Simulation: Schwachpunkte
Festlegung des Typs von trueSelf “Strategy”-Klasse kann nur von “Personen” benutzt werden eingeschränkte Wiederverwendbarkeit
Festlegung welche Nachricht an trueSelf und welche an this geschickt wird Festlegung was in Unterklassen und was in Kindklassen redefinierbar ist eingeschränkte Wiederverwendbarkeit
manuelle Weiterleitung von Anfragen Fehleranfälligkeit hoher Programmieraufwand Erweiterung der Elternklassen erfordert Änderung aller Kindklassen
Änderung der Schnittstelle der Elternklasse erfroderlich Zusätzlicher trueSelf Parameter erfordert Anpassung der Aufrufe in allen
Clients der Elternklasse
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-91 R O O T S
Alternative: Overriding-Simulation mit Instanzvarible Idee
trueSelf dem Elternobjekt im Konstruktor übergeben ... in Instanzvariable speichern
Vorteil Schnittstelle der Elternklasse bleibt unverändert Keine Folgeänderungen in Clients der Elternklasse
Nachteile Nur anwendbar wenn jedes Elternobjekt nur ein Kindobjekt hat Nicht anwendbar, wenn Nachrichten auch direkt an das Elternobjekt
geschickt werden (statt via dem gespeicherten Kindobjekt) Nicht rekursiv anwendbar
Anwendbarkeit z.B. für Simulation multipler Vererbung durch "split objects"
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-92 R O O T S
Split Objects: Zwischen-Fazit
Grundidee Zerlegung in zwei Objekte
Techniken Code-Wiederverwendung mittels Forwarding Subtypbeziehung mittels Interfaces Overriding mittels explizitem "this" (als Parameter oder gespeichert) Je anspruchsvoller die Beziehung zwischen split objects
Resending Consultation Delegation
... um so komplexer die Implementierung
Diese Techniken bilden eine „Pattern Language“ zur Simulation von (multipler) Vererbung auf Objektebene
R O O T S
Kapitel 7: Objektentwurf
Auf "Split Objects"-Idee basierende Patterns
2. Das State Pattern
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-94 R O O T S
Das State Pattern
Absicht Ein Objekt soll sein Verhalten ändern können, wenn sein Zustand sich
ändert. Motivation
Beispiel: Implementation vonTCP/IP
TCPConnection
open()close()acknowledge()
TCPState
open()close()acknowledge()
TCPClosed
open()close()acknowledge()
TCPListen
open()close()acknowledge()
TCPEstablished
open()close()acknowledge()
state -> open()
state
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-95 R O O T S
Das State Pattern
Anwendbarkeit Das Verhalten eines Objekts hängt von seinem Zustand ab viele Fallunterscheidungen, die zustandsabhängig ein Verhalten
auswählen Struktur
Context
request()
State
handle()
ConcreteStateC
handle()
ConcreteStateB
handle()
ConcreteStateA
handle()
state
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-96 R O O T S
Implementation des State Patterns
Definition der Zustandsänderungen Zustandsänderungen werden entweder im Kontext definiert ... oder (flexibler) in den Zustandsobjekten
Erzeugung von Zustandsobjekten Zustandsobjekte werden entweder einmal für den gesamten Programmlauf
erzeugt, .... oder jedesmal bei Bedarf
Verwendung von Delegation oder dynamischen Klassenänderungen in Self und Lava kann das State Pattern direkt ausgedrückt werden
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-97 R O O T S
Das State Pattern: Konsequenzen
Modularisierung Zustandabhängiges Verhalten in eigene Klassenhierarchie ausgelagert zusammengehörige Methoden werden nach Zuständen getrennt
Explizitheit Zustandsänderungen werden explizit gemacht
Thread-Safety Zustandsänderungen sind atomar (eine Zuweisung)
Wiederverwendung Zustandsobjekte können evtl. von verschiedenen Kontexten verwendet
werden Erweiterbarkeit
neue Zustände erfordern keine / wenig Änderungen des Kontexts
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-98 R O O T S
Implementation des Strategy und State Patterns Alternativen Schnittstellen zwischen Kontext und Strategien / States
Kontext übergibt alle relevanten Daten an die Strategie-Methode Kontext übergibt this an Strategie-Methode Strategie-Objekt speichert Referenz auf Kontext
Die letzten beiden Varianten sind flexibler sind ähnlich der vorgestellten Simulation von Overriding werfen ähnliche Fragen auf
Typ des übergebenen / gespeicherten "this" Schnittstelle von Kontext und Strategie bzw. State
:Context :State_Nalgorithm(...) algorithm( , ...) ->
trueSelf<- contextXXX()
<- setState()
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-99 R O O T S
Simulation von Overriding: Typ von "trueSelf" = Context
algorithm(trueSelf : Context ) {trueSelf.contextInfo();...
}
statealgorithm()
contextAction()contextInfo()
setState()
Statealgorithm(Context)
Context
:Context :State_Nalgorithm(...) algorithm( , ...) ->
trueSelf<- contextXXX()
<- setState()
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-100 R O O T S
Simulation von Overriding: Typ von "trueSelf" = CInterface
contextAction()contextInfo()
setState()
CInterface
OtherContext
...
...
:Context :State_Nalgorithm(...) algorithm( , ...) ->
trueSelf<- contextXXX()
<- setState()
algorithm(trueSelf : CInterface) {trueSelf.contextInfo();...
}
statealgorithm()
contextAction()contextInfo()
setState()
Statealgorithm(CInterface)
Context
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-101 R O O T S
Vergleich
trueSelf : Context keine Verwendung der Elternhierarchie (States / Strategies / etc.) mit anderen
Context-Typen möglich das ist oft ausreichend
trueSelf : ContextInterface verschiedene Context-Typen die das ContextInterface implementieren sind
möglich flexibler Umstellung Variante 1 Variante 2 ist leicht:
begrenzte Änderung: trueSelf ist nur in der Elternhierarchie und dem Context bekannt mechanische Änderung: suchen und ersetzen Korrektheit: Compiler meldet, falls Ersetzung "Context ContextInterface" zu Typfehlern
führt "Erst einfache Lösung, ändern kann man immer noch." (siehe "Refactoring")
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-102 R O O T S
Abgrenzung Strategy / State: Änderung des Elternobjektes Bei Strategy-Pattern
meist extern veranlasst Z.B. Anwendung bekommt mit, dass Verbindungsqualität schlecht ist, und
weist den Media-Player an, einen schnelleren aber niedrig-qualitativen Video-Rendering-Algorithmus zu nutzen.
Bei State-Pattern meistens intern veranlasst als Teil einer anderen Aktion, möglichst erst am Ende der Aktion! Merke: State-Pattern modelliert oft einen Zustandsautomat. Daher ist klar,
dass hier die Logik der Zustandsübergänge nicht extern bestimmt ist, sondern mit in den Zustands-Klassen modelliert wird „Wenn im Zustand … das Ereignis … auftritt und die Bedingung … wahr ist,
wird die Aktion … durchgeführt und in den Zustand … übergegangen.“ Siehe auch „Event [Condition] / Action“ –Notation in Zustandsdiagrammen
R O O T S
Kapitel 7: Objektentwurf
Auf "Split Objects"-Idee basierende Patterns
3. Simulation von Multipler Vererbung in Java
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-107 R O O T S
Multiple Vererbung in Java
Absicht Interface und Code mehrerer "Oberklassen" wiederverwenden ... obwohl Java nur Einfachvererbung erlaubt
Motivation komplexe Klassen nicht reinmplementieren
Anwendbarkeit Interface und Code mehrerer "Oberklassen" wiederverwenden keine semantischen Konflikte zwischen "Oberklassen"-Methoden
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-108 R O O T S
ErsetzbarkeitErsetzbarkeitSubtyping
Multiple Vererbung in Java
Struktur
m()clone()
Super_1f()
clone()
Super_2
clone()Sub
m()clone()
Super_1
f()clone()
Super_2f()
clone()
Sub
f()clone()
<<Interface>>
ISuper_2
Code reuse via
forwarding-Methoden
Overriding via gespeichertem "trueSelf"
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-109 R O O T S
Implementation
Code-Reuse Aggregation und Forwarding protected Methoden der „Oberklasse“ müssen public deklariert werden protected Variablen der „Oberklasse“ brauchen public Zugriffsmethoden
damit sie aus der „Unterklasse“ aufrufbar sind.
Subtyping explizites "Oberklassen-Interface" ... enthält alles was in der Simulation public ist ... wird implementiert von "Oberklasse" und "Unterklasse"
Overriding gespeichertes "trueSelf„ (keine Schnittstellen-Änderung erforderlich)
im Konstruktor übergeben gespeichertes "trueSelf„ ist vom Typ "Oberklassen-Interface"
verschiedene Unterklassen möglich
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-110 R O O T S
Implementation: Probleme
Code-Reuse keine automatische Propagierung von Änderungen des Oberklassen-
Interfaces Schutz von protected-Variablen und -Methoden aufgehoben
Subtyping Ersetzbarkeit von "Unterklasse" und "Oberklasse" für "Oberklassen-
Interface„, aber nicht von "Unterklasse" für "Oberklasse"! globale Änderung von Typdeklarationen erforderlich:
Oberklasse expr;
OberklassenInterface expr; globale Änderung von Zugriffen auf public-Variablen der "Oberklasse"
erforderlich: Oberklasse expr; expr.var;
OberklassenInterface expr; expr.getVar();
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-111 R O O T S
Eiffel: Lösung semantischer Konflikte durch renaming
Java: Semantische Konflikte verhindern Subtyping
Multiple Vererbung: Semantische Konflikte
Super_1::clone is dClone();Super_2::clone is sClone();
deep clone shallow clone
"renaming“ (z.B. in Eiffel möglich)
m()clone()
Super_1f()
clone()
Super_2
Sub
m()clone()
Super_1
f()clone()
Super_2f()
clone()
Sub
f()clone()
<<Interface>>
ISuper_2
kann nicht beides gleichzeitig tun (gleichzeitg sowohl flach
als auch tief Klonen).
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-112 R O O T S
Eiffel: Lösung semantischer Konflikte durch renaming
Java: Semantische Konflikte durch "schlanke interfaces" vorbeugen!
Multiple Vererbung: Semantische Konflikte
Super_1::clone is dClone();Super_2::clone is sClone();
deep clone shallow clone
"renaming“ (z.B. in Eiffel möglich)
m()clone()
Super_1f()
clone()
Super_2
Sub
m()clone()
Super_1
f()clone()
Super_2f()
clone()
Sub
f()clone()
<<Interface>>
ISuper_2
schlanker, da um clone() "abgespeckt"
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-113 R O O T S
Implementation: Fazit
Simulation von „Multipler Vererbung“ ist am leichtesten bei neu entworfenen Programmen
„Multiples Erben" von bestehenden „Oberklassen“ ist unmöglich, wenn nicht vorbereitet aufwendig, wenn es Clients der "Oberklassen" gibt
Vorausschauender Entwurf lohnt sich keine public-Variablen Interfaces statt Klassen in Typdeklarationen "schlanke Interfaces" trueSelf-Parameter / -Variable vorsehen
Beispiel: Klasse "Thread"
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-114 R O O T S
Background: Erzeugung von Threads durch Implementierung des Interface Runnable
Thread-Definition eigene Klasse implementiert Methode run() des Interface Runnable
kannThread-Erzeugung Übergeben einer Runnable-Instanz an Thread-Konstruktor ihre run() -Methode wird vom Thread aufgerufen von beliebiger Oberklasse Thread erben
class MyApplet extends Applet implements Runnable {Thread appletThread;public void run() { ...
}myApplet
appletThread
start() run()
public void start() { appletThread = new Thread(this);appletThread.start();
}}
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-115 R O O T S
Thread-Design als antizipierte multiple Vererbung mit schlankem Interface
Applet::start is start()Thread::start is tstart()
run()
start()Applet
start()run()
Thread
MyApplet
start()Applet
start()run()
Threadstart()run()
Sub
run()
<<Interface>>
Runnable
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-116 R O O T S
Wann ist multiple Vererbung überflüssig?
Wenn nur multiples Subtyping erwünscht (keine Code-Vererbung) lässt sich durch Interfaces erreichen
Wenn kein Subtyping erwünscht z.B. Stack erbt nicht das Listen-Interface ... sondern benutzt eine Liste zur internen Implementierung
Wenn Subtyping von einem schlankeren interface ausreicht z.B. Thread
R O O T S
Kapitel 7: Objektentwurf
Auf "Split Objects"-Idee basierende Patterns
4. Das Decorator Pattern
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-118 R O O T S
Das Decorator Pattern: Motivation
Absicht vorhandenen Objekten zusätzliche Fähigkeiten geben (laut Gamme & al) Fähigkeiten vorhandenr Objekte verändern
Motivation objekt-spezifische Eigenschaften kontext-spezifische Eigenschaften modulare / unvorhergesehene Erweiterung Beispiel: GUI-Elemente
Scrollbars, Rahmen, etc. nur bei Bedarf zu TextView hinzufügen
Some applicationswould benefit fromusing objects tomodel every aspect ofthier functionality, but a naive design approach would beprohibitivelyexpensive.
For example, mostdocument editors
=+
aScrollbarDecorator
+
aBorderDecoratoraTextView
Some applications would benefit from using objects to model every aspect of thier functionality, but a naive design approach would be prohibitively expensive.
For example, most document editors
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-119 R O O T S
Das Decorator Pattern: Idee
Veränderte oder zusätzliche Fähigkeiten ... sind zusätzliche Objekte ... mit erweiterter Schnittstelle ... zwischen ursprünglichem Objekt und Client
Context-spezifische Sicht ... entsteht durch Zugriff über verschiedene Decorators des gleichen
Objekts
aTextView aScrollbarDecorator aBorderDecorator aClient
aBorderDecorator otherClient
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-120 R O O T S
Composite Pattern
Das Decorator Pattern: Klassenhierarchie
Vorschlag aus Gamma & al (für C++)
Decoratordraw()
VisualComponentdraw()
TextViewdraw()
decorated
draw() {decorated.draw()
}
ScrollbarDecoratorscrollPosition
draw()scrollTo()
BorderDecoratorborderWidth
draw()drawBorder()
draw() {super.draw();drawBorder();
}
aTextView aScrollbarDecorator aBorderDecorator aClient
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-121 R O O T S
Das Decorator Pattern: Anwendbarkeit
objekt-spezifische Eigenschaften kontext-spezifische Eigenschaften
vorhandenen Objekten zusätzliche Fähigkeiten geben (laut Gamme & al) wie gesehen
vorhandene Fähigkeiten verändern (schwieriger) zusätzlich objektspezifisches Overriding realisieren
modulare / unvorhergesehene Erweiterung keine Änderung des "Hauptobjekts" erforderlich
wenn Vererbung nicht anwendbar ist
wenn die Identität des "Hauptobjekts" nicht wichtig ist siehe nächste Folie
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-122 R O O T S
Das Decorator Pattern: Konsequenzen
Dynamik unvorhergesehene nachträgliche Erweiterung antizipierte nachträgliche Verhaltensänderung
Kleine Klassen Funktionalität wird incrementell hinzugefügt ... wenn man sie braucht! Kombinationen entstehen dynamisch statt statisch durch Vererbung
Verschiedene Objektidentität Identitäts-Tests (==) durch equals-Methode ersetzen
Viele Objekte leicht zu konfigurieren / anpassen Gesamtverhalten evtl. schwieriger zu durchschauen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-123 R O O T S
Das Decorator Pattern: Implementation
Erweiterung der Eltern-Schnittstelle (VisualComponent) von Elternklasse erben oder ... gleiches Interface implementieren wie Elternklasse
Eltern-Klasse (VisualComponent) "schlankes" Interface
nur was wirklich für alle Unterklassen gilt keine (wenig) Variablen
sonst werden Decorators mit irrelevantem Zustand überfrachtet (via Vererbung) Abstrakte Decorator-Klasse (Decorator)
kann weggelassen werden, wenn es nur einen konkreten Dekorator gibt
TextViewdraw()
VisualComponentdraw()
Decoratordraw()
decorated
VisualComponentdraw()
TextViewdraw()
decoratedDecoratordraw()
VisualInterfacedraw()
...
...
Interface
implementieren
Vererbung
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-124 R O O T S
Decorator
Identität aus Client-Sicht konzeptuell: Eltern-Objekt real: Kind-Objekt
Erweiterung Kind-Objekt erweitert Eltern-
Objekt erweiterte Klasse unverändert
Typ-Konformität Erweiterung muss Subtyp sein
Strategy
Identität aus Client-Sicht konzeptuell: Kind-Objekt real: Kind-Objekt
Erweiterung Eltern-Objekt erweitert Kind-
Objekt erweiterte Klasse verändert
Typ-Konformität Erweiterung hat beliebigen Typ
Decorator versus Strategy
aBorder aText aText aBorder
Erweiterung(Decorator)
erweitertesObjekt
erweitertesObjekt
Erweiterung(Strategy)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-126 R O O T S
Simulation multipler Vererbung versus Decorator Simulation Multipler Vererbung
statisch Kindobjekt hat nach
Initialisierung immer gleiches Elternobjekt
„unshared“ jedes Elternobjekt hat ein
einziges Kindobjekt
Decorator Pattern
statisch Kindobjekt hat nach
Initialisierung immer gleiches Elternobjekt
„shared“ Kindobjekte teilen sich oft ein
Elternobjekt
o1:parentClasssub1:subClass
o2:parentClasssub2:subClass
o1:parentClassd2:Decorator
d3:Decorator2
d1:Decorator
R O O T S
Kapitel 7: Objektentwurf
Erweiterung und Restrukturierung Umsetzung fortgeschrittener
UML-Konzepte in „Kern-UML“ Assotiationen
Assoziationen und AssoziationsklassenUmsetzung von Assoziationen je nach ihrer Multiplizität und Navigierbarkeit
Umsetzung qualifizierter Assoziationen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-128 R O O T S
Assoziationen sind implizite Klassen!
... ihre Elemente
Person*
Ausleihe*
max:Person uml:Buch
tim:Person oop:Buch
xyz:Video
a11:Ausleiheperson = maxgeliehen = uml
Eine Assoziation
Buch Video
Ausleihbares Ding
... können aufgefasst werden als Instanzen einer Klasse "Ausleihe"
a12:Ausleiheperson = maxgeliehen = oop
a13:Ausleiheperson = maxgeliehen = xyz
a22:Ausleiheperson = timgeliehen = oop
a23:Ausleiheperson = timgeliehen = xyz
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-129 R O O T S
UML, statisches Modell: Assoziationsklassen (1) Modellieren komplexe Assoziationen zwischen Klassen
Machen die implizite Klasse explizit wenn zusätzliche Attribute und Operationen der Beziehung modelliert werden müssen.
Beispiel Das Datum der Einstellung (Attribut "dateHired") Der Vorgang der Einstellung (Operation "hire")... sind Eigenschaften der Employment-Beziehung
Assoziationsklasse
Person*employer
0..1 employeeCompany
EmploymentdescriptiondateHiredsalaryhire(Person)promote(Person)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-130 R O O T S
Folgende Struktur auf Instanzenebene ist durch die Modellierung der Beziehung als Assoziationsklasse ausgeschlossen!
UML, statisches Modell: Assoziationsklassen-Constraint Es darf nur eine einzige Ausprägung der Beziehung zwischen zwei
Objekten geben! Z.B.: Eine Person dürfte nicht mehrere Anstellungen bei der gleichen Firma haben
Assoziationsklasse
second : Employment
john : Personibm : Company first : Employment
Person*employer
0..1 employeeCompany
EmploymentdescriptiondateHiredsalary
hire(Person)promote(Person)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-131 R O O T S
UML: Assoziation als eigenständige Klasse Alternative Modellierung: eigenständige Klasse statt
Assoziationsklasse Es kann nun beliebig viele Employment-Instanzen zwischen einer Person-Instanz
und einer Company-Instanz geben Mit anderen Worten: Jede Person kann beliebig oft in der gleichen Firma arbeiten
Person11
Company
EmploymentdescriptiondateHiredsalary
hire(Person)promote(Person)
**
eigenständige Klasse
Folgende Struktur auf Instanzenebene ist durch die Modellierung der Beziehung als eigenständige Klasse möglich!
john : Personibm : Company
first : Employment
second : Employment
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-132 R O O T S
UML: Assoziation als eigenständige Klasse (2) Alternative Modellierung: eigenständige Klasse statt
Assoziationsklasse
Person11
Company
EmploymentdescriptiondateHiredsalaryhire(Person)promote(Person)
/employer
**
*0..1
Neben-Effekt "employer"-Rolle kann nun abgeleitet werden ... müsste eigentlich nicht mehr explizit angegeben werden ... außer zur Festlegung des Rollen-Namens "employer"
Notation für abgeleitete Rolle
eigenständige Klasse
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-133 R O O T S
UML: Vergleich der Alternativen
Fallbeispiel 1: Jede Person hat pro Fähigkeit nur eine Kompetenz “Competency” als Assoziationsklasse
Person11
Company
EmploymentdescriptiondateHiredsalary
hire(Person)promote(Person)
**
Competencylevel
Person*
*Skill
Fallbeispiel 2: Eine Person hat in verschiedenen Arbeitsperioden unterschiedliche Jobs. “Employment” als eigenständige Klasse
R O O T S
Kapitel 7: Objektentwurf
Implementierung von Assoziationen
1:1, unidirektional oder bidirektional1:N, unidirektional oder bidirektional
N:M bidirektional
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-135 R O O T S
UML: Assoziationen (Implementations-Sicht)
Varianten je nach Navigierbarkeit (uni-/bidirektional) und Kardinalität (1/*) s. nächste Folien.
Person*employer
* works-for employee
Employer-Rolle von Company in Beziehung zu Personfindet sich oft als Variablenname in der Implementierung von Person wieder:
class Person { Company[] employers;
}
Beziehungen mit unbegrenzter Kardinalität werden durch passende
"Collection"-Typen implementiert (Array, Vector, etc.).
Company
Navigations-Hinweis• in Implementations-Sicht• Hier: direkter Zugriff nur
von Person auf Company
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-136 R O O T S
Unidirektionale Assoziation (1:1,N:1,1:N)
Unidirektionale Assoziationen sind einfach: Assoziation durch Instanzvariable in der „referenzierenden“ Klasse ersetzen. Falls die Kardinalität auf der „referenzierten“ Seite N >1 ist, sollte die Instanzvariable
eine Collection sein. Falls die Kardinalität auf der „ referenzierten“ Seite 1 ist braucht man keine
Collection (unabhängig von der Kardinalität der „referenzierenden“ Seite!)
Zoom_Aktion
zielKarte:Karte
Karte
Zoom_Aktion11
KartezielKarte
Objektentwurfsmodell vor der Transformation
Objektentwurfsmodell nach der Transformation
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-137 R O O T S
Bidirektionale 1:1 Assoziation
Zoom_Aktion11
Karte
Zoom_Aktion
-zielKarte : Karte
+karte()+setzeKarte(k:Karte)
Karte
-zoom : Zoom_Aktion
+zoomAktion()+setzeZoomAktion(a:Aktion)
synchronized(this) {zielKarte = k;if (k.zoomAktion() != this)
k.setzeZoomAktion(this);}
synchronized(this) {zoom = a;if (a.karte() != this)
a.setzeKarte(this);}
Objektentwurfsmodell vor der Transformation
Objektentwurfsmodell nach der Transformation
: Zoom_Aktion : KartezielKarte = k;
zoom = a;
Beispiel-Instanziierung nach der Transformation
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-138 R O O T S
Bidirektionale 1:N Assoziation
Zuweisung der Werte für ‚layerElements‘ und ‚containedIn‘ wie bei bidirektionaler 1:1 Assoziation
*1Layer LayerElement
Layer
-layerElements : Set<LayerElement>+elements() : Set<LayerElement>+addElement(le:LayerElement)+removeElement(le:LayerElement)
: Layer : LayerElement...
Objektentwurfsmodell vor der Transformation
Objektentwurfsmodell nach der Transformation
Beispiel-Instanziierung nach der Transformation
LayerElement
-containedIn :Layer
+getLayer() : Layer+setLayer(l)
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-139 R O O T S
Bidirektionale N:M Assoziation (Naive Variante)
Problem 1: Deadlockfreies setzen von Rückreferenzen nicht mehr trivial. Problem 2 (aller bisherigen Varianten): Die Beziehung wird fest in den Klassen
verdrahtet. Das schafft zusätzliche Abhängigkeiten.
Layer LayerElement
: Layer...
Objektentwurfsmodell vor der Transformation
Objektentwurfsmodell nach der Transformation
Beispiel-Instanziierung nach der Transformation
**
Layer
-layerElements : Set<LayerElement>+elements() : Set<LayerElement>+addElement(le:LayerElement)+removeElement(le:LayerElement)
LayerElement
-containedIn : Set<Layer>
+getLayer() : Set<Layer>+addElement(le:Layer)+removeElement(le:Layer)
: LayerElement...
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-140 R O O T S
Bidirektionale N:M Assoziation (Assoziation als Klasse)
Objektentwurfsmodell vor der Transformation
Objektentwurfsmodell nach der Transformation
Layer LayerElement
: Layer : LayerElement
Containment
- Containment[] Elements+ isContained(layer,elem)+ Containment (layer,elem)+ delete(Containment)+ layer() : Layer+ element() : LayerElement
: Containment
Containment : Class
1 111
Beispiel-Instanziierung nach der Transformation
Layer LayerElement**
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-141 R O O T S
Qualifier gehört zur Assoziationen, nicht zu den Partner-Klassen modelliert Indizierung aus Sicht der einen Klasse Effekt: Kardinalität „am anderen Ende“ der Beziehung ist immer 0,1
Entweder gibt es kein passendes Objekt oder es ist durch den Qualifier eindeutig bestimmt
Show
Ticket
vorstellung:Datumplatz:Platz
Qualifizierte Assoziation
0..1
1
Verk
auf
Bank
Person
kontonummer
0..1
*
Kon
to
„qualifier“„qualifier“
Kardinalität nach
Qualifikation
Kardinalität nach
Qualifikation
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-142 R O O T S
Qualifizierte Assoziation: Umsetzung
Der Qualifier „name“ wird zum Schlüssel (“key”) in der Hashtabelle.
nameScenario * 0..1 SimulationRun
Scenario
-runs:Hashtable
+elements()+addRun(simname,sr:SimulationRun)+removeRun(simname,sr:SimulationRun)
SimulationRun
- scenarios:Vector
+elements()+addScenario(s:Scenario)+removeScenario(s:Scenario)
runs
Objektentwurfsmodell nach der Transformation
Objektentwurfsmodell vor der Transformation
R O O T S
Kapitel 7: Objektentwurf
Optimierung des Objektmodells
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-144 R O O T S
Aktivitäten während des Objektentwurfs
1. Schnittstellenspezifikation Spezifikation der Schnittstellen aller Typen (Klassen und Interfaces)
2. Auswahl vorhandener Komponenten Bestimmung von Standardkomponenten zusätzliche Objekte der
Lösungsdomäne 3. Restrukturierung des Objektmodells
Umformen des Objektmodell zur Verbesserung von Verständlichkeit und Erweiterbarkeit
4. Optimierung des Objektmodells Umformen des Objektmodells unter Berücksichtigung von
Performanzkriterien, wie Reaktionszeit (z.B. der Benutzerschnittstelle) oder Speicherbedarf.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-145 R O O T S
Entwurfsoptimierung
Ein Objektdesigner muss einen Ausgleich zischen Effizienz, Klarheit und Allgemeinheit schaffen. Optimierungen machen das Modell undurchsichtiger. Optimierungen machen das Modell weniger erweiterbar, da sie bestimmte
Annahmen voraussetzen.
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-146 R O O T S
Aktivitäten während der Entwurfsoptimierung1. Umordnen der Ausführungsreihenfolge
Eliminiere „tote Pfade“ so früh wie möglich. (Verwende Wissen über Verteilung, Frequenz der Pfadtraversierung)
Grenze Suche so früh wie möglich ein Überprüfe ob die Ausführungsreihenfolge von Schleifen umgekehrt werden
sollte2. Hinzufügen redundanter Assoziationen
Was sind die häufigsten Operationen? (Abfrage von Sensordaten?) Wie häufig werden diese Operationen aufgerufen? (30 mal pro Monat, alle
30 Millisekunden)3. Speichern abgeleiteter Attribute um Rechenzeit zu sparen
Achtung, Redundanz Konsistenzerhaltung erforderlich (z.B. Observer)4. Transformation von Klassen zu Attributen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-147 R O O T S
Implementierung von Klassen der Anwendungsdomäne Attribut oder Assoziation?
Assoziationen durch Attribute ersetzen? Mögliche Entwurfsentscheidungen
Implementiere Entität als eingebettetes Attribut Implementiere Entität als separate Klasse mit Assoziationen zu anderen
Klassen Assoziationen sind flexibler als Attribute, führen aber häufig zu
unnötigen Indirektionen
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-148 R O O T S
Aktivitäten während der Optimierung: Reduzieren von Objekten zu Attributen Verwandle eine Klasse in ein Attribut, wenn get() und set() die einzigen
Methoden sind, die von ihr definiert werden.
Person SocialSecurityID:String
PersonSSN:String
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-149 R O O T S
Entwurfsoptimierungen: Speichern von abgeleiteten Attributen (Zwischen-)speichern abgeleiteter Attribute
z.B.: Definition einer neuen Klasse um Daten lokal zu speichern (Datenbankcache)
Problem von abgeleiteten Attributen Abgeleitete Attribute müssen auf den neusten Stand gebracht werden,
wenn sich der Basiswert ändert. Es gibt drei Möglichkeiten, mit diesem Problem umzugehen:
Expliziter Code: Der Programmierer bestimmt die betroffenen abgeleiteten Attribute (push)
Regelmäßige Neuberechnung: Abgeleitete Attribute werden gelegentlich neu berechnet (pull)
Active value: Ein Attribut kann eine Menge von abhängigen Attributen bestimmen, die automatisch auf den neusten Stand gebracht werden wenn sich der „aktive Wert“ (active value) ändert. (event notification, data trigger)
Aktivitäten während der Optimierung: Teure Operationen erst bei Bedarf
image
1 0..1ImageProxy
filename:Stringwidth()height()paint()
Imagefilename:Stringdata:byte[]width()height()paint()
Imagefilename:Stringwidth()height()paint()
RealImagedata:byte[]width()height()paint()
© 2000-2010 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 7-151 R O O T S
Zusammenfassung
Der Objektentwurf schließt die Lücke zwischen Anforderungen und bestehendem System.
Der Objektentwurf bezeichnet den Prozess, in dem dem Ergebnis der Anforderungsanalyse und des Sysementwurfs Details hinzugefügt und Implementierungsentscheidungen getroffen werden.
Der Objektentwurf beinhaltet1. Die Spezifikation von Schnittstellen (Signaturen, DBC, Behav. Protocols)2. Die Auswahl von Komponenten3. Die Restrukturierung des Objektmodells4. Die Optimierung des Objektmodells