Upload
ewald-kerner
View
212
Download
0
Embed Size (px)
Citation preview
Wirt
scha
ftsin
form
atik
Christian [email protected]
Im Rahmen des Seminars „Ausgewählte Themen des Softwareengineering“
2
Gliederung
■ Einführung■ openArchitectureWare■ Entwicklungsprozess■ Beispielimplementierung
■ Modellierung■ Metamodell■ Modell■ Modellüberprüfung
■ Generator■ Code-Integration■ Fazit
3
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
4
OAW: Funktionsweise
■ Modell einlesen und überprüfen■ Codeerzeugung
■ Modell wird an Generator übergeben■ Template verarbeitet Modellelemente und erstellt Code
Parser Metamodell-Instantiator
Metamodell-Instanz Code Generator
Eingabe-Modell
Metamodell-Klassen Templates Generierter
Code
openArchitectureWareQuelle: Stahl, Völter (2005)
5
Entwicklungsprozess
Referenz-implementierung
(Meta-)Modellierung
Generator-entwicklung
ManuelleImplementierung
Domänenanalytiker Domänenarchitekt Anwendungs-entwickler
6
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
7
EJB Metamodell
8
EJB Modell
■ Generiert werden hieraus:■ Entitybeans■ Sessionbeans mit
Datenmanipulations- und Lesemethoden für die referenzierten Entities
9
Spring Konfiguration: Metamodell
View
Daten und Anbindung G‘logik
Zustandsautomat
10
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
11
Zugriff auf das Modell: Expressions-Language
■ Wie arbeiten Metamodell und Modell zusammen?Expressions-Language Elemente:// Zugriff auf ein Attribute.name bspw. „Kunde“
// Suche in Listenentities.select(e|e.features.size ==
0);
// Nur best. Typ selektierenfeatures.typeSelect(Attribute);
/* Eigene Expressions definieren */// Alle Referenzen des Entitiesreferences(Entity this) : features.typeSelect(Reference);
// Entityname für Javaklassennamen
javaClassname(Entity this) :name.toFirstUpper();
12
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;
13
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!
14
Generator: Templatesprache Xpand
■ Wie kann das Modell in Code überführt werden?
«IMPORT metamodel»«EXTENSION myJavaExtensions»«DEFINE javaClassImpl FOR Entity»«FILE name + ".java"»
/** Implementierung für Entity «name» */public class «name» {«FOREACH features AS this»
private «type» «name»;«ENDFOREACH»}
«ENDFILE»«ENDDEFINE»
«FILE javaFilename(this) » /** Implementierung für Entity «name» */
public class «javaClassname(this)» {«FOREACH features AS this»
private «type» «name»; «ENDFOREACH»
}«ENDFILE» /** Implementierung für Entity
Produkt */public class Produkt { private String name; private int preis; }
Datei Produkt.java
15
Generator: Eigenschaften und Anforderungen
■ Überlagern von Templates:
■ 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
«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»
16
Beispielimplementierung: Generatorstruktur
17
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
18
Fazit
■ „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.
generator
19
Vielen Dank!
■ Fragen, Diskussion