Generator

Werbung
Wirtschaftsinformatik
Im Rahmen des Seminars „Ausgewählte
Themen des Softwareengineering“
Christian Mehring
[email protected]
29.05.2007
Gliederung
■ Einführung
■ openArchitectureWare
■ Entwicklungsprozess
■ Beispielimplementierung
■ Modellierung
■ Metamodell
■ Modell
■ Modellüberprüfung
■ Generator
■ Code-Integration
■ Fazit
2
openArchitectureWare
■ Generatorframework zur Codeerzeugung aus Modellen
■ Ganzheitliche Unterstützung des Erstellungsprozesses
■ Ansatz: Metamodell + Templates
■ Ziel: Erzeugung von technischem, redundantem Code
 nicht 100% generieren, sondern die „langweiligen“ 50-70%
■ Unterstützung durch Eclipse-Plugins
■ Einsatzbeispiele
■ Webanwendungen
■ Embedded Systeme
■ Wissenschaftliche Anwendungen
3
OAW: Funktionsweise
■ Modell einlesen und überprüfen
■ Codeerzeugung
■ Modell wird an Generator übergeben
■ Template verarbeitet Modellelemente und erstellt Code
EingabeModell
MetamodellKlassen
Parser
MetamodellInstantiator
Templates
MetamodellInstanz
Generierter
Code
Code Generator
openArchitectureWare
Quelle: Stahl, Völter (2005)
4
Entwicklungsprozess
Referenzimplementierung
(Meta-)
Modellierung
Domänenanalytiker
Generatorentwicklung
Domänenarchitekt
Manuelle
Implementierung
Anwendungsentwickler
5
Beispielimplementierung
■ Web-Anwendung zur
Produktbestellung
■ 4-Schichten Architektur
■ Möglichst wenig Code generieren,
vorhandene Funktionalität nutzen
■ Java Enterprise Edition (JEE)
■ Spring Framework, insb. Webflow
■ Was lässt sich generieren?
■ EJB Modell: Datenhaltung, einfache
Geschäftslogik
■ Spring Modell: Konfiguration,
Actionklassen
■ Manuelle Implementierung: JSPs,
erweiterte G‘logik
6
EJB Metamodell
7
EJB Modell
■ Generiert werden hieraus:
■ Entitybeans
■ Sessionbeans mit
Datenmanipulations- und
Lesemethoden für die
referenzierten Entities
8
Spring Konfiguration: Metamodell
View
Zustandsautomat
Daten und
Anbindung G‘logik
9
Unterstützung für die Metamodellierung: xText
Grammatik Metamodell:
Entity :
"entity" name=ID "{"
(features+=Feature)+
"}" ;
Abstract Feature:
Attribute | Reference ;
Attribute :
"attr" type=Datatype name=ID ";" ;
Reference :
"ref" type=ID (multiple?"[]")?
name=ID
("<->" oppositeName=ID)? ";" ;
Grammatik-konformes Modell:
entity Produkt {
attr string name;
attr int preis;
}
entity Bestellung {
attr string datum;
attr int menge;
ref Produkt ware;
}
entity Kunde {
attr int kundennummer;
attr string name;
attr string kennwort;
ref Bestellung[] bestellungen
<-> Bestellung;
}
 erzeugt: Metamodell in Ecore, Parser, Editor, Fehlerprüfung
10
Zugriff auf das Modell: Expressions-Language
■ Wie arbeiten Metamodell und Modell zusammen?
Expressions-Language Elemente:
// Zugriff auf ein Attribut
e.name  bspw. „Kunde“
// Suche in Listen
entities.select(e|e.features.size == 0);
// Nur best. Typ selektieren
features.typeSelect(Attribute);
/* Eigene Expressions definieren */
// Alle Referenzen des Entities
references(Entity this) :
features.typeSelect(Reference);
// Entityname für Javaklassennamen
javaClassname(Entity this) :
name.toFirstUpper();
11
Modellüberprüfung: Check-Language
■ Syntaxfehler werden durch Editor vermieden
■ Überprüfungen auf semantische Beschränkungen:
■ Vom Modellierer festzulegen
■ Verwendet Expressions-Language
■ Vergleichbar mit der OCL, aber weniger detailliert
■ Generatorlauf nur bei fehlerfreier Prüfung
■ Direkte Prüfung bei Verwendung des xText-Editors
■ Beispiel:
context Entity ERROR "Entities müssen eindeutig benannt sein: " + name :
// silbings() gibt eine Liste mit den Geschwistern des Entities zurück
silbings().select(e|e.name == name).size == 1;
12
Ergebnis der Modellierung
■ Analyse der Domäne
■ Warum Ecore in diesem Fall?
■ Einfachere API für den Zugriff
■ Probleme mit XMI-Datenformat für UML2
■ Textbasierte Metamodellierung mit xText
■ Erzeugt Ecore Metamodell
■ Integriert Modellüberprüfungen
■ Eclipse-Editor zur Erstellung der Modelle
■ Eclipse-GMF als Erweiterung für grafische Modellierung
■ Das Modell ausbeuten!
13
Generator: Templatesprache Xpand
■
Wie kann das Modell in Code überführt werden?
«IMPORT metamodel»
«EXTENSION myJavaExtensions»
«DEFINE javaClassImpl FOR Entity»
«FILE name
+ ".java"» »
javaFilename(this)
/** Implementierung
Implementierung für
für Entity
Entity «name»
«name» */
*/
/**
public
{
publicclass
class«name»
«javaClassname(this)»
{
«FOREACHfeatures
featuresAS
ASthis»
this»
«FOREACH
private«type»
«type»«name»;
«name»;
private
«ENDFOREACH»
«ENDFOREACH»
 Datei Produkt.java
}}
«ENDFILE»
/** Implementierung für Entity Produkt */
«ENDFILE»
public class Produkt {
«ENDDEFINE»
private String name;
private int preis; }
14
Generator: Eigenschaften und Anforderungen
■ Überlagern von Templates:
«DEFINE javaClassImpl FOR Entity»
«EXPAND implFeature FOREACH features»
«ENDDEFINE»
«DEFINE implFeature FOR Attribute»
// generierter Code für das Attribut
«ENDDEFINE»
«DEFINE implFeature FOR Reference»
// generierter Code für die Referenz
«ENDDEFINE»
■ Erweiterungsmöglichkeiten
■ Expressions-Language
■ Java-Extensions
■ Einbinden vorgefertigter Generatoren: Cartridges
■ Erzeuge gut lesbaren Code:
■ Code-Beautifier zur Formatierung
■ Kommentare!
■ Modell und Template im Quelltext vermerken
15
Beispielimplementierung: Generatorstruktur
16
Code-Integration
■ Verknüpfung von automatischem und manuellem Code
notwendig
■ „Never touch generated code!“
■ Mögliche Ansätze
■ Problematisch: Geschützte Bereiche in generierten Dateien
■ Besser: Integration über Möglichkeiten der OOP
■ Recipes: Komponente zur Überprüfung der
Integrationsrichtlinien in Eclipse
■ Versionierung
■ Metamodell und Modell
■ Templates und Generator-Konfiguration
■ Manuell erstellte Komponenten
17
Fazit
generator
■ „A fool with a tool is still a fool!“ M. Völter
■ Komplex, hoher Einarbeitungsaufwand
■ Technisches Projektsetup: Eclipse-Plugin-Hölle
■ Zusammenspiel der Komponenten
■ Flexibel einsetzbar
■ Beliebige Metamodellierungen
■ Erweiterbarkeit
■ Auch für Spezialgebiete geeignet
■ Einsatz nur sinnvoll, wenn mehrfache Verwendung möglich
■ Alternativen prüfen
 OAW ist bei passenden Projektvoraussetzungen
empfehlenswert.
18
Vielen Dank!
■ Fragen, Diskussion
19
Herunterladen