Einfach generieren Susanne Klar, Michael Klar Generative Programmierung verständlich und praxisnah ISBN 3-446-40448-1 Inhaltsverzeichnis Weitere Informationen oder Bestellungen unter http://www.hanser.de/3-446-40448-1 sowie im Buchhandel
Inhalt Vorwort... XI 1 Grundlagen und zentrale Begriffe...1 1.1 Kernphilosophie: Automatisierung... 2 1.1.1 Standardisierung als Voraussetzung... 2 1.1.2 Trennung von Domänen- und Applikations-Entwicklung... 3 1.1.3 Domänenspezifische Erstellung... 4 1.1.4 100% Automatisierung?... 7 1.1.5 Queraspekte... 8 1.1.6 Flexibilität: generativ oder interpretativ... 10 1.1.7 Konsequenzen für das Management... 10 1.1.8 Fazit... 12 1.2 Die Rolle des Modells... 12 1.3 Generatoren... 14 1.3.1 CASE-Tools... 14 1.3.2 Schablonen in Programmiersprachen... 14 1.3.3 Generatorsysteme... 15 2 Applikations- und Domänen-Entwicklung...19 2.1 Kurzeinführung in HuGo... 20 2.2 Fazit und Ausblick... 29 2.3 Übungen... 30 2.3.1 Als Applikations-Entwickler spezifizieren... 31 2.3.2 Als Domänen-Entwickler Anpassungen vornehmen... 31 2.3.3 Anpassung der DSL... 33 3 Gleichförmigkeiten...35 3.1 Schema in Schnittstellenbeschreibung der DSL... 36 3.2 Architektur für verteiltes System... 38 3.3 Referenzimplementierung... 39 3.4 Generator zur Transformation... 41 3.5 Fazit und Ausblick... 45 3.5.1 Ein erstes Prozessmodell... 45 3.5.2 Finden der richtigen DSL... 47 3.5.3 Die Rolle des Modellierers... 48 3.5.4 Validierung des Modells... 49 3.5.5 Vorteile von Generieren... 50 3.5.6 Potenzielle Erweiterungen des Beispiels... 51
VI Inhalt 4 Queraspekte und DRY-Prinzip...53 4.1 Vorbemerkung... 54 4.2 Schritt 1: Basisentwurf Formulareditor... 55 4.2.1 Der Kernaspekt... 56 4.2.2 Die Basiskomponenten... 56 4.2.3 Die Modelldatei... 58 4.2.4 Die Architektur... 60 4.2.5 Referenzimplementierungen & Frames... 63 4.2.6 Fazit und Ausblick... 76 4.2.7 Übungen... 77 4.3 Schritt 2: Vereinfachung des DSL-Modells... 82 4.3.1 Trennung zwischen Applikation und Basiskomponenten... 82 4.3.2 Eine vereinfachte DSL... 85 4.3.3 Umwandeln der vereinfachten DSL in die formular.model... 86 4.3.4 Validierung des DSL-Modells... 90 4.3.5 Fazit und Ausblick... 91 4.4 Schritt 3: Nachträglicher Queraspekt: Tooltipps für Items... 91 4.4.1 Änderungen in der DSL... 92 4.4.2 Änderungen in den Frames... 92 4.4.3 Fazit und Ausblick... 94 4.5 Schritt 4: JUnit-Testfälle für Constraints... 96 4.5.1 Constraint-Mechanismus im Formulareditor... 96 4.5.2 Schematisierung von Testfällen... 97 4.5.3 Kurzeinführung in JUnit... 98 4.5.4 Generierung der JUnit Klasse... 101 4.5.5 Fazit und Ausblick... 104 4.6 Schritt 5: Dokumentation generieren... 105 4.6.1 Schematisierung von Dokumentation... 105 4.6.2 Format der Dokumentation (HTML)... 109 4.6.3 Generierung der Dokumentation... 110 4.6.4 Fazit und Ausblick... 115 4.6.5 Übung: Eigenes Doku-Schema... 118 5 Applikationsnah generieren...119 5.1 Eine DSL für Gebäudelichtsteuerung... 120 5.2 Die Architektur... 122 5.3 Die Referenzimplementierung... 124 5.4 Generator-Frames... 128 5.4.1 Generierung der Steuerungsklassen... 129 5.4.2 Übung: Generierung des Test-Clients... 134 5.5 Fazit und Ausblick... 137 5.5.1 Applikationsnahe DSL... 137
Inhalt VII 5.5.2 Schematisierung und Codeversatzstücke... 137 5.5.3 Ausbau um weitere elektrische Komponenten... 138 5.5.4 UML-Zustandsdiagramme als alternative DSL?... 138 5.5.5 Trennung von Steuerung und Test-Client... 139 5.5.6 Portabilität des Zielcodes... 139 5.5.7 Generativ versus interpretativ... 140 6 Fachwelt rund ums Generieren...141 6.1 Systemfamilien und Produktlinien... 142 6.2 Aspektorientierte Programmierung (AOP)... 145 6.3 Generische Programmierung... 146 6.4 Generative Programmierung (GP)... 147 6.5 Model Driven Architecture (MDA)... 147 6.6 Model Driven Software Developement (MDSD)... 151 6.7 Fazit und Ausblick... 151 6.7.1 UML als Basis für eine DSL?... 151 6.7.2 Modell, Metamodell und Metametamodell: Sinnvolle Abstraktionen... 152 7 Generierungstechniken...155 7.1 Templates für beliebige Zielsprachen... 156 7.1.1 Templates und Filtering... 156 7.1.2 Templates und Metamodell... 158 7.2 Frame-Prozessoren... 160 7.3 API-basierte Generatoren... 161 7.4 Code-Attribute... 162 7.5 Inline-Generierung... 165 7.6 Code-Weaving... 168 7.7 Fazit und Ausblick... 170 8 Engineering...177 8.1 Das Prozessmodell... 178 8.1.1 Trennung von Applikations- und Domänen-Entwicklung... 178 8.1.2 Iterative Entwicklung... 182 8.1.3 Erstellung von Referenzimplementierung und Prototyp... 183 8.1.4 Erstellung von Basiskomponenten... 185 8.2 Dokumentation... 187 8.2.1 Allgemeines zur Dokumentation... 187 8.2.2 Dokumentation der DSL... 188 8.2.3 Dokumentation des Programmiermodells... 189 8.2.4 Dokumentation der Varianten... 189 8.3 Testen... 189
VIII Inhalt 8.3.1 Automatische Tests für Varianten... 190 8.3.2 Test der Transformationsanweisungen des Generators... 191 8.3.3 Akzeptanztest der DSL... 191 8.3.4 Review-Fragen... 192 8.4 Infrastruktur (Make, Debug, Versionierung)... 199 8.4.1 Code-Generierung und Make-Prozess... 199 8.4.2 Debuggen von generiertem Code... 200 8.4.3 Coding-Blöcke und Refaktorisieren... 200 8.4.4 Versionierung der Artefakte... 201 8.5 Generatoren erzeugen Generatoren... 202 9 Management...203 9.1 Das Team... 204 9.1.1 Rollen... 204 9.1.2 Wissen und Fähigkeiten... 207 9.1.3 Psychologische Effekte... 208 9.2 Betriebswirtschaftliche Aspekte... 211 9.2.1 Flexibilität: interpretativ oder generativ... 212 9.2.2 Prinzipielle Einsparungspunkte... 214 9.2.3 Kosten-/Nutzen-Verhältnis erhöhen... 215 9.2.4 Outsourcing und Offshoring... 215 9.3 Risiken und Risikomanagement... 216 9.3.1 Keine saubere Trennung zwischen AE und DE... 216 9.3.2 Falscher Ehrgeiz einer 100%-Generierung... 217 9.3.3 Kein konsequentes, iteratives Vorgehen... 218 9.3.4 Zu wenig Feedback... 219 9.3.5 Überlastete Domänen-Entwickler... 219 9.3.6 Unpassende Architektur... 220 9.3.7 Tool-Zentriertheit... 220 9.3.8 Zu wenig Ausrichtung auf die Domäne... 221 9.3.9 Zu wenig DRY... 221 10 FAQs...223 10.1 Generieren ist doch nicht wirklich neu, oder?... 224 10.2 Wozu generieren, wenn ich Konfigurationsdateien habe?... 224 10.3 Wie zuverlässig ist generierter Code?... 225 10.4 Lohnt sich Generieren auch bei bestehenden Projekten?... 225 10.5 Sollte man anteilige Generierung vermeiden?... 225 10.6 Wo ist der Haken beim Generieren?... 226 10.7 Warum verwenden Sie kein MDA-Tool?... 226 10.8 Welche Tools können Sie empfehlen?... 226 10.9 Warum wird bislang noch so wenig generiert?... 227
Inhalt IX A Theorie und Praxis...229 A.1 Zuordnung Grundprinzipien Kapitel 2 5... 230 A.2 Weitere Beispiele aus dem Web-Umfeld... 232 A.3 Und Ihr Projekt... 234 Literatur...235 Register...237