Design Patterns 3. Juni 2015
Überblick Was sind Design Patterns? Welche Design Patterns gibt es? Wann sollte man Design Patterns einsetzen? Taentzer Softwarequalität 2015 138
Was sind Design Patterns? Muster, die sich im Softwareentwurf bewährt haben Gute Design Patterns entstammen direkt der Praxis. Antwort auf wiederkehrende Probleme im SW-Entwurf kein fertiges Stück Code, das direkt in eigenen Code gesetzt werden kann eher eine Art Schablone für die Lösung eines Problems Kritik: Design Patterns müssen immer wieder neu implementiert werden. Literatur: E.Gamma, R. Helm, R. Johnson, J. Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software(ISBN 0-201- 63361-2), http://en.wikipedia.org/wiki/design_patterns_(book) Taentzer Softwarequalität 2015 139
Sinn und Zweck von Design Patterns Zwecke: Stärkere Modularisierung von Software Integration von unabhängig entwickelten Komponenten Variantenmanagement: Gemeinsamkeiten von Objekten herauskehren, sodass verschiedene Objekte gleich behandelt werden können Arten: Erzeugungsmuster: AbstractFactory, Builder, Singleton, etc. Strukturmuster: Adapter, Decorator, Fassade, Composite, Proxy, etc. Verhaltensmuster: Observer, Visitor, Iterator, Strategy, etc. Taentzer Softwarequalität 2015 140
Patterns zur Objekterzeugung Anforderungen: Das Einlesen soll von der eigentlichen Anwendungslogik getrennt werden. (Warum?) Nutzern einer Komponente sollen keine Implementierungsdetails gezeigt werden. Eine komplexe Objektstruktur soll aus verschiedenen Formaten einlesbar sein. Taentzer Softwarequalität 2015 141
Patterns zur Objekterzeugung Singleton schränkt die Objekterzeugung einer Klasse auf eine Instanz ein. Prototype erzeugt Objekte durch Klonen einer Vorlage, die anschließend modifiziert werden kann. Abstract Factory gruppiert zusammengehörige Objekt-Factories und abstrahiert von diesen. Factory method erzeugt Objekte ohne Spezifikation der erzeugenden Klasse. Builder konstruiert komplexe Objekte separat von ihrer Repräsentation. Derselbe Konstruktionsprozess kann so auf verschiedene Repräsentationen angewendet werden. Taentzer Softwarequalität 2015 142
Beispiel: Ausgabe in verschiedenen Formaten Eine Artikelliste soll im JSON- oder XML-Format ausgegeben werden. Jeder Artikel gehört zu einer Kategorie, hat einen Namen und einen Preis. Es können beliebig viele Kategorien definiert sein. Beispiel für das Builder Pattern Processor process(list<item> list) for (item: list) { switch item.type case ARTICLE: writer.printarticle(item); case CATEGORY: writer.printcategory(item); } writer ItemWriter + printarticle(item i) + printcategory(item i) + getresult(): File JsonWriter XmlWriter Taentzer Softwarequalität 2015 143
Builder Pattern Builder: Schnittstelle für das Erzeugen von Objekten ConcreteBuilder: Konkrete Implementierung der Objekterzeugung en.wikipedia.org/wiki/builder_pattern Taentzer Softwarequalität 2015 144
Patterns für Variantenmanagement Anforderungen: Redundanzen in Programmen sollen reduziert werden, indem Gemeinsamkeiten einer Menge von Objekten herausfaktorisiert und nur an einer Stelle beschrieben werden. Selektion von konkreten Varianten eventuell erst zur Laufzeit Welche Arten von Redundanzen können auftreten? Strukturen gleichartiger Objekte Algorithmen mit verschiedenen Varianten Taentzer Softwarequalität 2015 145
Patterns für Variantenmanagement Ziel: Gemeinsamkeiten von Objekten werden herausgekehrt, sodass verschiedene Objekte gleich behandelt werden können. Superclass: ziehe Gemeinsamkeiten von Objekten in eine gemeinsame Oberklasse Delegation: leite Aufgaben von Klasse A an Klasse B weiter (Abstract) Factory: bündele die Erzeugung von zusammengehörigen Objekten in einer Klasse Composite: behandle Teil- Ganzes-Hierarchien, atomare und komponierte Objekte werden gleichartig behandelt Strategy: erstelle eine gemeinsame Schnittstelle für verschiedene Varianten von Algorithmen Decorator Pattern: füge zusätzliche Funktionalität während der Laufzeit zu Taentzer Softwarequalität 2015 146
Delegation Pattern Beispiel: Wie kann man einen Stack implementieren? Client stack Stack push() pop() list List add() remove() Ein Objekt zeigt Funktionalität nach außen, die es intern an andere delegiert. ein grundlegendes Pattern zur Abstraktion von Implementierungen Taentzer Softwarequalität 2015 147
Beispiel: Strukturierung von graphischen Oberflächen Es soll möglich sein, graphische Sichten hierarchisch aufzubauen. Sichten können Gruppen von Sichten enthalten. Verschiedene Arten von Sichten sollen möglichst flexibel kombinierbar sein. Taentzer Softwarequalität 2015 148
Beispiel: Strukturierung von graphischen Oberflächen Einzelne Sichten und Gruppen von Sichten werden möglichst ähnlich behandelt. Beispiel für das Composite Pattern View display() PrimitiveView ViewGroup Button TextView StackView ListView Taentzer Softwarequalität 2015 149
Composite Pattern Einzelne Instanzen und Gruppen von Instanzen können gleich behandelt werden. Atomic Component Composite Varianten: Es kann verschiedene Arten von atomaren Objekten geben: Unterklassen von Atomic Es kann verschiedene Arten von zusammengesetzten Objekten geben: Unterklassen von Composite Taentzer Softwarequalität 2015 150
Beispiel: Verschiedene Formatierungen derselben Struktur Eine graphische Oberfläche soll in verschiedenen Sichten spezifiziert werden. Eine Formatierung erzeugt eine spezielle Instanz einer Struktur. Taentzer Softwarequalität 2015 151
Beispiel: Verschiedene Formatierungen derselben Struktur Structure strat FormatingStrategy print() Beispiel für das Strategy Pattern TreeFormat XMLFormat GraphicalFormat FormatingStrategy strat; switch output.type case TREE: strat = new TreeFormat(); strat.print(); case XML: //. Taentzer Softwarequalität 2015 152
Strategy Pattern Entkopple die Formatierung von der Struktur Kapselung einer Familie von Algorithmen durch eine Schnittstelle Ein allgemeines Verhalten wird durch konkretes Verhalten spezialisiert. en.wikipedia.org/wiki/strategy_pattern Taentzer Softwarequalität 2015 153
Beispiel: Verschönerung der Benutzerschnittstelle Mögliche Verschönerungen für einen ListView: Trenner zwischen Einträgen Scroll Bar, um lange Listen anzuzeigen Ein Suchfeld Anforderungen: Das Benutzerschnittstellenobjekt soll über die Verschönerungen nichts wissen. Explosion von Klassen vermeiden: Eine Lösung durch Vererbung würde eine Unterklasse per Kombination von Verschönerungen erzeugen. Taentzer Softwarequalität 2015 154
Beispiel für das Decorator Pattern Beispiel: Verschönerung der Benutzerschnittstelle Application lv AbstractListView draw() AbstractListView lv; lv = new SearchDecorator( new ScrollBarDecorator( new ListView)) ListView ListDecorator - decoratedlistview ScrollBarDecorator SearchDecorator Taentzer Softwarequalität 2015 155
Decorator Pattern Das Pattern kann einem Objekt weitere Funktionalität hinzufügen. Alternative zur Vererbung: Unterklassen fügen Funktionalität während der Übersetzung zu. Das Decorator-Pattern kann Objekt während der Laufzeit mit neuem Verhalten versehen. Mehrere Dekorierungen eines Objekts sind möglich. Verschiedene Reihenfolgen werden berücksichtigt. en.wikipedia.org/wiki/decorator_pattern Taentzer Softwarequalität 2015 156
Zusammenfassung Design Patterns kondensieren das Wissen von erfahrenen Softwareentwicklern. Design Patterns tragen konstruktiv zur Qualitätssicherung bei. keine nennenswerte Werkzeugunterstützung Links zu Design Patterns sourcemaking.com/design_patterns Wikipedia-Seiten Nächste Woche: weitere Design Patterns Refactoring to Patterns Taentzer Softwarequalität 2015 157