Individuelle Erweiterung des generierten Codes 16. Januar 2013
Überblick Welche Möglichkeiten zur individuellen Erweiterung von generiertem Code gibt es? Innerhalb eines Moduls (Klasse) Auf Modulebene (Klassenebene) Welche haben wir schon kennengelernt? Welche Vor- und Nachteile haben diese? Eine Lösung für Xtext/Xtend Taentzer Modellgetriebene Softwareentwicklung 336
Individuelle Codeteile innerhalb Geschützte Bereiche von Klassen Durch Kommentare angezeigte Bereiche, die nicht überschrieben werden Generierte Bereiche Invers zu geschützten Bereichen Außerhalb von generierten Bereichen stehender Code wird nicht überschrieben. Partielle Klassen Verteilung einer Klasse auf mehrere Dateien Taentzer Modellgetriebene Softwareentwicklung 337
Individuelle Codeteile auf Klassen- und Ordnerebene Individuelle Klassen Diese erben von generierten Klassen und werden nicht überschrieben. (Generation gap pattern) Diese delegieren bestimmte Funktionalität an generierte Klassen. Strukturierung der Ordner und des gesamten Projekts nach generiertem und individuellem Code src target-ordner Taentzer Modellgetriebene Softwareentwicklung 338
Beispiel für einen geschützten Bereich Methode mit individuellem Code in EMF: In RaumImpl.java: Taentzer Modellgetriebene Softwareentwicklung 339
Generation Gap Pattern heikobehrens.net handgeschriebene Basisklassen Abstrakte Klassen, die immer generiert werden Konkrete Klassen, die nur generiert werden, wenn sie noch nicht existieren Taentzer Modellgetriebene Softwareentwicklung 340
Beispiel: Individuelle Klassen Lecturer.java: LecturerImpl.java: Taentzer Modellgetriebene Softwareentwicklung 341
Beispiel: Individuelle Klassen LecturerServiceImpl.java: Taentzer Modellgetriebene Softwareentwicklung 342
Beispiel: Getrennte Ordnerstrukturen Standardordnerstruktur für Webanwendungen: Trennung in src- und target-ordner: Taentzer Modellgetriebene Softwareentwicklung 343
Geschützte Bereiche versus individuelle Klassen/Ordner Geschützte Bereiche: Feingranulare Individualisierung Enge Verquickung von generiertem und nicht generiertem Code Anwendungsentwickler sieht den generierten Code. Der generierte Code muss versioniert werden. Individuelle Klassen/Ordner: Individualisierung auf Klassen-/Ordnerebene Klare Trennung von generiertem und individuellem Code Höhere Anzahl von Klassen und Ordnern Generierte Anteile werden eventuell nicht überschrieben, obwohl veraltet (src-once) Taentzer Modellgetriebene Softwareentwicklung 344
Geschützte Bereiche und Xtext/Xtend Designentscheidungen: Welche Codeteile dürfen individuell gestaltet werden? Warum sollen sie nicht modelliert werden? Gibt es einen Parser für die Zielsprache? Sollen geschützte Bereiche mit Ids versehen werden? Wie sollen geschützte Bereiche gekennzeichnet werden? Sollen geschützte Bereiche ein- und ausblendbar sein? Eine Lösung: https://github.com/danieldietrich/xtext-protected-regions Taentzer Modellgetriebene Softwareentwicklung 345
Beispiel für einen geschützten Bereich Methode mit individuellem Code: In Person.java: Ein geschützter Bereich, der mit einer Id versehen und ein- und ausschaltbar ist. Taentzer Modellgetriebene Softwareentwicklung 346
Installation von Xtext Protected Regions Voraussetzung: Eclipse Juno 4.2 und Xtext 2.3 Installation in Eclipse: Help -> Install New Software -> http://danieldietrich.net/protectedregions/updates/releases/current Abhängigkeiten im Require-Bundles zu Manifest.MF hinzufügen: org.eclipse.xtext.builder, net.danieldietrich.protectedregions.core, net.danieldietrich.protectedregions.xtext Taentzer Modellgetriebene Softwareentwicklung 347
Erweiterung der <Projekt>RuntimeModule-Klasse Taentzer Modellgetriebene Softwareentwicklung 348
Hinzufügen der generierten Bereichs im Generator-Template Für Methoden mit individuellem Code im Rumpf Taentzer Modellgetriebene Softwareentwicklung 349
Beispiel: Code-Generierung Modell: Generierter Code mit individuellem Anteil: Taentzer Modellgetriebene Softwareentwicklung 350
Generierte Regionen Erweiterungen Invers zu geschützten Regionen Der Inhalt eines Dokuments ist geschützt bis auf generierte Regionen, die überschrieben werden dürfen. Anschaltbare Regionen Erweiterung der geschützten und generierten Regionen Sie können an- und ausgeschaltet werden. Eine angeschaltete geschützte Region wird geschützt, sonst überschrieben. Erlaubte Ids: Konkatenation von Segmenten, mit. getrennt Ein Segment besteht aus mind. einem Buchstaben, einer Zahl, _ oder $. Taentzer Modellgetriebene Softwareentwicklung 351
Sprachunterstützung Die folgenden Zielsprachen werden unterstützt: Clojure, CSS, HTML, Java, JavaScript, PHP, Ruby, Scala, XML, Xtend2, Xtext Weitere Sprachen können unterstützt werden. Die Notation der Regionen kann individuell angepasst werden. Taentzer Modellgetriebene Softwareentwicklung 352
Zusammenfassung Geschützte Bereiche lassen eine feingranulare Individualisierung des generierten Codes zu. Enge Verquickung von generiertem und manuellem Code. Erbende Klassen ermöglichen eine klare Trennung von generiertem und individuellem Code. Bessere Versionierung Komplexere Dateienstruktur Bei einmaligem Generieren sind Refactorings nötig. Partielle Klassen erlauben einen guten Kompromiss, leider nicht in allen Sprachen. Taentzer Modellgetriebene Softwareentwicklung 353