UML - Teil2 Design Patterns und C# Claude Eisenmann 4. August 2005
Inhaltsverzeichnis Rückblende Design Patterns Creational Patterns Structural Patterns Behavioural Patterns Architectural Patterns Umwandlung von UML nach C# Statische Struktur Beziehungen Interaktion Beispiel
Rückblende
Diagramme der UML 2 Erinnerung
Erinnerung
Erinnerung
Erinnerung
Erinnerung
Design Patterns
Design Patterns Einleitung Definition Ein Design Pattern (oder Entwurfsmuster) beschreibt eine in der Praxis erfolgreiche, generische Lösung für ein mehr oder weniger häufig auftretendes, wiederkehrendes Entwurfsproblem und stellt damit eine wieder verwendbare Vorlage zur Problemlösung dar.
Design Patterns Einleitung Historie Der Architekt Christopher Alexander hatte in den 70er Jahren eine Sammlung von Entwurfsmustern zusammengestellt. In der Architektur hat sich diese Idee jedoch bei weitem nicht so verbreitet wie später in der Softwareentwicklung. Christopher Alexander sagte: patterns are solutions to a problem in a context Christopher Alexander ist der Vater der Design Patterns
Design Patterns Einleitung Was sind Design Patterns? Abstraktion und erneuter Einsatz von gutem OO-Design Dokumentationsmittel Erklären von Entwurfsentscheidungen Benennen und Katalogisieren von häufig auftretenden Entwurfsstrukturen Gemeinsames Vokabular und Kommunikationsmedium (da man abstrakt über eine Softwarestruktur sprechen kann) Unabhängig von der konkreten Programmiersprache Technik für Software-Architektur
Design Patterns Einleitung Was sie NICHT sind Ein Ziegelstein: ein Design Pattern ist von seinem Nutzungskontext abhängig Eine Regel: ein Design Pattern passt sich nicht mechanisch an Eine Methode: hilft nicht bei der Entscheidung, denn: ein Design Pattern ist die Entscheidung Neu: bereits Lao-Tzu (-550 v.chr.) arbeitete mit Patterns
Design Patterns Einleitung GoF GoF (kommt von Gang of Four) steht für Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides. Das GoF-Buch ist ein Standardwerk im Bereich Software Engineering über Entwurfsmuster. Design Patterns Elements of Reusable Object-Oriented Software von E. GAMMA, R. HELM, R. JOHNSON,J. VLISSIDES ISBN 0201633612
Design Patterns Einleitung Dokumentation Die Beschreibung eines Entwurfsmusters durch die GoF folgt diesem Schema: Eigenschaft Name Zweck Synonyme Problem Lösung Alle Patterns haben eindeutige Namen Zweck des Patterns Beschreibung Andere bekannte Namen des Patterns (Hinter-)Gründe für den Einsatz des Patterns Beschreibung der allgemeinen Struktur des Musters
Design Patterns Einleitung Eigenschaft Beteiligte Akteure Zusammenspiel Konsequenzen Implementierung Beispielcode Praxiseinsatz Querverweise Beschreibung Klassen, die an dem Muster beteiligt sind Zusammenspiel der beteiligten Klassen Welche Vor- und Nachteile gibt es? Praxisrelevante Tipps, Tricks und Techniken sowie Warnung vor Fehlern, die leicht passieren können Quellcodefragment, das den Einsatz des Patterns zeigt Wo wird das Muster bereits eingesetzt? Wie spielt das Muster mit anderen Mustern zusammen?
Design Patterns Einleitung Beispiel: Eigenschaft Beschreibung Name Zweck Problem Lösung Beteiligte Akteure Zusammenspiel Konsequenzen Praxiseinsatz Wartesaal Zweck des Patterns Wir müssen warten Immer gemütlich und angenehm Stuhl, Tisch, Magazin, Aktive oder passive Wartezeit? Ablenkung? Flughafen, Zahnarzt
Design Patterns Einleitung Klassifizierung Die GoF klassifiziert die Patterns (insgesamt 23) wie folgt: Creational Patterns Abstract Factory, Builder, Prototyp, Creational Structural Patterns Adapter, Bridge, Composite, Structural Behavioral Patterns Chain of Response, Command, Iterator, Behavioral
Design Patterns Creational Patterns Creational Name Immer relevant Häufig relevant Selten relevant AbstractFactory Builder FactoryMethod Prototyp Singleton
Design Patterns Creational Abstract Factory Die abstract factory findet Anwendung, wenn ein System unabhängig von der Art der Erzeugung seiner Produkte arbeiten soll ein System mit einer oder mehrerer Produktfamilien konfiguriert werden soll eine Gruppe von Produkten erzeugt und gemeinsam genutzt werden soll in einer Klassenbibliothek die Schnittstellen von Produkten ohne deren Implementierung bereitgestellt werden sollen
Design Patterns Abstract Factory Creational
Design Patterns Creational Builder Entwickler verwenden den Builder, wenn zu einem komplexen Objekt unterschiedliche Darstellungen existieren sollen die Konstruktion eines komplexen Objekts unabhängig von der Erzeugung der Bestandteile sein soll
Design Patterns Builder Creational
Design Patterns FactoryMethod Creational Die factory method findet Anwendung, wenn eine Klasse die von ihr zu erzeugenden Objekte nicht erkennen kann die Unterklassen bestimmen, welche Objekte erzeugt werden
Design Patterns FactoryMethod Creational
Design Patterns Creational Prototyp Ein Prototyp findet Anwendung, wenn die Erzeugung weiterer Instanzen einer Klasse teuer ist und sich die Objekte ähneln die zu instanzierenden Klassen erst zur Laufzeit bekannt sind eine Hierarchie von factories parallel zu einer Hierarchie von Produkten vermieden werden soll die Objekte einer Klasse nur wenige Zustandskombinationen einnehmen können
Design Patterns Prototyp Creational Dieses Muster kommt hauptsächlich dann zum Einsatz, wenn die Klassen der zu erzeugenden Objekte erst zur Laufzeit spezifiziert werden, z.b. durch dynamisches Laden.
Design Patterns Creational Singleton Das Einzelstück findet Verwendung, wenn nur ein Objekt zu einer Klasse existieren darf und ein einfacher Zugriff auf dieses Objekt benötigt wird das einzige Objekt durch Unterklassenbildung spezialisiert werden soll Anwendungsbeispiele sind: ein zentrales Protokoll-Objekt, das Ausgaben in eine Datei schreibt Druckaufträge, die zu einem Drucker gesendet werden, sollten nur in einen einzigen Puffer geschrieben werden
Design Patterns Structural Patterns Structural Name Immer relevant Oft relevant Selten relevant Adapter Bridge Composite Decorator Facade Flyweight Proxy
Design Patterns Structural Adapter Der Adapter findet Anwendung, wenn eine existierende Klasse verwendet werden soll, deren Schnittstelle nicht der benötigten Schnittstelle entspricht Im.NET Framework wird das Adapter Pattern in jeder RCW (Runtime Callable Wrapper) verwendet System.String wird durch die RCW in BSTR (für COM) umgewandelt HRESULT (wenn ein Fehler in der COM Bibliothek aufgetreten ist) wird in System.Exception umgewandelt
Design Patterns Adapter Structural
Design Patterns Bridge Structural Problem: normalerweise wird eine Implementierung durch Vererbung der Abstraktion realisiert. Dieses kann jedoch dazu führen, dass in der Vererbungshierarchie sowohl Implementierungen als auch andere abstrakte Klassen zu finden sind. Dieses macht die Vererbungshierarchie unübersichtlich und schwer wartbar
Design Patterns Bridge Structural Lösung: werden die abstrakten Klassen und die Implementierungen in zwei verschiedenen Hierarchien verwaltet, gewinnt die Implementierung an Übersichtlichkeit und zweitens wird die Anwendung unabhängig von dieser
Design Patterns Bridge Structural Eine Brücke findet Anwendung, wenn Abstraktion und Implementierung erweiterbar sein sollen eine dauerhafte Verbindung zwischen Abstraktion und Implementierung verhindert werden soll Änderungen der Implementierung ohne Auswirkungen für den Klienten sein sollen die Implementierung vor dem Klienten verborgen bleiben soll die Implementierung von verschiedenen Klassen gleichzeitig genutzt werden soll
Design Patterns Bridge Structural
Design Patterns Structural Composite Ein Kompositum findet Anwendung, wenn Implementierung von Teil-Ganzes-Hierarchien erfolgt Die Unterschiede zwischen einzelnen und zusammengesetzten Objekten verborgen werden sollen
Design Patterns - Composite Structural
Design Patterns Structural Decorator Die Instanz eines Decorators wird vor die zu dekorierende Klasse geschaltet Der Decorator hat die gleiche Schnittstelle wie die zu dekorierende Klasse Aufrufe an den Decorator werden dann verändert oder unverändert weitergeleitet (Delegation) oder sie werden komplett in Eigenregie verarbeitet Der Decorator ist dabei "unsichtbar", da der Aufrufende gar nicht mitbekommt, dass ein Decorator vorgeschaltet ist
Design Patterns Decorator Structural
Design Patterns Structural Facade Wenn ein Subsystem viele technisch orientierte Klassen enthält, die selten von außen verwendet werden, hilft es, eine Fassade zu verwenden Die Fassade ist eine Klasse mit ausgewählten Methoden, die eine häufig benötigte Untermenge an Funktionalität des Subsystems umfasst Sie vereinfacht den Umgang mit dem Subsystem
Design Patterns Facade Structural
Design Patterns Facade Structural Facade Adapter Gibt es bereits existierende Klassen? Gibt es Vorgaben für eine Schnittstelle? Muss Objekt polymorph verwendet werden können? Ist eine vereinfachte Schnittstelle notwendig? Ja Nein Nein Ja Ja Ja Möglich Nein Fazit: das Facade Pattern vereinfacht eine Schnittstelle, während ein Adapter eine bereits bestehende Schnittstelle in eine gewünschte konvertiert
Design Patterns Flyweight Structural Das Flyweight Pattern findet Anwendung, wenn es eine große Anzahl Objekte gibt, so dass alleine schon die Anzahl zu Problemen führt ein Teil des Zustandes dieser Objekte kann in den Kontext ausgelagert werden nach der Entfernung des Zustandes reduziert sich die Anzahl verschiedener Objekte auf ein überschaubares Maß
Design Patterns Flyweight Structural
Design Patterns Structural Proxy Ein Remote-Proxy ist ein lokaler Stellvertreter für ein Objekt in einem anderen Adressraum. Er wird beispielsweise in Netzwerkanwendungen verwendet Ein virtueller Proxy dient der Verzögerung teurer Operationen auf den Zeitpunkt des tatsächlichen Bedarfs Ein Schutzproxy setzt Zugriffsrechte auf ein Objekt durch Proxies kommen ebenfalls zum Einsatz, um beim eigentlichen Zugriff auf das Objekt weitere Operationen zu binden
Design Patterns Proxy Structural
Design Patterns Behavioral Behavioral Patterns Name Immer relevant Häufig relevant Selten relevant Chain of responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method
Design Patterns Chain of Responsibility Behavioral Vermeide die Kopplung des Auslösers einer Anfrage mit seinem Empfänger, indem mehr als ein Objekt die Möglichkeit erhält, die Aufgabe zu erledigen. Verkette die empfangenden Objekte und leite die Anfrage an der Kette entlang, bis ein Objekt sie erledigt
Design Patterns Command Behavioral Packt einen Befehl in ein Objekt. Dies ermöglicht es, Klienten mit verschiedenen Anfragen zu parametrisieren, Operationen in eine Schlange zu stellen, ein Logbuch zu führen und Operationen rückgängig zu machen
Design Patterns Behavioral Interpreter Überführung einer Grammatik in Objekte zur Konstruktion eines Interpreters. Dieser interpretiert den Kontext.
Design Patterns Behavioral Iterator Ermöglicht den sequentiellen Zugriff auf die Elemente eines zusammengesetzten Objekts, ohne seine Repräsentation offen zu legen
Design Patterns Iterator Behavioral Mit dem.net Framework wird regelmäßig dieses Pattern in der Praxis benutzt: int[ ] values = new int[ ] {1, 2, 3, 4, 5}; foreach(int i in values) { Console.Write(i.ToString() + " "); } = int[] values = new int[] {1, 2, 3, 4, 5}; IEnumerator e = ((IEnumerable)values).GetEnumerator(); while(e.movenext()) { Console.Write(e.Current.ToString() + " "); }
Design Patterns Mediator Behavioral Definiert ein Objekt, welches das Zusammenspiel einer Menge von Objekten in sich vereint. Vermittler verhindern, dass Objekte direkt aufeinander Bezug nehmen (lose Kopplung). Sie ermöglichen, das Zusammenspiel der Objekte von ihnen unabhängig zu variieren
Design Patterns Behavioral Memento Erfasst und stellt den internen Zustand eines Objektes zur Verfügung, so dass das Objekt später in diesen Zustand zurückversetzt werden kann
Design Patterns Observer Behavioral Definiert eine 1-zu-n-Abhängigkeit zwischen Objekten, so daß die Änderung des Zustands eines Objekts dazu führt, daß alle abhängigen Objekte benachrichtigt und automatisch aktualisiert werden
Design Patterns Observer Behavioral Im.NET Framework Die Events sind die Subjects Die Delegates sind die Observers public delegate void UpdateDelegate(); public class Subject { public Subject(){} } public UpdateDelegate UpdateEvent; public void RaiseEvent1() { UpdateDelegate ev = UpdateEvent; if (ev!= null) ev(); } public class Observer { public Observer(Subject thesubject) { thesubject.updateevent += new UpdateDelegate(Handle); } } public void Handle() { Console.WriteLine("Observer - Update"); }
Design Patterns State Behavioral Ermöglicht es einem Objekt, sein Verhalten zu ändern, wenn sein interner Zustand sich ändert. Es wird so aussehen, als ob das Objekt seine Klasse gewechselt hat
Design Patterns Behavioral Strategy Definiert eine Familie von Algorithmen, erfasst jeden einzelnen und macht sie austauschbar. Das Strategiemuster ermöglicht es, den Algorithmus unabhängig von den ihn nutzenden Klienten zu variieren Im.NET Framework: int[] alist = new int[] {5, 8, 47, 3, 789}; alist.sort(anewdefinedcompared);
Design Patterns Strategy Behavioral
Design Patterns Behavioral Template Method Definiert das Skelett eines Algorithmus in einer Operation und delegiert einzelne Schritte an Unterklassen. Die Verwendung einer Template Method ermöglicht es Unterklassen, bestimmte Schritte eines Algorithmus zu überschreiben, ohne seine Struktur zu verändern
Design Patterns Template Method Behavioral
Design Patterns Behavioral Visitor Erfasst eine auf den Elementen einer Objektstruktur auszuführende Operation als ein Objekt. Das Besuchermuster ermöglicht es, eine neue Operation zu definieren, ohne die Klassen der von ihr bearbeiteten Elemente zu verändern
Design Patterns Visitor Behavioral
Design Patterns Architectural Architectural Patterns Name Immer relevant Häufig relevant Selten relevant MVC 3-Tier
Design Patterns Architectural MVC MVC(Model Viewer Controller) ist ein sehr bekanntes Pattern. Dahinter verbirgt sich, daß allgemein beim Arbeiten mit Software drei Blöcke definiert werden, die aus architektonischen Gründen strikt voneinander getrennt werden sollten: Model: steht für das Datenmodell, also die Information und die Struktur, die bearbeitet wird Viewer: hat nur die Aufgabe, den aktuellen Zustand des Models darzustellen. Er trennt die Oberflächengestaltung von den Daten Controller: ist der Teil, der nach einer Benutzeraktion eine Auswertung der Eingaben vornimmt und ggf. die Funktionalität der Applikation aufruft, um das Model zu manipulieren (z.b. neues Objekt anlegen, Daten ändern oder löschen etc.)
Design Patterns - MVC Architectural
Design Patterns Architectural 3-Tier Presentation Layer: accepting user input and generating user output - the User Interface (UI) Business Layer: the processing of business rules and task-specific behavior Data Access Layer: communicating with the physical database using the APIs provided by that database engine
Design Patterns 3-Tier Architectural von Microsoft von Microsoft
Design Patterns Methode Die guten Objekten finden: die Patterns schlagen Abstraktionen vor, die nicht ins Auge fallen Composite Strategy höhere Flexibilität und erneute Einsatzmöglichkeit State
Design Patterns Methode Richtige Granularität auswählen: was soll gruppiert und was getrennt werden? Facade Flyweigth Abstract Factory Builder
Design Patterns Methode Die Schnittstelle spezifizieren: was gehört zum Objekt und was nicht? Memento: speichert die Zustände Decorator: steigert die Schnittstelle Proxy: delegierte Schnittstelle Visitor: fasst die Schnittstellen zusammen Facade: versteckt die komplexe Struktur eines Objekts
Design Patterns Vorteile Zusammenfassung Gemeinsames Vokabular Kapitalisieren von Erfahrung Höhere Abstraktionsebene für eine qualitätssichere Software Architektur Reduziert die Komplexität Richtlinien/Lösungskatalog
Design Patterns Zusammenfassung Nachteile Bemühen um Synthese beim: wieder Erkennen, Abstrahieren, Lehre, Erfahrung die Design Patterns lösen sich im Source Code auf Menge ein paar funktionieren ähnlich viel Verschiedene ein paar Design Patterns basieren auch auf anderen
Design Patterns Zusammenfassung Die Design Patterns sind wie Prosa: Man verwendet sie, ohne dass es einem bewusst ist. Aber wenn es einem dann bewusst wird, denkt man intensiv darüber nach. Claude Eisenmann, August 2005
Umwandlung in C# C#
Umwandlung in C# Statische Struktur Statische Struktur Das Klassendiagramm beschreibt die statische Struktur der Objekte (Klassen) in einem System sowie ihre Beziehungen untereinander. Die statische Struktur besteht aus: Klassen Schnittstellen Attributen Operationen
Umwandlung in C# Statische Struktur UML C# Klasse public class Catalog { }. Abstrakte Klasse abstract public class Person { }. Schnittstelle Package interface IDeletable { void Delete(); } namespace Library { }
Umwandlung in C# Statische Struktur UML C# Attribute Operationen public class Person { } protected string mname; private string mfirstname; public int BirthDate; private static mmajorityage =18; public class Person { } public abstract int Calculate(); public static void SetMajAge(int } public int Age { get { return } theage) {
Umwandlung in C# Beziehungen Die Klasse wird als Rechteck dargestellt. Die Klassen werden durch Linien miteinander verbunden. Diese Linien stellen verschiedene Beziehungstypen dar: Vererbung: stellt eine Verallgemeinerung von Eigenschaften dar: Spezialisierung, Generalisierung Abhängigkeit: Beziehung zwischen zwei Modellelementen, die zeigt, dass eine Änderung in dem einen (unabhängigen) Element eine Änderung in dem anderen (abhängigen) Element notwendig macht
Umwandlung in C# Beziehungen Assoziation: allgemeine Beziehung zwischen zwei Klassen, keine weiteren Aussagen über konkrete Realisierung Aggregation: Ist-Teil-von-Beziehung, kann noch um Multiplizitäten erweitert werden Komposition: stärkere Form der Aggregation, realisiert physikalisches Enthaltensein Assoziationsklasse: ein Modellelement, das sowohl über die Eigenschaften einer Klasse als auch über die einer Assoziation verfügt
Umwandlung in C# Beziehungen UML C# public class Person { } Vererbung Abhängigkeit public class Customer : Person { } Guid mid;... class Customer { }... public void Print() { } Printer aprinter = PrinterFactory.getInstance(); aprinter.print(this.name);...
Umwandlung in C# Beziehungen UML C# public class A1 { } private B1 mb1; public class A2 { } private B2[ ] mb2; Assoziation public class A3 { } private ArrayList B3; public class A4 { } private HashTable B4;
Umwandlung in C# Beziehungen UML C# Rolle Rolle public class Man { } private Womam mwife; Assoziation private class Woman { } private Man mhusband; public class Person { } private Person mchef;
Umwandlung in C# Beziehungen UML C# Agregation Genau das gleiche wie für die Assoziation Komposition public class Book { private string mtitle; private class Page {. } }
Umwandlung in C# Beziehungen UML C# public class Job { private string mtitle; Assoziationsklasse private float msalary; private Company memployer; } private Person memploye;
Umwandlung in C# Interaktion UML C# public class Object1 { } int aint = mobject2.dosomething1(); mobject2.dosomething2(987); public class Object2 { public int DoSomething1() { } } public void DoSomething2(int theparam) { }
Umwandlung in C# Statische Struktur
Beispiel
Beispiel
Beispiel
Beispiel Strategy Die Daten werden durch die FolderStrategy oder FileTypeStrategy gesammelt
Beispiel Observer Beziehung zwischen den Subject (ExplorationStrategy) und den Observer (ExplorationObserver) Wenn die Exploration fertig ist, wird die Anzeige aktualisiert
Beispiel Adapter ListView muss sich nach der Suche aktualisieren Die ListViewAdapter Klasse leitet von der.net ListView ab und hat die Signatur der ExplorationObserver Klasse
Beispiel Template Method Die Template Method ist eine Methode, die abstrakte Methoden aufruft Die abgeleiteten Klassen überschreiben die abstrakten Methoden
Beispiel Singleton SystemIcons ist ein Puffer aller System Icons IconReader liest die Icons vom System, ohne sie zu lagern
Beispiel Wrapper Die Methoden, die Icons lesen, sind in APIs implementiert Der IconReader versteckt die komplexen Aufrufe der APIs Methoden
Bücher Professional UML with Visual Studio.NET von Tony Loton, Kevin McNeish, Andrew Filev ISBN 1861007957 Design Patterns Explained: A New Perspective on Object-Oriented Design von Alan Shalloway, James Trott ISBN 0201715945 UML Distilled 3/e Von Martin Fowler ISBN 0321193687
Webseiten http://de.wikipedia.org/wiki/design_pattern Wikipedia : Entwurfmuster http://www.jeckle.de/uml-glasklar/ Die Internetseiten von dem UML 2 Glasklar Buch http://ebus.informatik.uni-leipzig.de/www/media/lehre/seminarpioniere04/poetzsch-ausarbeitung-gamma.pdf Entwurfmuster: Ausarbeitung von Thomas Pötsch
Kontakt Claude Eisenmann Technischer Architekt E-Mail: claude.eisenmann@tele2.fr
Frage Antwort