Modellgetriebener Einsatz von Softwareentwurfsmustern / vorgelegt von Dipl.-Inform. Dietrich Travkin ; Betreuer: Prof. Dr. Wilhelm Schäfer und Jun.-Prof. Dr.-Ing. Anthony Anjorin ; Prüfungskommision: Jun.-Prof. Dr.-Ing. Anthony Anjorin (Universität Paderborn), Prof. Dr. Albert Zündorf (Universität Kassel), Prof. Dr. Heike Wehrheim (Universität Paderborn), Dr. Matthias Meyer (Fraunhofer-Institut für Entwurfstechnik Mechatronik IEM), Dr. Stefan Sauer (Universität Paderborn, Software Quality Lab s-lab, Software Innovation Campus Paderborn SICP). Paderborn, 2018
Inhalt
- Titelseite
- Zusammenfassung
- Danksagung
- Inhalt
- Abbildungen
- Tabellen
- 1 Einleitung
- 1.1 Motivation
- 1.2 Ziele und Forschungsfragen
- 1.3 Lösungsansatz
- 1.4 Wissenschaftliche Beiträge und Ergebnisse der Arbeit
- 1.5 Struktur der Arbeit
- 2 Grundlagen
- 2.1 Softwareentwurfsmuster
- 2.1.1 Eigenschaften und Abgrenzung
- 2.1.2 Arten und Sammlungen von Softwareentwurfsmustern
- 2.1.3 Verwendete Begriffe
- 2.2 Modellgetriebene Softwareentwicklung – MDSD
- 2.3 Modelltransformationen
- 2.4 Modellgetriebene Entwicklung mit Klassen- und Story-Diagrammen
- 3 Spezifikation von Entwurfsmustern
- 3.1 Anforderungen
- 3.2 Überblick
- 3.3 Konzeption der Musterspezifikationssprache am Beispiel
- 3.3.1 Was lässt sich formal beschreiben?
- 3.3.2 Wahl der Notation
- 3.3.3 Repräsentation von Implementierungsvarianten
- 3.3.4 Beschreibung, Spezifikation und Implementierungsvarianten von Entwurfsmustern
- 3.4 Design Abstraction Language – Repräsentation eines objektorientierten Softwareentwurfs
- 3.5 Pattern Specification Language – Repräsentation von Variabilität und Regeln
- 3.5.1 Muster, Musterspezifikationen und Musterspezifikationskataloge
- 3.5.2 Set Fragments – Wiederkehrende Entwurfsstrukturen
- 3.5.3 Bedingungen zu Abhängigkeiten und Kopplung
- 3.5.4 Entwurfsaufgaben
- 3.6 Erweiterbarkeit der Musterspezifikationssprache
- 3.7 Einschränkungen
- 3.8 Zusammenfassung und Ausblick
- 4 Modellierung und Visualisierung von Musteranwendungsstellen
- 4.1 Überblick
- 4.2 Pattern Application Language – Erfassung von Korrespondenzen
- 4.3 Rollenzuordnungen in der Musteranwendungssicht
- 4.4 Musterimplementierungen in Klassen- und Story-Diagrammen
- 4.4.1 Entwurfssicht
- 4.4.2 Musterrollen-im-Entwurf-Sicht
- 4.4.3 Musterrollen-im-Entwurf-Ausschnittssicht
- 4.5 Einschränkungen
- 4.6 Zusammenfassung und Ausblick
- 5 Synthese von Musterimplementierungen
- 5.1 Überblick
- 5.2 Beispiel einer Musteranwendung
- 5.3 Rollenzuordnung: Musteranwendung aus Benutzersicht
- 5.4 Auffaltung: Generieren des Anwendungsmodells
- 5.4.1 Anwendungsmodell
- 5.4.2 Ablauf der Rollenzuordnung und Auffaltung
- 5.4.3 Erstellen einer Anwendungsstelle (eines Korrespondenzmodells)
- 5.4.4 Instanziieren eines Anwendungsmodells
- 5.4.5 Ergänzen einer Set-Fragment-Instanz
- 5.5 Übersetzung des Anwendungsmodells in den Entwurf
- 5.5.1 Herausforderungen
- 5.5.2 Wahl der Transformationssprache
- 5.5.3 Aufbau der Transformation
- 5.5.4 Transformationsregeln
- 5.6 Verbleibende, nicht automatisierbare Schritte
- 5.7 Mögliche Anpassungen einer generierten Musterimplementierung
- 5.7.1 Nachträglich zusätzliche Set-Fragment-Instanzen ergänzen
- 5.7.2 Direkte durch indirekte Beziehungen ersetzen
- 5.7.3 Methoden und Referenzen in Vererbungshierarchien verschieben
- 5.8 Einschränkungen
- 5.9 Zusammenfassung und Ausblick
- 6 Validierung der Konsistenz von Musterimplementierungen
- 6.1 Überblick
- 6.2 Abweichungen von Musterspezifikationen aufdecken
- 6.2.1 Vollständigkeit der Rollenzuordnung
- 6.2.2 Einhalten spezifizierter Eigenschaften einer Rolle
- 6.2.3 Konsistenz zu spezifizierten Rollenbeziehungen
- 6.2.4 Konsistenz zum spezifizierten Verhalten
- 6.2.5 Einhalten von Kopplungsrestriktionen
- 6.3 Einschränkungen
- 6.4 Zusammenfassung und Ausblick
- 7 Prototypische Implementierung des Ansatzes
- 7.1 Architektur
- 7.2 Benutzungsschnittstelle am Beispiel einer Observer-Musteranwendung
- 7.3 Herausforderungen, Ergebnisse und Einschränkungen des Prototypen
- 8 Evaluation
- 8.1 Spezifikation von Entwurfsmustern
- 8.2 Werkzeug-gestützte Musteranwendung
- 8.2.1 Eignung des Verfahrens für unterschiedliche Einsatzszenarien
- 8.2.2 Beispiele für Musteranwendungen bei der Entwicklung eines grafischen Petrinetz-Editors
- 8.2.3 Modellgetriebene Entwicklung des JUnit-Frameworks durch inkrementelle Anwendung diverser Muster
- 8.2.4 Fazit
- 8.3 Modellierung und Visualisierung von Anwendungsstellen
- 8.4 Validierung von Anwendungsstellen
- 8.5 Zusammenfassung
- 9 Verwandte Arbeiten
- 9.1 Spezifikation von Entwurfsmustern
- 9.1.1 Mathematisch formale Musterspezifikationen für Beweise
- 9.1.2 Musterspezifikation zwecks Werkzeug-Unterstützung im Forward Engineering
- 9.1.3 Musterspezifikation zwecks Werkzeug-Unterstützung im Reverse Engineering
- 9.2 Dokumentation von Musteranwendungsstellen
- 9.3 Werkzeug-gestützte Musteranwendung
- 9.4 Architektur- und Design-Konformitätsprüfung
- 9.4.1 Konsistenz von Musterimplementierungen im Quellcode
- 9.4.2 Konsistenz von Musterimplementierungen in Entwurfsmodellen
- 9.4.3 Weitere Architektur- und Entwurfskonformitätsprüfungen
- 9.5 Zusammenfassung und Fazit
- 10 Zusammenfassung und Ausblick
- A Musterspezifikationsprache
- A.1 Abstrakte Syntax
- A.2 Konkrete Syntax und Sprachumfang
- A.2.1 DAL: Klassenstrukturen
- A.2.2 DAL: Interaktionen
- A.2.3 DAL: Subsysteme
- A.2.4 PSL: Set Fragments
- A.2.5 PSL: Abhängigkeits- & Kopplungsregeln
- A.2.6 PSL: Entwurfsaufgaben
- A.3 Semantik
- B Musterspezifikationen
- B.1 Spezifikation der Gang-of-Four-Muster
- B.1.1 Erzeugungsmuster (Creational Patterns)
- B.1.2 Strukturmuster (Structural Patterns)
- B.1.3 Verhaltensmuster (Behavioral Patterns)
- B.2 Spezifikation weiterer Entwurfsmuster, Architekturmuster und Idiome
- C Von der Musterspezifikation zur Musterimplementierung
- C.1 Korrespondenzmodell und Anwendungsstelle erstellen
- C.2 Auffaltung
- C.2.1 Erstellen eines initialen Anwendungsmodells (Instanziierung)
- C.2.2 Ergänzen einer Set-Fragment-Instanz (add-Operation)
- C.2.3 Konformität zur formal definierten Semantik von Set Fragments
- C.3 Übersetzung
- D Schrittweise Musteranwendungen im JUnit-Framework
- D.1 Anwendung des Command-Musters vorbereiten
- D.2 Anwenden des Musters Template Method
- D.3 Anwenden der Musters Collecting Parameter
- D.4 Ergänzen einer Fehlerbehandlung
- D.5 Anwenden des Adapter-Musters
- D.6 Anwenden des Musters Pluggable Selector
- D.7 Anwenden des Composite-Musters
- D.8 Vervollständigen der Musteranwendungen durch Hinzunahme einer konkreten Testfallimplementierung
- D.9 Fazit
- E Implementierungsdetails
- Glossar
- Eigene Veröffentlichungen
- Literatur
