Asif Khan 1SWT Seminar SS 05 – Pattern Creation
Pattern Creation
Seminar Softwaretechnik
Veranstalter : Prof. Dr.-Ing. Stefan Jähnchen Dipl.-Inform. Susanne Jucknath-John
SS 05
29.07.05
Gehalten von Asif Khan
Asif Khan 2SWT Seminar SS 05 – Pattern Creation
Gliederung
● Was ist ein Pattern? - Kurze Einführung● Was ist “Pattern Creation”?● Einführendes Beispiel ● Was ist überhaupt eine Factory? ● Creation Methods und Factory Methods● Abstract and Concrete Factory● Extract Factory, Static Factory Method● Visualisierung ● Fazit und Literatur
Asif Khan 3SWT Seminar SS 05 – Pattern Creation
Einführung
● Ein Entwurfsmuster (engl. design pattern) beschreibt eine Lösung für ein Entwurfsproblem und stellt eine wiederverwendbare Vorlage zur Problemlösung dar.
● Entstanden ist der Ausdruck in der Architektur.
● In den letzten Jahren hat der Ansatz der Entwurfsmuster auch zunehmendes Interesse im Bereich der Mensch-Computer-Interaktion gefunden.
● In den 1970er Jahren hatte Christopher Alexander eine Sammlung von Entwurfsmuster zusammengestellt.
Asif Khan 4SWT Seminar SS 05 – Pattern Creation
Was ist ein Pattern (Muster)
● Pattern bestehen aus drei Teilen– Problem– Lösung– Kontext
● Patterns sind Lösungen zu Problemen in einer Kontext(z.B. Objekt Erzeugung in Java)
● Ein Problem ist das Wichtigste Teil eines Patterns
● Pattern-Sprachen sind Sammlungen von Patterns zu einem gemeinsamen Thema
Asif Khan 5SWT Seminar SS 05 – Pattern Creation
Refactoring to Patterns
● Gemeinsame Ziele– Lesbarkeit– Wartbarkeit
● Lösungsvorschläge– Einsatz von Pattern anstelle normalen
Refactorings– Beispiel: Simplification
● OO-Refactoring– Beispiel: Refactoring der Konstruktoren
Asif Khan 6SWT Seminar SS 05 – Pattern Creation
Pattern Creation
● Multiple Konstruktoren in einer Klasse machen es schwer den richtigen Konstruktor aufzurufen.
● Extract Class - wird benutzt, um die Anzahl der Konstruktoren durch Refactoring zu reduzieren.
● Creation Method – ist entweder eine statische oder eine nicht statische Methode, die ein Objekt erzeugt.
Asif Khan 7SWT Seminar SS 05 – Pattern Creation
Bsp. Creation Method
Loan+ Loan(commitment, riskRating, maturity)+ Loan(commitment, riskRating, maturity, expiry)+ Loan(commitment, outstanding, riskRating, maturity, expiry)+ Loan(capitalStrategy, commitment, riskRating, maturity, expiry)+ Loan(capitalStrategy, commitment, outstanding, riskRating, maturity, expiry)
Loan- Loan(capitalStrategy, commitment, outstanding, riskRating, maturity, expiry)+ createTermLoan(commitment, riskRating, maturity) : Loan+ createTermLoan(capitalStrategy, commitment, outstanding, riskRating, maturity) : Loan+ createRevolver(commitment, outstanding, riskRating, maturity, expiry)+ Loan(capitalStrategy, commitment, riskRating, maturity, expiry)+ Loan(capitalStrategy, commitment, outstanding, riskRating, maturity, expiry)
Asif Khan 8SWT Seminar SS 05 – Pattern Creation
Konstruktor
● Jeder Konstruktor sollte sicherstellen, daß das Objekt vollständig und sinnvoll initialisert ist
● Andersfalls, wirft er eine Exception
● Problem: Viele Klassen verlassen sich darauf, dass die Felder ihrer Instanzen bestimmte Bedingungen genügen Bsp. Lesen einer Datei, wenn es nicht existiert
Asif Khan 9SWT Seminar SS 05 – Pattern Creation
Bsp.: LizenzManager Klasse// unsichere Implementierung: Erzeugung und Initialisierung sind getrennt
public class LizenzManager {
private Date gueltigBis;private String typ;
// Default-Konstruktor wird vom Compiler generiert, und neue// Instanzen werden nicht initialisiert
public boolean istLizenzGueltig () {return gueltigBis.after (new Date ());
}
public String getNachricht () {return "Lizenz " + typ +" gültig bis " + gueltigBis;
}
public void readLizenzDatei (String dateiname) throws IOException{
... // Code zum Einlesen der Lizenzdatei
}}
Asif Khan 10SWT Seminar SS 05 – Pattern Creation
LizenzManager (2)
LizenzManager mgr = new LizenzManager (); try {mgr.readLizenzDatei ("license.dat");}catch (IOException exc) {...}
● Was passiert, wenn beim Lesen der Datei eine Exception auftaucht, so dass das mgr Objekt nur halb initialisiert ist?
● Lösung: Stelle sicher, dass jeder Konstruktor der Klasse das Objekt vollständig initialisiert und andernfalls eine Exception wirft.
Asif Khan 11SWT Seminar SS 05 – Pattern Creation
Erweiterte LizenzManager Klasse// sichere Implementierung: Konstruktor stellt die Initialisierung sicher
public class LizenzManager {private Date _gueltigBis;private String _typ;
// Initialisierender Konstruktor, weil kein Default-Konstruktor erzeugt wird, ist dies der einzige Konstruktor, und // das Objekt wird initialisiert
public LizenzManager (String typ, Date gueltigBis){
_typ = typ;_gueltigBis = gueltigBis;
}
public boolean istLizenzGueltig () {return _gueltigBis.after (new Date ());
}
public String getNachricht () {return "Lizenz " + _typ +" gültig bis " + _gueltigBis;
}
public void readLizenzDatei (String dateiname) throws IOException{
... // Code zum Einlesen der Lizenzdatei}
}
Asif Khan 12SWT Seminar SS 05 – Pattern Creation
Creation Method
● Je mehr Konstruktoren, desto höher ist die Wahrscheinlichkeit den falschen Konstruktor aufzurufen.
● Zusammen mit nicht aufgerufenen Konstruktoren scheint der Code komplizierter zu sein (aus Sicht eines Entwicklers)
● Die “Creation Method” löst solche Probleme● Konstrucktoren können explizit benannt werden
– createTermLoan(......) // Konstruktor von Loan– createRevolver(.....) // Konstruktor von Loan
Asif Khan 13SWT Seminar SS 05 – Pattern Creation
Creation Methods und Factory Methods
● Creation Method – eine statische oder nicht statische Methode, die Objeke einer Klasse erzeugt
● Factory Method – ist eine nicht statische Methode in einer Basis Klasse (Base class) und wird für polymporph creation verwendet
● Alle Factory Methoden sind auch Creation Methoden aber nicht alle Creation Methoden sind auch Factory Methoden
Asif Khan 14SWT Seminar SS 05 – Pattern Creation
Factory : Abstract and Concrete<< interface>>
NodeFactory
createStringNode(...) : StringNode
StandardNodeFactory
createStringNode(...) : StringNode
DecodingNodeFactory
createStringNode(...) : StringNode
return new StringNode(...); return new DecodingStringNode(new StringNode(...));
AbstractFactory
Asif Khan 15SWT Seminar SS 05 – Pattern Creation
Extract Factory
● Eine Klasse mit mehreren Creation Methoden kann die Klasse schnell von seiner Hauptaufgaben ablenken.
● Eine mögliche Refactoring sieht so aus:Loans
Loan
#Loan(...)+newAdvisor(...)+newRCTL(...)+newTermLoan(...)+newVariable(...)+newRevolver(...)
+calcCapital(...)+calcIncome(...)+calcROC(...)+setOutstanding(...)
Loans
LoanFactoryLoan
#Loan(...)+calcCapital(...)+calcIncome(...)+calcROC(...)+setOutstanding(...)
+newAdvisor(...)+newRCTL(...)+newTermLoan(...)+newVariable(...)+newRevolver(...)
Asif Khan 16SWT Seminar SS 05 – Pattern Creation
Static Factory Method
● Oft bieten statische create – Methoden eine bessere Kapselung der Erzeugung von Instanzen als die Konstruktoren
● Problem: Um neue Objekte zu erzeugen, benutzt man das Schlüsselwort “new”. Im folgenden Beispiel wird verschiedene Arten von Personen erzeugt.
Person boss = new Manager ("Bill Gates");
Person mitarbeiter = new Mitarbeiter ("John Smith")
● Es gibt eine Vererbungshierarchie. Manager und Mitarbeiter Klassen sind aus der Klasse Person vererbt
● Das ist aus Perspektive des Creation Interface keine gute Lösung -> mangelnde Übersichtlichkeit
Asif Khan 17SWT Seminar SS 05 – Pattern Creation
Static Factory Method ...
● Lösung: Füge statische create- Methode ein. Die Namen der Methoden können so ausgewählt werden, dass sie den Quellcode zusätzlich Dokumentieren
● Der code, der Objekte erzeugt, kann sich nur auf die Absicht konzentrieren
public class Person {...
public static Person createManager (String name) {
return new Manager (name);}
Asif Khan 18SWT Seminar SS 05 – Pattern Creation
Static Factory Method ...
public static Person createMitarbeiter (String name) {
return new Mitarbeiter (name);}...
}
● Der code sieht jetzt etwas anders aus ....
Person boss = Person.createManager("Bill Gates");
Person mitarbeiter = Person.createMitarbeiter("John Smith");
Asif Khan 19SWT Seminar SS 05 – Pattern Creation
Visualisierung und Creation Pattern
● Bei wenigen Klassen:– UML Klassenmodell (mit Methoden)
● Bei grossen Systemen:– Klassenmodell allgemein als Graph– Knotengröße abhängig von der Anzahl der
Methoden oder der Konstruktoren
Asif Khan 20SWT Seminar SS 05 – Pattern Creation
Visualisierung – Java API
Quelle: swt.cs.tu-berlin.de/lehre/vsp/ss04
Asif Khan 21SWT Seminar SS 05 – Pattern Creation
Fazit
● Patterns sind Lösungen zu Problemen in einer Kontext
● Refactoring spielt eine wichtige Rolle in Softwareentwicklung
● Gemeinsame Ziele sind Wartbarkeit und Lesbarkeit● Eine “Creation Method” ist eine statische / nicht
statische Methode, die Objekte einer Klasse erzeugt
● Factory Methoden sind nicht statische Methoden und werden für polymorph creation verwendet
Asif Khan 22SWT Seminar SS 05 – Pattern Creation
Links und Literatur
● Refactoring To Patterns: Joshua Kerievsky , Addison-Wesley, ISBN 0321213351
● Refactoring Home Page, http://www.refactoring.com
● Eine Pattern Sprache zur Erzeugung von Objekten, Arno Haase Consulting, http://www.haase-consullting .com/veroeffentlichungen/ObjekteErzeugen.pdf