1 / 79

Muster in der Software-Technik Vortrag im Informatik-Kolloquium

Muster in der Software-Technik Vortrag im Informatik-Kolloquium. Dr. Andreas Harrer Institut für Informatik Technische Universität München 7. Februar 2002. 2. Muster (patterns) in der Informatik. isEmpty [ ] = True isEmpty _ = False. isEmpty [1,2,3 ] ?. A. Gliederung des Vortrags.

gyala
Download Presentation

Muster in der Software-Technik Vortrag im Informatik-Kolloquium

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Muster in der Software-TechnikVortrag im Informatik-Kolloquium Dr. Andreas Harrer Institut für Informatik Technische Universität München 7. Februar 2002 2

  2. Muster (patterns) in der Informatik isEmpty [ ] = TrueisEmpty _ = False isEmpty [1,2,3 ] ? A

  3. Gliederung des Vortrags • Inhalte und Gliederung der geplanten Vorlesung • Beispiele für die Vorlesungsgestaltung • Klassifikation und Kombination von Mustern • Beispiel: Model-View-Controller-Architekturmuster und Beobachter-Entwurfsmuster • Muster in verschiedenen Phasen der Programmentwicklung • Beispiel: Zustandsmuster in Analyse, Entwurf und Wartung • Einordnung der Vorlesung in die Studienpläne

  4. Gliederung der geplanten Vorlesung • Begriffsklärung: Was ist ein Muster? Beispiele, Definition, Abgrenzung • Kurzeinführung in die Modellierung, objektorientierte Programmierung (Konzepte und Techniken) • Klassifikation und Kombination von Mustern • Verschiedene Arten von Mustern • Verwendung von Mustern in verschiedenen Phasen der Programmentwicklung • Woher kommen Muster? Vorgehensweise und Überblick über das Forschungsfeld • Grenzen, Herausforderungen und Berührung mit anderen Forschungsbereichen

  5. Gliederung der Vorlesung • Begriffsklärung: Was ist ein Muster? Beispiele, Definition, Abgrenzung • Kurzeinführung in die Modellierung, objektorientierte Programmierung (Konzepte und Techniken) • Klassifikation und Kombination von Mustern • Verschiedene Arten von Mustern • Verwendung von Mustern in verschiedenen Phasen der Programmentwicklung • Woher kommen Muster? Vorgehensweise und Überblick über das Forschungsfeld • Grenzen, Herausforderungen und Berührung mit anderen Forschungsbereichen

  6. Literaturempfehlungen • C. Alexander:"The Timeless Way of Building", "A Pattern Language" • E. Gamma et al. (Gang of Four):"Design Patterns" • F. Buschmann et al. (Gang of Five):"Pattern-oriented Software Architecture" • W. Brown et al.:"Anti Patterns" • M. Fowler et al.:"Analysis Patterns"

  7. Grundbegriffe der Vorlesung • Muster • Formalisierung erfolgreichen Problemlösungswissens • Schemata (Templates) • zur einheitlichen Beschreibung von Mustern • Zusammenhänge zwischen Mustern: • Mustersysteme • Mustersprachen Modellierung und Objektorientierung • Generalisierung, Spezialisierung • Polymorphismus • Vererbung vs. Delegation

  8. Schemata (Templates) zur Beschreibung von Mustern • Die meisten Templates beinhalten folgende Rubriken: • Name des Musters • Kontext • Problem • Lösung • zusätzlich: • Einsatzbeispiele • Beziehungen zu anderen Mustern • Codefragmente • Varianten • evtl. Gegenanzeigen

  9. Zustands-Muster (vereinfachtes Schema) • Kontext: Objekte besitzen einen internen Zustand, der sich im Lauf der Zeit wandeln kann und Veränderungen im Verhalten nach außen verursacht • Problem: Ein Objekt soll sein Verhalten verändern, wenn es einen anderen Zustand einnimmt • Lösung: Die Realisierung des unterschiedlichen Verhaltens wird auf entsprechende Objekte ausgelagert, die durch eine abstrakte Oberklasse zu einer Klassenhierarchie zusammengefasst sind. Die Ausführung des Verhaltens wird vom ursprünglichen Objekt an das aktuelle „Zustands-Objekt“ delegiert.

  10. Kontext Zustand dienst() bearbeite() KonkreterZustand1 KonkreterZustand2 bearbeite() bearbeite() aktuellerZustand.bearbeite() Klassendiagramm für das Zustands-Muster aktuellerZustand

  11. Muster im Zusammenhang miteinander: Mustersysteme • Klassifikation von Mustern: Mustersysteme • Granularität (Entitäten) • Systemstruktur: Architekturmuster • Subsysteme: Entwurfsmuster • Sprachspezifische Lösungen: Idiome • Einsatzgebiet • verschiedene Systemklassen (z.B. verteilte Systeme) • Software-Entwicklung (Aktivitäten) • Prozessmuster (Abfolge bestimmter Verfahrensschritte) • Analysemuster (wiederverwendbare Objektstrukturen einer Anwendungsdomäne) • Projektmanagement • Unterrichtung • didaktische Aufbereitung, Verkürzung

  12. Muster im Zusammenhang miteinander: Mustersprachen • Kombination von Mustern: Mustersprachen • Sammlung von Mustern für bestimmte Anwendungsbereiche, die typische Probleme möglichst gut abdeckt • verteilte Systeme • interaktive Systeme • Lehrsysteme • Vorgehensweise: Top-down Entwicklung von Systemen • Einstiegsmuster und Fortsetzungsmuster • Klassifikation der Anforderungen führt zu Einstiegsmuster, das Grobarchitektur vorgibt • Detailanforderungen führen zu Fortsetzungsmustern für Subsysteme

  13. Gliederung des Vortrags • Inhalte und Gliederung der Vorlesung • Beispiele für die Vorlesungsgestaltung • Klassifikation und Kombination von Mustern • Beispiel: Model-View-Controller-Architekturmuster und Beobachter-Entwurfsmuster • Muster in verschiedenen Phasen der Programmentwicklung • Beispiel: Zustandsmuster in Analyse, Entwurf und Wartung • Einordnung der geplanten Vorlesung in die Studienpläne

  14. Fallstudie: Systementwicklung mit Mustersprachen • Problem: Entwicklung einer Textverarbeitung mit Visualisierung verschiedener Aspekte des Textes: • Texteditor • Gliederungssicht • Wort- und Paragraphenzählung • Trennung zwischen Benutzer-interaktiven Teilen (Frontend) und interner Berechnung/Verarbeitung (Backend) • Bei Veränderung des Dokuments sollen alle Aspektsichten aktualisiert werden

  15. Fallstudie: Systementwicklung mit Mustersprachen • Anwendung soll entwickelt werden: Textverarbeitung mit Visualisierung verschiedener Aspekte des Textes: • Texteditor • Gliederungssicht • Wort- und Paragraphenzählung • Trennung zwischen Benutzer-interaktiven Teilen (Frontend) und interner Berechnung/Verarbeitung (Backend) • Bei Veränderung des Dokuments sollen alle Aspektsichten aktualisiert werden

  16. Mustersprache für interaktive Systeme Presentation- Abstraction- Control Model-View-Controller Document-View Mediator Observer Composite

  17. Auswahl des Einstiegsmusters Presentation- Abstraction- Control Model-View-Controller Document-View Zerlegung in mehrschichtigeAnwendungslogik bietet sichnicht an, außerdem führt PACzu komplexer internerKommunikation Mediator Observer Composite

  18. Auswahl des Einstiegsmusters Presentation- Abstraction- Control Model-View-Controller Document-View Keine Unterscheidungzwischen Komponentenzur Eingabe undzur Präsentation Mediator Observer Composite

  19. Auswahl des Einstiegsmusters Presentation- Abstraction- Control Model-View-Controller Document-View GeeignetesEinstiegsmuster fürdiese Anforderungen Mediator Observer Composite

  20. Dokumentmodell-aktuellerText: TextspeichereText() TexteditorSteuerungakzeptiereEingabe() GliederungsSteuerungändereGliederung() Model-View-Controller-Architektur der Textverarbeitung Sicht (view) Modell (model) TexteditorSicht GliederungsSicht ZählungsSicht ZählungsSteuerung Steuerung (controller)

  21. Fallstudie: Systementwicklung mit Mustersprachen • Anwendung soll entwickelt werden: Textverarbeitung mit Visualisierung verschiedener Aspekte des Textes: • Texteditor • Gliederungssicht • Wort- und Paragraphenzählung • Trennung zwischen Benutzer-interaktiven Teilen (Frontend) und interner Berechnung/Verarbeitung (Backend) • Bei Veränderung des Dokuments sollen alle Aspektsichten aktualisiert werden (Erzeuger-Abonnent)

  22. Auswahl des Fortsetzungsmusters Presentation- Abstraction- Control Model-View-Controller Document-View Mediator Observer Composite

  23. Auswahl des Fortsetzungsmusters Presentation- Abstraction- Control Model-View-Controller Document-View Entwurfsmuster fürErzeuger-Abonnent-Interaktion Mediator Observer Composite

  24. b1:Beobachter b2:Beobachter Sequenz-Diagramm für Observer-Entwurfsmuster s:Subjekt benachrichtige() aktualisiere() aktualisiere()

  25. s1:Sicht m:Modell st:Steuerung benachrichtige() s2:Sicht ändereModell() aktualisiere() aktualisiere() Aktualisierung in der MVC-Architektur

  26. Dokumentmodell-aktuellerText: TextspeichereText()benachrichtige()ändereModell() Sichtaktualisiere() modell.ändereModell() Textverarbeitungs-Entwicklung mit Mustersprachen * TexteditorSicht GliederungsSicht ZählungsSicht TexteditorSteuerungakzeptiereEingabe() GliederungsSteuerungändereGliederung() ZählungSteuerung

  27. Dokumentmodell-aktuellerText: TextspeichereText()benachrichtige()ändereModell() Sichtaktualisiere() modell.ändereModell() Textverarbeitungs-Entwicklung mit Mustersprachen Modell-Sicht-Steuerung-Architekturmuster * TexteditorSicht GliederungsSicht ZählungsSicht TexteditorSteuerungakzeptiereEingabe() GliederungsSteuerungändereGliederung() ZählungSteuerung

  28. Dokumentmodell-aktuellerText: TextspeichereText()benachrichtige()ändereModell() Sichtaktualisiere() modell.ändereModell() Textverarbeitungs-Entwicklung mit Mustersprachen Beobachter-Entwurfsmuster Modell-Sicht-Steuerung-Architekturmuster * TexteditorSicht GliederungsSicht ZählungsSicht TexteditorSteuerungakzeptiereEingabe() GliederungsSteuerungändereGliederung() ZählungSteuerung

  29. Gliederung des Vortrags • Inhalte und Gliederung der Vorlesung • Beispiele für die Vorlesungsgestaltung • Klassifikation und Kombination von Mustern • Beispiel: Model-View-Controller-Architekturmuster und Beobachter-Entwurfsmuster • Muster in verschiedenen Phasen der Programmentwicklung • Beispiel: Zustandsmuster in Analyse, Entwurf und Wartung • Einordnung der geplanten Vorlesung in die Studienpläne

  30. Muster in verschiedenen Phasen der SW-Entwicklung • Muster sind häufig nicht auf eine Phase der System-Entwicklung beschränkt, sondern zu unterschiedlichen Zeitpunkten einsetzbar • Beispielsweise Entwurfsmuster: • typischerweise beim System- und detailliertem Entwurf (muster-orientierter Ansatz) • aber auch nachträglich integrierbar, um den Entwurf flexibler und besser erweiterbar zu gestalten (muster-integrierender Ansatz) • Wir wollen dies nun zeigen am Beispiel des Zustands-Musters

  31. Zustands-Muster (vereinfachtes Schema) • Kontext: Objekte besitzen einen internen Zustand, der sich im Lauf der Zeit wandeln kann und Veränderungen im Verhalten nach außen verursacht • Problem: Ein Objekt soll sein Verhalten verändern, wenn es einen anderen Zustand einnimmt • Lösung: Die Realisierung des unterschiedlichen Verhaltens wird auf entsprechende Objekte ausgelagert, die durch eine abstrakte Oberklasse zu einer Klassenhierarchie zusammengefasst sind. Die Ausführung des Verhaltens wird vom ursprünglichen Objekt an das aktuelle „Zustands-Objekt“ delegiert.

  32. Kontext Zustand dienst() bearbeite() KonkreterZustand1 KonkreterZustand2 bearbeite() bearbeite() aktuellerZustand.bearbeite() Klassendiagramm für das Zustands-Muster aktuellerZustand

  33. Zustand1 do/aktionZustand1()do/ausgabeZustand1() Zustand2 do/aktionZustand2()do/ausgabeZustand2() Zustand3 do/aktionZustand3()do/ausgabeZustand3() Fallbeispiel für Problem: Beschreibung eines Automaten a a b b c

  34. Analyse des Automatenbeispiels • Kontext: Der Automat besitzt einen internen Zustand, der sich im Lauf der Zeit wandeln kann und Veränderungen im Verhalten nach außen verursacht • Problem: Ein Automat soll sein Verhalten verändern, wenn er einen anderen Zustand einnimmt • Lösung: Instantiierung des Zustands-Musters

  35. Automat Zustand1 Zustand2 Zustand delta() lambda() lambda() lambda() aktuellerZustand.lambda() Instantiierung des Zustands-Musters für Automaten Automat verändert aktuellen Zustand, das Verhalten(Ausgabe) wird in die Zustandsklasse(n) ausgelagert aktuellerZustand

  36. Implementierung eines Automaten mit Zustands-Muster class Automat { Zustand aktuellerZustand = new Zustand1(); void delta(char eingabe) { if (aktuellerZustand.getState() == Zustand.ZUSTAND1) { if (eingabe == 'a') {aktuellerZustand = new Zustand2();} else if (eingabe == 'b') {aktuellerZustand = new Zustand1();} else if (eingabe == 'c') {aktuellerZustand = new Zustand3();} } //...andere Zustandsverzweigungen aktuellerZustand.lambda(); }//delta }

  37. Integration von Mustern in bestehende Programme • Muster können auch nachträglich in Programme integriert werden • Verhalten des Programms soll dabei nicht verändert werden • So genannte Refactoring-Schritte ermöglichen einfache Programmtransformationen, die das Verhalten bewahren • Durch Kombination von Refactoring-Schritten können (Entwurfs-)Muster eingebaut werden • Fallbeispiel: Integration des State-Patterns in typische Automatenimplementierung

  38. Zustand1 do/aktionZustand1()do/ausgabeZustand1() Zustand2 do/aktionZustand2()do/ausgabeZustand2() Zustand3 do/aktionZustand3()do/ausgabeZustand3() Fallbeispiel: Zustands-Diagramm für einen Automaten a a b b c

  39. Existierende Automatenimplementierung class Automat { static final int ZUSTAND1 = 1; static final int ZUSTAND2 = 2; int aktuellerZustand = ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } ... } ... }//delta }

  40. AutomatZUSTAND1:intZUSTAND2:intaktuellerZustand:intdelta(eingabe:char)AutomatZUSTAND1:intZUSTAND2:intaktuellerZustand:intdelta(eingabe:char) Modell des aktuellen Programms

  41. Integration des Zustands-Musters class Automat { static final int ZUSTAND1 = 1; static final int ZUSTAND2 = 2; int aktuellerZustand = ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } } }//delta }

  42. Integration des Zustands-Musters (Forts.) class Automat { static final int ZUSTAND1 = 1; static final int ZUSTAND2 = 2; int aktuellerZustand = ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } } }//delta } Extrahiere Klasse

  43. AutomatZUSTAND1:intZUSTAND2:intaktuellerZustand:intdelta(eingabe:char)AutomatZUSTAND1:intZUSTAND2:intaktuellerZustand:intdelta(eingabe:char) Modell des aktuellen Programms

  44. AutomatZUSTAND1:intZUSTAND2:intaktuellerZustand:intdelta(eingabe:char)AutomatZUSTAND1:intZUSTAND2:intaktuellerZustand:intdelta(eingabe:char) Modell des aktuellen Programms

  45. ZustandZUSTAND1:intZUSTAND2:int Modell des aktuellen Programms AutomataktuellerZustand:intdelta(eingabe:char) class Zustand { static final int ZUSTAND1 = 1; static final int ZUSTAND2 = 2; }

  46. Integration des Zustands-Musters (Forts.) class Automat { static final int ZUSTAND1 = 1; static final int ZUSTAND2 = 2; int aktuellerZustand = ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } } }//delta }

  47. Integration des Zustands-Musters (Forts.) class Automat { int aktuellerZustand = Zustand.ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == Zustand.ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = Zustand.ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = Zustand.ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } } }//delta }

  48. Integration des Zustands-Musters (Forts.) class Automat { int aktuellerZustand = Zustand.ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == Zustand.ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = Zustand.ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = Zustand.ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } } }//delta }

  49. Integration des Zustands-Musters (Forts.) class Automat { int aktuellerZustand = Zustand.ZUSTAND1; void delta(char eingabe) { if (aktuellerZustand == Zustand.ZUSTAND1) { if (eingabe == 'a') { aktuellerZustand = Zustand.ZUSTAND2; aktionZustand2(); ausgabeZustand2(); } else if (eingabe == 'b') { aktuellerZustand = Zustand.ZUSTAND1; aktionZustand1(); ausgabeZustand1(); } } }//delta } Ersetze Aufzählungdurch Unterklassen

  50. ZustandZUSTAND1:intZUSTAND2:int Modell des aktuellen Programms AutomataktuellerZustand:intdelta(eingabe:char)

More Related