Design Patterns und C# - UML - Teil2 - Claude Eisenmann 4. August 2005
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Inhaltsverzeichnis • Rückblende • Design Patterns – Creational Patterns – Structural Patterns – Behavioural Patterns – Architectural Patterns • Umwandlung von UML nach C# – Statische Struktur – Beziehungen – Interaktion • Beispiel
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 Beschreibung Name Alle Patterns haben eindeutige Namen Zweck Zweck des Patterns Synonyme Andere bekannte Namen des Patterns Problem (Hinter-)Gründe für den Einsatz des Patterns Lösung Beschreibung der allgemeinen Struktur des Musters
Design Patterns – Einleitung Eigenschaft Beschreibung Beteiligte Akteure Klassen, die an dem Muster beteiligt sind Zusammenspiel Zusammenspiel der beteiligten Klassen Konsequenzen Welche Vor- und Nachteile gibt es? Implementierung Praxisrelevante Tipps, Tricks und Techniken sowie Warnung vor Fehlern, die leicht passieren können Beispielcode Quellcodefragment, das den Einsatz des Patterns zeigt Praxiseinsatz Wo wird das Muster bereits eingesetzt? Querverweise Wie spielt das Muster mit anderen Mustern zusammen?
Design Patterns – Einleitung • Beispiel: Eigenschaft Beschreibung Name Wartesaal Zweck Zweck des Patterns Problem Wir müssen warten Lösung Immer gemütlich und angenehm Beteiligte Akteure Stuhl, Tisch, Magazin, … Zusammenspiel Konsequenzen Aktive oder passive Wartezeit? Ablenkung? Praxiseinsatz Flughafen, Zahnarzt
Design Patterns – Einleitung Klassifizierung • Die GoF klassifiziert die Patterns (insgesamt 23) wie folgt: Creational – Creational Patterns • Abstract Factory, Builder, Prototyp, … – Structural Patterns Structural • Adapter, Bridge, Composite, … – Behavioral Patterns • Chain of Response, Command, Iterator, … Behavioral
Design Patterns Creational Creational Patterns Name Immer Häufig Selten relevant relevant 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 Creational FactoryMethod • 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 Structural Patterns Name Immer Oft relevant Selten relevant 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 Structural Bridge • 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? Ja Ja Gibt es Vorgaben für eine Schnittstelle? Nein Ja Muss Objekt polymorph verwendet werden Nein Möglich können? Ist eine vereinfachte Schnittstelle notwendig? Ja Nein Fazit: das Facade Pattern vereinfacht eine Schnittstelle, während ein Adapter eine bereits bestehende Schnittstelle in eine gewünschte konvertiert
Design Patterns Structural Flyweight • 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 Häufig Selten relevant relevant relevant Chain of responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method
Design Patterns Behavioral Chain of Responsibility • 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 Behavioral Command • 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 Behavioral Mediator • 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 Behavioral Observer • 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 class Observer { { public Subject(){} public Observer(Subject theSubject) { public UpdateDelegate UpdateEvent; theSubject.UpdateEvent += new UpdateDelegate(Handle); public void RaiseEvent1() } { UpdateDelegate ev = UpdateEvent; public void Handle() if (ev != null) ev(); { } Console.WriteLine("Observer - Update"); } } }
Design Patterns Behavioral State • 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 Häufig Selten relevant relevant 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 vonMicrosoft von Microsoft
Design Patterns Methode • Die guten Objekten finden: die Patterns schlagen Abstraktionen vor, die nicht ins Auge fallen – Composite höhereFlexibilität höhere Flexibilität und und – Strategy erneuteEinsatzmöglichkeit Einsatzmöglichkeit erneute – 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 Zusammenfassung • Vorteile – 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# public class Catalog { Klasse …. } abstract public class Person { Abstrakte Klasse …. } interface IDeletable { Schnittstelle void Delete(); } namespace Library { … Package }
Umwandlung in C# – Statische Struktur UML C# public class Person { protected string mName; Attribute private string mFirstName; public int BirthDate; private static mMajorityAge =18; } public class Person { public abstract int Calculate(); public static void SetMajAge(int theAge) { … Operationen } public int Age { get { return … } }
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 public class Customer : Person { Guid mId; .... } class Customer { ... public void Print() { Printer aPrinter = Abhängigkeit 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# public class Man { Rolle Rolle private Womam mWife; } private class Woman { private Man mHusband; Assoziation } public class Person { private Person mChef; }
Umwandlung in C# – Beziehungen UML C# Agregation Genau das gleiche wie für die Assoziation public class Book { private string mTitle; Komposition private class Page { …. } }
Umwandlung in C# – Beziehungen UML C# public class Job { private string mTitle; private float mSalary; Assoziationsklasse 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/seminar- pioniere04/poetzsch-ausarbeitung-gamma.pdf Entwurfmuster: Ausarbeitung von Thomas Pötsch
Kontakt Claude Eisenmann Technischer Architekt E-Mail: claude.eisenmann@tele2.fr
Frage – Antwort
Sie können auch lesen