Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung...

77
Design und Implementation Tilman Vierhuff 5. August 2004

Transcript of Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung...

Page 1: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Design und Implementation

Tilman Vierhuff

5. August 2004

Page 2: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

2

Was euch heute erwartet

• Richtlinien zu gutem Programmierstil und Effizienz

• Entwurfsmuster

T. Vierhuff: Design und Implementation 5. August 2004

Page 3: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien

Page 4: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 4

Packages

• Sammlung miteinander verwandter Klassen

• Gemeinsame Verwandtschaft (z. B. Unterklassen von

Component in java.awt)

• Gemeinsame Kategorie (z. B. Tokenizer, Iterator,Calendar usw. in java.util)

• Modulartige Kapselung zusammenarbeitender Klassen

• Private Hilfsklassen mit eingeschrankter Sichtbarkeit

T. Vierhuff: Design und Implementation 5. August 2004

Page 5: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 5

Klassen

• Beschreibung von Objekt-Bestandteilen und -Verhalten zur

(evtl. indirekten) Erzeugung von Instanzen

• in Ausnahmefallen zur Sammlung statischer Methoden

(z. B. java.lang.Math)

Interfaces• Implementationsunabhangige Schnittstellen

• ermoglichen moderate Formen der Mehrfachvererbung

• auch als leere Marker-Interfaces (z. B.

java.lang.Cloneable)

T. Vierhuff: Design und Implementation 5. August 2004

Page 6: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 6

Vererbung

• Vererbung in Java bedeutet ist ein

• Negativbeispiele: Vector und Stack

• Anwendung fur◦ Familien verwandter Objekte (AVM, Atom, List, Pair, Coref)

◦ Konkrete Datentypen (List, ArrayList und LinkedList)

◦ Spezialisierung mit zusatzlichen Eigenschaften (Reader,FilterReader, PushBackReader usw.)

◦ Verbergen von Implementationsdetails (Plattformabhangigkeiten)

• Dasselbe gilt fur public-Vererbung in C++

T. Vierhuff: Design und Implementation 5. August 2004

Page 7: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 7

Eigenschaften guter Schnittstellen

• vollstandig: Alle notwendigen Operationen vorhanden

• minimal: nicht durch andere Methoden ersetzbar

(gelegentliche Ausnahme: unterschiedliche Parameter)

• allgemein: Keine uberflussigen Einschrankungen

• parametrisierbar: Wiederverwendbarkeit durch Anpassung

• unabhangig: moglichst wenig Vernetzung mit anderen

Typen (außer vordefinierten)

• abgesichert: Nicht mehr Zugriff gestatten als unbedingt

notwendig

T. Vierhuff: Design und Implementation 5. August 2004

Page 8: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 8

Methoden

• Objektverhalten auf Anfrage von außen

• offentliche Methoden erhalten und hinterlassen das Objekt

immer in konsistentem Zustand

• keine Kettenaufrufe (obj.init(); obj.calculate();obj.finish();); wenn mehrere Schritte notwendig sind,

zusammen kapseln

• Sonderfalle Konstruktoren / Destruktor

• im allgemeinen Beschrankung auf eine Aufgabe

(mehrfache Aufgaben in C++ zum Teil unsicher)

T. Vierhuff: Design und Implementation 5. August 2004

Page 9: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 9

Methoden (II)

• Selectors: Ermittlung von Eigenschaften;

Beispiel: int size()

• Modifiers: Veranderung; Beispiel: void setElementAt()

• Converters: Umwandlung; Beispiel: String toString()

• Iterators: Sonderfall, schrittweises Weiterrucken mit

Ruckgabe; Beispiel: Object next()

• Sonstige, z. B. void printStackTrace(OutputStream)

• Kombination von getX() und setX() im allgemeinen

nicht sinnvoll (= public!)

T. Vierhuff: Design und Implementation 5. August 2004

Page 10: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 10

Bezeichner

• Bezeichner drucken aus, was der Sinn eines Objekts / einer

Methode ist (setElementAt())

• Bezeichner drucken aus, ob Kosten mit einer Methode

verbunden sind (loadLexicon())

• Richtige Interpretationsebene nutzen

(getArrayList() vs. getColors())

• Geschmackssache: Typkennzeichnung (z. B. Zeiger mit p)

• in C++: Wer ist fur dynamische Objekte zustandig?

Namensgebung: T * allocate(), adoptPointer(T *)

T. Vierhuff: Design und Implementation 5. August 2004

Page 11: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 11

Standardmethoden

• Von der Sprache vorgesehene Minimalschnittstelle

• In Java:

String toString nutzlich zum Debuggen

boolean equals(Object) wenn flacher Vergleich zuwenig

int hashCode() gleichzeitig mit equalsObject clone() bei Bedarf

void finalize() ausnahmsweise fur Ressourcen

T. Vierhuff: Design und Implementation 5. August 2004

Page 12: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 12

Generierte Methoden in C++

• vom Compiler automatisch definiert

• bei Member-Zeigern: selbst definieren oder durch privateDeklaration verbieten

Klasse() Defaultkonstruktor

Klasse(const Klasse&)”Copy“-Konstruktor

Klasse& operator=(const Klasse&) Zuweisung

(virtual) ~ Klasse() (virtueller) Destruktor

T. Vierhuff: Design und Implementation 5. August 2004

Page 13: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 13

Generierte Methoden in C++

• vom Compiler automatisch definiert

• bei Member-Zeigern: selbst definieren oder durch privateDeklaration verbieten

Klasse() Defaultkonstruktor

Klasse(const Klasse&)”Copy“-Konstruktor

Klasse& operator=(const Klasse&) Zuweisung

(virtual) ~ Klasse() (virtueller) Destruktor

(fur operator&() und operator&() const ist die

Standarddefinitionen meist adaquat)

T. Vierhuff: Design und Implementation 5. August 2004

Page 14: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 14

Effizienz

• Richtige Wahl der Algorithmen

• Verschachtelte Rekursion und Iteration vermeiden

• Schleifen und Rekursionen”sauber“ halten

• Mehrfachberechnungen vermeiden

• Kleine Verbesserungen:◦ final deklarieren

◦ Einfache Datentypen verwenden

◦ Iteratoren verwenden

◦ Initialisierung statt Zuweisung im Konstruktor

◦ In C++: Temporare Variablen vermeiden

T. Vierhuff: Design und Implementation 5. August 2004

Page 15: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 15

Dynamische Speicherverwaltung

• new sucht und verwaltet passenden Speicher

• Garbage Collector (bzw. delete) gliedert wieder ein

• uberflussige Reservierung und Freigabe vermeiden

• Objekte gleichen Wertes gemeinsam benutzen

• Objekte wiederverwenden und verandern

statt neu anlegen und umkopieren

• Gilt auch fur Stringkonkatenation und dynamische Arrays

• In C++ besonders kritisch: Explizite Speicherverwaltung

T. Vierhuff: Design und Implementation 5. August 2004

Page 16: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 16

Typbestimmung zu Laufzeit

• instanceof und java.lang.reflect (in C++ typeidund dynamic cast<>()) selten sinnvoll◦ nicht einfach erweiterbar

◦ manuelle Wartung notwendig

◦ kostentrachtig

• Eleganter: Wenn moglich, Vererbung und

Methodenredefinition

T. Vierhuff: Design und Implementation 5. August 2004

Page 17: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 17

In C++: inline

• Code wird eingesetzt statt Funktionen aufgerufen

• Nur fur kleinste Methoden sinnvoll

• Codeaufblahung kann erheblichen Overhead verursachen

(Caching, Page faults)

• insbesondere unsinnig bei Konstruktoren

• Methoden mit static-Variablen und virtual-Bindung

konnen nie inline expandiert werden

• Klassenabhangigkeit und offene Implementationsdetails

• nur ein Vorschlag an den Compiler

T. Vierhuff: Design und Implementation 5. August 2004

Page 18: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 18

Exceptions

• Abbruch und Sprung zum nachsten passenden catch

• Verlockend einfach zum Verlassen komplexer

Berechnungen

• Exception zu verstehen als Ausnahmezustand, wenn es

keinen anderen Ausweg gibt (z. B. Konstruktoren)

• Nach Moglichkeit Standard-Exception-Klassen benutzen

• Fangen von Exceptions in sicheren Systemen unbedingt

erforderlich

• Kein catch(Exception) oder gar catch(Throwable)

T. Vierhuff: Design und Implementation 5. August 2004

Page 19: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 19

Unsichere Methode in C++

class Stack{private: T buf[100];

int pos;public: Stack();

void push(const T& t);const T pop();

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 20: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 20

Unsichere Methode in C++

class Stack{private: T buf[100];

int pos;public: Stack();

void push(const T& t);const T pop();

}Stack::Stack(): pos(0){}

T. Vierhuff: Design und Implementation 5. August 2004

Page 21: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 21

Unsichere Methode in C++

class Stack{private: T buf[100];

int pos;public: Stack();

void push(const T& t);const T pop();

}void Stack::push(const T& t){

buf[pos++] = t;}

T. Vierhuff: Design und Implementation 5. August 2004

Page 22: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 22

Unsichere Methode in C++

class Stack{private: T buf[100];

int pos;public: Stack();

void push(const T& t);const T pop();

}T Stack::pop(){ // ??}

T. Vierhuff: Design und Implementation 5. August 2004

Page 23: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 23

Unsichere Methode in C++

class Stack{private: T buf[100];

int pos;public: Stack();

void push(const T& t);const T pop();

}T Stack::pop(){

return buf[--pos];}

T. Vierhuff: Design und Implementation 5. August 2004

Page 24: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 24

Unsichere Methode in C++

class Stack{}T Stack::pop(){

return buf[--pos];}

main(){Stack s;T t;s.push(t);t = s.pop();

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 25: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 25

Unsichere Methode in C++

class Stack{}T Stack::pop(){

return buf[--pos];}

main(){Stack s;T t;s.push(t);t = s.pop(); // Problem bei Exception in Zuweisung!!!

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 26: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 26

Single und Multiple Dispatching

• Aufruf von (virtuellen) Methoden in Java und C++ zur

Laufzeit nur vom Typ des Empfangerobjekts abhangig

• Manchmal Abhangigkeit von mehr Typen erwunscht

• Losung: Mehrfacher Methodenaufruf mit Auflosung eines

Objekts pro Aufruf+ Ubersichtlichkeit

+ Vermeidung expliziter Typanfragen und -konvertierungen

– Bei zusatzlichen Typen Veranderung der Oberklasse

– Hoherer Anfangsaufwand

◦ Aufwand bei Aufruf nicht hoher als fur switch/Konversion

T. Vierhuff: Design und Implementation 5. August 2004

Page 27: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 27

Single Dispatching in Java

abstract class AVM{abstract AVM unify(AVM);

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 28: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 28

Single Dispatching in Java

abstract class AVM{abstract AVM unify(AVM);

}class Atom extends AVM{

String value;AVM unify(AVM that){

if(that instanceof Atom&& ((Atom)that).value.equals(this.value))return this;

return null;}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 29: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 29

Single Dispatching in Java

abstract class AVM{abstract AVM unify(AVM);

}class AttrPair extends AVM{

String attribute;AVM value;AVM unify(AVM that){

if(that instanceof AttrPair&& ((AttrPair)that).attr.equals(attr))return value.unify(((AttrPair)that).value);

return null;}

T. Vierhuff: Design und Implementation 5. August 2004

Page 30: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 30

Double Dispatching in Java

abstract class AVM{abstract AVM unify(AVM);AVM unify(Atom){ return null; }AVM unify(AttrPair){ return null; }AVM unify(List){ return null; }AVM unify(Coref){ return null; }

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 31: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 31

Double Dispatching in Java

abstract class AVM{abstract AVM unify(AVM);AVM unify(Atom){ return null; }// ...

}class Atom extends AVM{

String value;AVM unify(AVM that){ return that.unify(this); }AVM unify(Atom that){

return value.equals(that.value) ? this : null;}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 32: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Implementationsrichtlinien 32

Double Dispatching in Java

abstract class AVM{abstract AVM unify(AVM);AVM unify(AttrPair){ return null; }// ...

}class AttrPair extends AVM{

String attribute;AVM value;AVM unify(AVM that){ return that.unify(this); }AVM unify(AttrPair that){

return attr.equals(that.attr) ?value.unify(that.value) : null;

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 33: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Entwurfsmuster

Page 34: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Entwurfsmuster 34

Entwurfsmuster

• Grundlegende OOP-Designregeln:

◦ Dinge → Objekte

◦ Aktionen → Methoden

◦ Gemeinsamkeiten → Oberklassen

• In großeren Projekten außerdem wichtig: Interaktion zwischen

verschiedenen Klassen und Objekten

• Entwurfsmuster: Typische Ansatze der Modellierung

• Erzeugungsmuster, Strukturmuster, Verhaltensmuster

T. Vierhuff: Design und Implementation 5. August 2004

Page 35: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster

Page 36: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 36

Prototypen (Exemplars)

• Objekterzeugung durch Objekt gleichen Typs

• In Java: Kopieren mit Object clone()

• In C++:”Copy-Konstruktor“ (durch statische Typisierung

eingeschrankt)

• Beispiel: Kopieren von Lexikoneintragen zur Weiterverarbeitung

T. Vierhuff: Design und Implementation 5. August 2004

Page 37: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 37

Prototypen in Java

class Prototype implements Cloneable{public Object clone(){

Object klon;try{

klon = (Prototype) super.clone();}catch(CloneNotSupportedException e){

// kann eigentlich nicht passieren}// hier klassentypische Detailsreturn klon;

}}

T. Vierhuff: Design und Implementation 5. August 2004

Page 38: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 38

Singletons

• Klassen, von denen nur eine einzige Instanz existieren darf

• Beschrankter Zugang zur Konstruktion

• Beispiel: Eindeutige, zentrale Ressourcen, z. B. Datenbank

class Singleton{private static instance = new Singleton();private Singleton(){}public Singleton getInstance(){

return instance;}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 39: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 39

Singletons falsch in C++class Singleton{private:

static Singleton instance;Singleton();

public:static Singleton& getInstance();

};Singleton Singleton::instance;Singleton::Singleton(){}Singleton& Singleton::getInstance(){

return instance;}

Zeitpunkt der Initialisierung von instance undefiniert!

T. Vierhuff: Design und Implementation 5. August 2004

Page 40: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 40

Singletons in C++

class Singleton{private:

Singleton();public:

static Singleton& getInstance();};Singleton::Singleton(){}Singleton& Singleton::getInstance(){

static Singleton instance;return instance;

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 41: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 41

Fabrikmethode (Virtueller Konstruktor)

• Erzeugung von Typen, die erst zur Laufzeit bekannt werden

• Erzeugte Objekte als Ruckgabewerte von Methoden

• Erzeugungsmethode entscheidet uber Wahl des

Konstruktors

• Beschrankter Zugang zur Konstruktion

• Ergebnistyp ist Oberklasse oder -interface des

tatsachlichen Typs

• Beispiel: Einlesen aus Dateien

T. Vierhuff: Design und Implementation 5. August 2004

Page 42: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 42

Fabrikmethode in Java

TokenXXXXXX

������

Number Stringpublic class Token{

protected Token();Token next(PushbackReader r){

char c = s.read();unread(c);if(c>=’0’ && c<=’9’) return new Number(r);else return new Name(r);

}}public class Number extends Token{ ... }public class Name extends Token{ ... }

T. Vierhuff: Design und Implementation 5. August 2004

Page 43: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 43

Fabrikklasse (Abstract Factory, Kit)

• Erzeugung von Objekten, deren Typ geheimgehalten wird

• Erzeugte Objekte als Ruckgabewerte von Methoden

• Sammlung von Erzeugungsmethoden in einem Objekt

• Beschrankter Zugang zur Konstruktion

• Ergebnistyp ist Oberklasse oder -interface des

tatsachlichen Typs

• Benutzercode ist unabhangig vom tatsachlichen Typ der

Objekte

• Beispiel: Hardwareabhangige Spezialisierungen

T. Vierhuff: Design und Implementation 5. August 2004

Page 44: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 44

Fabrikklasse in Java

Objecthhhhhhhhhhhhhhhhhhhh

((((((((((((((((((((

Windowhhhhhhhhhh

((((((((((

LinuxWindow MacWindowButtonhhhhhhhhhh

((((((((((

LinuxButton MacButtonclass Factory{

public Window newWindow(){return new LinuxWindow();

}public Button newButton(){

return new LinuxButton();}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 45: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Erzeugungsmuster 45

Erbauer (Builder)

• Trennung von Reprasentation und Konstruktion

• Zur Kombination komplizierter Konstruktionsalgorithmen

mit unterschiedlichen Reprasentationen

• Konstruktionsalgorithmus wird mit erwunschtem

Reprasentations-Erbauer parametrisiert

• Beispiel: Compiler-Frontend mit unterschiedlichen

Backends; Gleiche Erzeugung des Syntaxbaums mit

variabler Codegenerierung

T. Vierhuff: Design und Implementation 5. August 2004

Page 46: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster

Page 47: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 47

Brucke (Bridge, Handle/Body)

• Entkopplung von Abstraktion und Implementation

• Paar von Klassen fur Interaktion mit Benutzer und

systemabhangiges Verhalten

• Hilft, Neukompilierung zu vermeiden, wenn Schnittstelle

gleich bleibt

• Implizite Fabrikmethode

• Beispiel: Plattformabhangige Grafik (z. B.

java.awt.peer)

T. Vierhuff: Design und Implementation 5. August 2004

Page 48: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 48

Brucke in Java

public class Handle{ // plattformunabhaengigprivate Body body = new Body();public void tuWas(){

body.tuWas();}

}

private class Body{ // plattformabhaengigpublic void tuWas(){

...}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 49: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 49

Proxy (Surrogat)

• Verandert den Zugriff auf ein Objekt

• Als Reprasentation ferner oder teurer Ressourcen

• Erlaubt Lazy Evaluation, Zugriffsschutz

(Parallelverarbeitung, Firewall), Smart Pointer

• Keine veranderte Funktionalitat

T. Vierhuff: Design und Implementation 5. August 2004

Page 50: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 50

Proxy in Java

public class Proxy{private HugeStructure huge;public Object getDetail(){

if(huge==null) huge = new HugeStructure();return huge.getDetail();

}}private class HugeStructure{

Object[] contents = new Object[1000000]Object getDetail(){

return contents[0];}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 51: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 51

Kompositum

• Verwandtschaftsbeziehung von Einzelobjekten und

Containerobjekten

• Gemeinsame abstrakte Oberklasse

• Operationen der Oberklasse

• Beispiel: Dateien und Verzeichnisse

T. Vierhuff: Design und Implementation 5. August 2004

Page 52: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 52

Kompositum in JavaAVMhhhhhhhhhh

((((((((((

Atom Pair Listpublic abstract class AVM{

abstract AVM unify(AVM that);}public class Atom extends AVM{

private final String value;AVM unify(AVM that){ ... }

}public class List extends AVM{

private final ArrayList avms;AVM unify(AVM that){ ... }

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 53: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 53

Fliegengewicht (Flyweight)

• In großer Zahl gemeinsam benutzte Objekte mit wenigen

Eigenschaften

• Beschrankter Zugang zur Konstruktion

• Verhindert Speicherverschwendung

• Verwaltungsaufwand beim”Erzeugen“ bzw. Aufsuchen der

Objekte

• Interne Speicherung in Hashtabelle oder Suchbaum

• Beispiel: Atomare AVMs

T. Vierhuff: Design und Implementation 5. August 2004

Page 54: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 54

Fliegengewicht

public class Atom extends AVM{private final String value;private static final Hashtable atoms = new Hashtable();private Atom(String value){

this.value = value;}public Atom create(String value){

Atom neu = (Atom) atoms.get(value);if(neu==null)

atoms.put(value, neu = new Atom(value));return neu;

}}

T. Vierhuff: Design und Implementation 5. August 2004

Page 55: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 55

Fassade

• Zentrale Schnittstellenklasse fur Packages

• Erleichtert die Handhabung umfangreicher

Utility-Sammlungen

• Verbirgt Implementationsdetails

• Vermindert Abhangigkeiten

• Ahnelt einer Brucke fur ganze Package

T. Vierhuff: Design und Implementation 5. August 2004

Page 56: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 56

Adapter (Wrapper)

• Anpassung der Schnittstellen vorhandener Klassen

• Keine eigene Funktionalitat, nur Weiterleitung

• Nutzlich bei Integration verschiedener Bibliotheken

• In C++ typischer Kandidat fur inline-Methoden

T. Vierhuff: Design und Implementation 5. August 2004

Page 57: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Strukturmuster 57

Decorator

• Dynamische Erweiterung von Objekten zur Laufzeit

• Vorgeschaltete Objekte schalten Zusatze ein, um und aus

• Decorator-Klassen von dekorierten Klassen abgeleitet

• Beispiele: Graphische Anzeigen, Streamklassen (java.io)

T. Vierhuff: Design und Implementation 5. August 2004

Page 58: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster

Page 59: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 59

Beobachter (Observer)

• Objekte, die vom Zustand anderer Objekte abhangen

• Anmeldung im beobachteten Objekt

• Automatische Nachrichten bei relevanten Veranderungen

• Abhangigkeiten werden automatisiert

• Sinnvoll in großen, verteilten Anwendungen

• Beispiel: Mehrere Darstellungen derselben Daten

T. Vierhuff: Design und Implementation 5. August 2004

Page 60: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 60

Observer in Java

public class Data extends java.util.Observable{public void commitChanges(){

setChanged();notifyObservers();

}}public class Viewer implements java.util.Observer{

public Viewer(Data data){data.addObserver(this);

}public void update(Observable o, Object arg){

System.out.println(o.toString());}

T. Vierhuff: Design und Implementation 5. August 2004

Page 61: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 61

Iterator

• Durchlaufen aller Elemente eines Containers

• Trennt Zugriff von der Datenstruktur

• Erlaubt beliebig viele gleichzeitige Durchlaufe

• Einheitliche, containerunabhangige Schnittstelle

T. Vierhuff: Design und Implementation 5. August 2004

Page 62: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 62

Iterator in Java

public class Container{Object [] inhalt;public Iterator iterator(){

return new java.util.Iterator(){int wo;public boolean hasNext(){

return wo<inhalt.length;}public Object next(){

return inhalt[wo++];} };

}}

T. Vierhuff: Design und Implementation 5. August 2004

Page 63: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 63

Benutzung von STL-Iteratoren in C++

#include<vector>#include<iostream>main(){

std::vector<int> v;for(int i=0; i<10; ++i)

v.push_back(i);std::vector<int>::iterator i=v.begin(), j=v.end();for(; i!=j; ++i)

std::cout<<*i<<" ";std::cout<<std::endl;

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 64: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 64

STL-ahnlicher Iterator (unvollstandig!)class container{private: int inhalt[10];public: class iterator{

private: int *wo;public: iterator(int *w){ wo = w; }

int &operator*(){ return *wo; }void operator++(){ ++wo; }iterator operator++(int){

return iterator(wo++);}

};iterator begin(){ return iterator(inhalt); }iterator end(){ return iterator(inhalt+10); }

T. Vierhuff: Design und Implementation 5. August 2004

Page 65: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 65

Vermittler (Mediator)

• Zentralisierte Kommunikation zwischen großer Anzahl

verschiedener Objekte

• Einheitliches Protokoll

• Mehrfache Abhangigkeiten vereinfacht auf mehrere

Einzel-Beziehungen

• Beispiel: Zentrale Steuerung der Kaffemaschine

T. Vierhuff: Design und Implementation 5. August 2004

Page 66: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 66

Schablone (Template Method)

• Algorithmus mit Spezialisierung durch Untermethoden

• Oberklasse definiert Rahmenhandlung mit abstrakten

Lucken

• Unterklasse fullen abstrakte Lucken durch Uberschreiben

• Typischerweise verwandte Probleme mit gleichem

Verwaltungsaufwand

T. Vierhuff: Design und Implementation 5. August 2004

Page 67: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 67

Schablone in Java

abstract class Find{int[] array;int find(){

for(int i=0; i<array.length; ++i)if(pred(array[i])) return array[i];

return 0;}abstract boolean pred(int);

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 68: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 68

Schablone in Java

abstract class Find{int[] array;int find(){

for(int i=0; i<array.length; ++i)if(pred(array[i])) return array[i];

return 0;}abstract boolean pred(int);

}class FindFive extends Find{

boolean pred(int i){ return i==5; }}

T. Vierhuff: Design und Implementation 5. August 2004

Page 69: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 69

Schablone in Java

abstract class Find{int[] array;int find(){

for(int i=0; i<array.length; ++i)if(pred(array[i])) return array[i];

return 0;}abstract boolean pred(int);

}class FindEven extends Find{

boolean pred(int i){ return i%2==0; }}

T. Vierhuff: Design und Implementation 5. August 2004

Page 70: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 70

Strategie (Policy)

• Familie von Algorithmen mit gleicher Schnittstelle

• Algorithmusobjekte als Parameter anderer Algorithmen

verwendbar

• Algorithmen je nach Bedarf einfach austauschbar

• Nur fur variierendes Verhalten bei gleicher Verwendung

• Beispiel: Zeilenumbruchstrategien, Registerbelegung in

Compilern

T. Vierhuff: Design und Implementation 5. August 2004

Page 71: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 71

Zustand (State)

• Eigenschaften eines Objekts als eigenes Subobjekt

• Zustand als Ganzes austauschbar und wiederherstellbar

• Beispiel: Dialogzustande, Adaption an bestimmte Benutzer

T. Vierhuff: Design und Implementation 5. August 2004

Page 72: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 72

Zustand in Java

class UserModel{String name;Drink favourite;

}class DialogueState{

UserModel um;changeUser(UserModel um){

this.um = um;}

}

T. Vierhuff: Design und Implementation 5. August 2004

Page 73: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Verhaltensmuster 73

Befehl (Command, Action)

• Reprasentation von Benutzerinteraktionen als Objekte

• Weitergabe von Befehlsobjekten zwischen Programmteilen

• Abspeichern von Befehlsobjekten in Datenstrukturen

• Implementation von Undo/Redo

• Protokollieren von Anderungen

T. Vierhuff: Design und Implementation 5. August 2004

Page 74: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Literatur 74

Literatur

• Entwurfsmuster. Elemente wiederverwendbarerobjektorientierter Software von Erich Gamma, Richard

Helm, Ralph Johnson, John Vlissides.

Auch auf englisch erhaltlich. Obwohl ich sonst eher zur englischen

Originalliteratur rate, ist in diesem Fall die deutsche Ubersetzung

empfehlenswert, weil sie nicht nur gut gemacht wurde, sondern

sowohl die englischen Originalbegriffe als auch ihre deutschen

Pendants enthalt

T. Vierhuff: Design und Implementation 5. August 2004

Page 75: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Literatur 75

Literatur

• Fur die, die in C++ programmieren:

Effektiv C++ programmieren und Mehr effektiv C++programmieren von Scott Meyers.

Dringend anzuratende Richtlinien zu gutem Programmierstil in

C++, darunter wirkliche Notwendigkeiten, potentielle

Fehlerquellen, Tips zu Effizienz und Eleganz, alles sehr gut und

ausfuhrlich erklart

T. Vierhuff: Design und Implementation 5. August 2004

Page 76: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Literatur 76

Literatur

• Falls jemand von euch glaubt, sich mit C++ auszukennen:

Exceptional C++: 47 Engineering Puzzles,Programming Problems, and Solutions von Herb

Sutter.

Inzwischen auch auf deutsch ubersetzt, die Ubersetzung kenne ich

aber nicht. Knobelaufgaben mit ausfuhrlich beschriebenen

Losungen, die praktisch jedem beweisen, dass C++ weit weniger

trivial ist als die meisten denken. Wer es durchgearbeitet hat, kann

sich auch am Folgeband versuchen.

T. Vierhuff: Design und Implementation 5. August 2004

Page 77: Tilman Vierhuff - Uni Bremen || Startseite · Implementationsrichtlinien 6 Vererbung • Vererbung in Java bedeutet ist ein • Negativbeispiele: Vector und Stack • Anwendung f¨ur

Viel Erfolg!