220 likes | 381 Views
Seminar Softwaretechnik Veranstalter : Prof. Dr.-Ing. Stefan Jähnchen Dipl.-Inform. Susanne Jucknath-John SS 05 29.07.05 Gehalten von Asif Khan. Pattern Creation. Gliederung. Was ist ein Pattern? - Kurze Einführung Was ist “Pattern Creation”?
E N D
Seminar Softwaretechnik Veranstalter : Prof. Dr.-Ing. Stefan Jähnchen Dipl.-Inform. Susanne Jucknath-John SS 05 29.07.05 Gehalten von Asif Khan 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
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.
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
Refactoring to Patterns • Gemeinsame Ziele • Lesbarkeit • Wartbarkeit • Lösungsvorschläge • Einsatz von Pattern anstelle normalen Refactorings • Beispiel: Simplification • OO-Refactoring • Beispiel: Refactoring der Konstruktoren
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.
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)
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
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 } }
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.
ErweiterteLizenzManager 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 } }
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
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
Factory : Abstract and Concrete << interface>> NodeFactory createStringNode(...) : StringNode DecodingNodeFactory StandardNodeFactory createStringNode(...) : StringNode createStringNode(...) : StringNode return new StringNode(...); return new DecodingStringNode(new StringNode(...));
Extract Factory • Eine Klasse mit mehreren Creation Methoden kann die Klasse schnell von seiner Hauptaufgaben ablenken. • Eine mögliche Refactoring sieht so aus: Loans Loans Loan Loan LoanFactory #Loan(...) +newAdvisor(...) +newRCTL(...) +newTermLoan(...) +newVariable(...) +newRevolver(...) +calcCapital(...) +calcIncome(...) +calcROC(...) +setOutstanding(...) #Loan(...) +calcCapital(...) +calcIncome(...) +calcROC(...) +setOutstanding(...) +newAdvisor(...) +newRCTL(...) +newTermLoan(...) +newVariable(...) +newRevolver(...)
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
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); }
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");
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
Visualisierung – Java API Quelle: swt.cs.tu-berlin.de/lehre/vsp/ss04
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
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