Software ubiquitärer Systeme Modellgetriebene Softwareentwicklung Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund [email protected] http://ess.cs.uni-dortmund.de/~os/ http://ess.cs.tu-dortmund.de/DE/Teaching/SS2010/SuS/ 1 Agenda ● ● ● ● ● ● Motivation Begriffe Beispiele für Modellierungswerkzeuge Standards, Werkzeuge und Techniken MDSD & Ubiquitäre Systeme Zusammenfassung 06.4 – Modellgetriebene Softwareentwicklung 2 Motivierendes Beispiel ● Anwendung SmartSpeaker[3] kontextabhängige Regelung der Lautstärke (für Musik etc.) ● lauffähig auf unterschiedlichen Hard- und Softwareplattformen ● HW: Nokia Smartphone HW: Nokia Smartphone SW: J2ME, Java SW: J2ME, Java HW: iPAQ PDA HW: iPAQ PDA SW: Windows, C-Sharp SW: Windows, C-Sharp 06.4 – Modellgetriebene Softwareentwicklung 3 Motivierendes Beispiel public public class class SmartSpeaker SmartSpeaker public public SmartSpeaker() SmartSpeaker() super(); super(); }} extends extends MIDlet MIDlet {{ {{ protected protected void void startApp() startApp() throws throws MIDletStateChangeException MIDletStateChangeException {{ Display display = Display.getDisplay(this); Display display = Display.getDisplay(this); Form Form SmartSpeakerMainFrame SmartSpeakerMainFrame == new new Form("SmartSpeaker"); Form("SmartSpeaker"); SmartSpeakerMainFrame.append(new SmartSpeakerMainFrame.append(new StringItem(" StringItem(" Current Current Location","")); Location","")); SmartSpeakerMainFrame.append(new StringItem(" Current SmartSpeakerMainFrame.append(new StringItem(" Current Volume","")); Volume","")); ... ... ... ... display.setCurrent(SmartSpeakerMainFrame); display.setCurrent(SmartSpeakerMainFrame); }} ... ... ... ... public public class class SmartSpeaker SmartSpeaker :: System.Windows.Forms.Form System.Windows.Forms.Form {{ private private System.Windows.Forms.Label System.Windows.Forms.Label CurrentLocation_label; CurrentLocation_label; private System.Windows.Forms.TextBox private System.Windows.Forms.TextBox CurrentLocation_textBox; CurrentLocation_textBox; ... ... ... ... public public SmartSpeaker() SmartSpeaker() {{ InitializeComponent(); InitializeComponent(); ... ... ... ... }} ... ... ... ... private private void void InitializeComponent() InitializeComponent() {{ this.CurrentLocation_label this.CurrentLocation_label == new new System.Windows.Forms.Label(); System.Windows.Forms.Label(); this.CurrentLocation_textBox this.CurrentLocation_textBox == new new System.Windows.Forms.TextBox(); System.Windows.Forms.TextBox(); ... ... ... ... this.CurrentLocation_label.Size this.CurrentLocation_label.Size == new new System.Drawing.Size(128, System.Drawing.Size(128, 16); 16); this.CurrentLocation_label.Text = "Current this.CurrentLocation_label.Text = "Current Location:"; Location:"; this.CurrentLocation_label.ParentChanged this.CurrentLocation_label.ParentChanged += += new new System.EventHandler(this.CurrentLocation_label_ParentChanged); System.EventHandler(this.CurrentLocation_label_ParentChanged); this.CurrentLocation_textBox.Size = new System.Drawing.Size(80, this.CurrentLocation_textBox.Size = new System.Drawing.Size(80, 22); 22); this.CurrentLocation_textBox.Text this.CurrentLocation_textBox.Text == ""; ""; this.CurrentLocation_textBox.TextChanged this.CurrentLocation_textBox.TextChanged += += new new System.EventHandler(this.CurrentLocation_textBox_TextChanged); System.EventHandler(this.CurrentLocation_textBox_TextChanged); ... ... ... ... 06.4 – Modellgetriebene Softwareentwicklung 4 Motivierendes Beispiel ● den GUI-Code von Hand zu erzeugen ist aufwändig ● und das für mehrere Softwareplattformen (JavaME, Windows/C#, ...) ● … ganz zu Schweigen von verschiedenen Arten von Anzeigen... ● ● Größe („passt dieses Eingabefeld so auf die Anzeige?“) ● Auflösung („ist Schriftgröße x auf Gerät y noch lesbar“) ● Anzahl Farben … oder Eingabegeräten ● tastaturbasiert ● Touchscreen ● Clickwheel 06.4 – Modellgetriebene Softwareentwicklung 5 Problem ● (nicht nur bei GUI-Code) ● viele Konventionen manuell einzuhalten. ● ● fehleranfällig! ● viel gleichförmiger rein „architektureller Code“, der im Grunde keine (anwendungsspezifische) Information beinhaltet ● pflegen derselben Information an unterschiedlichen Stellen Eigentlich sollte man ● Informationen nur an einer Stelle pflegen müssen (DRY*) ● sich nicht x-fach über die korrekte Benutzung gedanken machen müssen → höhere Abstraktionsebene *don't repeat yourself 06.4 – Modellgetriebene Softwareentwicklung 6 bekannte Beispiele: Abstraktion++ ● manuelle GUI-Instantiierung? → ● Stubs für Remote Procedure Calls: nötig für Marshalling und Versenden der Parameter ● manuelle Implementierung? → Beschreibung der Schnittstelle in IDL automatische Generierung ● 06.4 – Modellgetriebene Softwareentwicklung 7 MDSD-Idee Assembler Modell Problem Maschinencode Hochsprache Abstraktionsgrad Quelle: [2] ● logischer weiterer Schritt den Abstand zwischen Problem und Lösung zu verringern, durch Abstraktion von den Details der unterliegenden Plattform ● automatische Transformation in die Idiome der unterliegenden Plattform ● Idiom: Muster zur Verwendung von Plattform-Features Hardware/Assembler: Parameterübergabe beim Funktionsaufruf ● Software-Plattform: Marshalling, Design Patterns, ... ● 06.4 – Modellgetriebene Softwareentwicklung 8 Begriffe 06.4 – Modellgetriebene Softwareentwicklung 9 Modellgetriebene Softwareentwicklung ● Definition Modellgetriebene Softwareentwicklung ist ein Oberbegriff für Techniken, die aus formalen Modellen automatisiert lauffähige Software erzeugen¹ [1] ● formale Modelle ● Beschreiben einen Aspekt² eines Softwaresystems vollständig - Struktur (z.B. Komponenten-/Klassendiagramm) - Verhalten (z.B. Statechart) ● gehorchen einem strengen Schema/Regeln (Metamodell) - kann vieles sein (nicht nur UML) ¹) einschließlich Interpretation zur Laufzeit ²) im umgangssprachlichen Sinn 06.4 – Modellgetriebene Softwareentwicklung 10 Modellgetriebene Softwareentwicklung ● ● ● eindeutige Beziehung zwischen Modell und lauffähiger Software Modelle sind ein Teil der Implementierung und haben denselben Stellenwert wie (handgeschriebener) Quellcode! generierter Quellcode darf nicht manuell geändert werden! 06.4 – Modellgetriebene Softwareentwicklung 11 Metamodell meta von altgr. μετά = „danach, hinter, jenseits“ ● Formale Modelle sind Instanzen eines Metamodells. ● Ein Metamodell sagt etwas über Modelle aus. ● abstrakte Syntax ● statische Semantik Modell Metamodell Instanz von Teil des Metamodells für UML 2.0, Quelle: [2] 06.4 – Modellgetriebene Softwareentwicklung 12 Modellierungssprachen ● ● ● ● Metamodell definiert nur abstrakte Syntax zusammen mit einer konkreten Syntax erhält man die Modellierungssprache (auch domänenspezifische Sprache (DSL) genannt) konkrete Syntax kann textuell oder grafisch sein Beispiel: 2 verschiedene Modellierungssprachen mit gleichem Metamodell FSM(ready) FSM(ready) {{ ready->wash(start) ready->wash(start) wash->pause(opened) wash->pause(opened) pause->wash(closed) pause->wash(closed) wash->ready(finished) wash->ready(finished) }} 06.4 – Modellgetriebene Softwareentwicklung 13 Statische Semantik ● syntaxkonforme Modelle nicht automatisch gültig/sinnvoll. ● ● nicht erreichbare Zustände in einer state machine sind z.B. ein Indiz dafür, dass irgendetwas nicht stimmt Problem: diese Regeln über die Syntax auszudrücken würde die Syntax unnötig komplex machen ● evtl. kontextsensitive Grammatiken nötig machen ● ● Diese Regeln werden daher nach dem Parsen überprüft → statische Semantik ● vgl. z.B. Typprüfung im Compiler ● void foo() { void foo() { int eastwood; int eastwood; eastwood=”bar”; eastwood=”bar”; }} 06.4 – Modellgetriebene Softwareentwicklung 14 Transformation ● eine Transformation erzeugt aus einem Modell ● das Endprodukt – M2T (mittels Generator, auch „Modellcompiler“) - ● i.d.R Quellcode einer Hochsprache, aber auch Bytecode Dokumentation Konfigurationsdateien Webseiten (Hardwarebeschreibungen) … ein anderes Modell – M2M - um Änderungen an einem Modell vorzunehmen - um eine niedrigere Abstraktionsebene zu erreichen 06.4 – Modellgetriebene Softwareentwicklung 15 Beispiele für Modellierungswerkzeuge 06.4 – Modellgetriebene Softwareentwicklung 16 … außer Zustandsdiagrammen ● architekturzentrierte DSLs ● Metamodell beschreibt Konzepte einer Softwareplattform ● Modell beschreibt deren Instantiierung ● Beispiele: - Komponentenmodell - GUI-Modell - Datenbankmodell ● rein fachliche DSLs Eine DSL zur Beschreibung von Bayes-Netzen ● Domäne enthält wenige oder gar keine Softwarekonzepte ● Beispiele: - mathematische oder naturwissenschaftliche Modelle - Geschäftsprozesse → Geeignet für die Einbeziehung von Domänenexperten 06.4 – Modellgetriebene Softwareentwicklung 17 Automotive Softwareentwicklung ● Gründe für MDSD ● Einsparung von Kosten (Entwicklungsdauer) ● Sicherheitsanforderungen - weniger Fehler durch domänenspezifische Sprachen - generierte Software evtl. automatisch zertifiziert ● Beispiel: Simulink + Stateflow ● Erweiterungen für Matlab ● Simulink – kontinuierliche Modellierung/Simulation ● Stateflow – diskrete Modellierung/Simulation ● jeweils vorgegebenes Metamodell ● verschiedene Werkzeuge können aus diesen Modellen Code für verschiedene Hardwareplattformen generieren (z.B. TargetLink) 06.4 – Modellgetriebene Softwareentwicklung 18 Modelle in der Automobilindustrie Stateflow Simulink 06.4 – Modellgetriebene Softwareentwicklung 19 „echte“ MDSD: Standards, Werkzeuge und Techniken 06.4 – Modellgetriebene Softwareentwicklung 20 interne DSLs ● DSL ist Teilmenge einer anderen Sprache ● ● ● im Wesentlichen eine Bibliothek Vorteil: „geschenkter“ Parser Möglichkeiten für konkrete Syntax sind beschränkt → evtl. völlig unbrauchbar ● Beispiele Definition eines XML-Schemas ● Definition eines UML2-Profils ● rake → ● file file sh sh end end file file sh sh end end 'hello.o' 'hello.o' 'cc 'cc -c -c -o -o => => ['hello.c'] ['hello.c'] do do hello.o hello.o hello.c' hello.c' 'hello' 'hello' => => ['hello.o'] ['hello.o'] do do 'cc 'cc -o -o hello hello hello.o' hello.o' 06.4 – Modellgetriebene Softwareentwicklung 21 Beispiel: State Machine mit Boost struct struct ready; ready; struct struct WashingMachine WashingMachine :: state_machine< state_machine< WashingMachine, WashingMachine, ready> ready> {}; {}; struct struct struct struct struct struct ready ready :: simple_state< simple_state< ready, ready, WashingMachine WashingMachine wash : simple_state< wash, wash : simple_state< wash, WashingMachine WashingMachine >> pause pause :: simple_state< simple_state< pause, pause, WashingMachine WashingMachine struct struct struct struct struct struct struct struct start start :: event< event< start start >> {}; {}; finish : event< finish : event< finish finish >> {}; {}; open open :: event< event< open open >> {}; {}; close close :: event< event< close close >> {}; {}; struct struct pause pause :: simple_state< simple_state< typedef typedef transition< transition< close, close, }} pause, pause, wash wash >> struct struct wash wash :: simple_state< simple_state< wash, wash, {{ typedef typedef mpl::list< mpl::list< custom_reaction< custom_reaction< finish finish >, >, transition< finish, ready transition< finish, ready >> >> reactions; reactions; result result wash::reaction( wash::reaction( &finish &finish )) {{ cout << “FERTIG!”; cout << “FERTIG!”; return return [TODO] [TODO] }} int int main() main() {{ WashingMachine WashingMachine wm; wm; wm.initiate(); wm.initiate(); wm.processEvent(start()}; wm.processEvent(start()}; // // ... ... }} WashingMachine> WashingMachine> {{ reactions; reactions; WashingMachine WashingMachine >> result result reaction( reaction( &finish &finish ); ); }; }; >> {}; {}; {}; {}; >> {}; {}; ● generative Programmierung z.B. mit Untermenge von C++-Templates als DSL ● Modell = Graph von Template-Instanzen ● Vorteile: - mit „Bordmitteln“ machbar - keine externen Tools nötig ● Nachteile - weniger gut les-/editierbar - weniger geeignet für Nicht-C++ler ● 06.4 – Modellgetriebene Softwareentwicklung 22 MDSD-Werkzeuge ● Bisher: Werkzeuge für festes Metamodell zu spezifisch → nur für diese (Sub-)Domäne brauchbar ● zu generisch → Metamodelle werden unnötig kompliziert, mehr Möglichkeiten für Fehler ● ● eigentliches Potential der MDSD liegt woanders eigene, domänenspezifische Metamodelle ● enthalten nur die Konzepte der Domäne ● ● Parser/Editor + Generator von Grund auf neu schreiben? Muss für jede Domäne neu gemacht werden ● Trotz gewisser Hilfsmittel (Parsergeneratoren) aufwändig ● → würde sich nur in seltenen Fällen lohnen ● ● andere Möglichkeiten? interne DSLs ● „Metawerkzeuge“ für externe DSLs ● 06.4 – Modellgetriebene Softwareentwicklung 23 Werkzeuge für externe DSLs ● „echte“ MDSD-Werkzeuge können Metamodell-Beschreibungen ● Modellconstraints (über Constraint-Sprachen) ● Transformationsregeln (Mapping-Sprachen, Template-Sprachen) ● als Vorlage für Modelleditoren ● Modellparser ● Checker für statische Semantik ● Modelltransformatoren ● verarbeiten ● ● „Metawerkzeuge“ Vorraussetzung dafür ist natürlich, dass das Metamodell ebenfalls formal ist! 06.4 – Modellgetriebene Softwareentwicklung 24 Metametametametametametametametameta metametametametametametametametameta Metametamodell Metametamodell Metamodell Metamodell Modell Modell ● ● Meta → relative Beziehung Konsens: Quelle: Wikipedia statisches Anwendungsmodell → Modell ● Metamodell des Anwendungsmodells → Metamodell ● Metamodell des Metamodells: → Metametamodell ● ● i.d.R ist beim Metametamodell auch Schluss mit Meta 06.4 – Modellgetriebene Softwareentwicklung 25 Standards in der MDSD ● MDA – Model-Driven Architecture MDSD-Standard der OMG ● diverse Werkzeuge (u.A. oAW) ● Metametamodell: MOF ● ● EMF – Eclipse Modeling Framework Werkzeug & „Quasistandard“ ● Metametamodell: Ecore ● ● xPand ● ● früher openArchitectureWare (Generatorframework) XML Definition von Metamodellen über XML Schema Definitions ● oft Speicher-/Austauschformat für Modelle: ● - XML Metamodel Interchange (XMI) 06.4 – Modellgetriebene Softwareentwicklung 26 Model-Driven Architecture ● vordefinierte Metamodelle ● bekanntestes Beispiel: Klassendiagramme ● im Prinzip Metamodelle m.H. der MOF definierbar ● i.d.R. werden Profile verwendet - Erweiterungen der UML - Definition von Stereotypen ● Ziel: hauptsächlich (Software-)Plattformunabhängigkeit ● weniger die Einbindung von Domänenexperten ● Platform Independent Model (PIM): Anwendungsmodell ● Platform Specific Model (PSM): EJB, CORBA, ... 06.4 – Modellgetriebene Softwareentwicklung 27 Metaebenen bei EMF Modell Modell Metametamodell Metametamodell Metamodell Metamodell 06.4 – Modellgetriebene Softwareentwicklung 28 Metawerkzeuge ● Metawerkzeuge verwenden Metamodellbeschreibungen um die eigentlichen Werkzeuge bereitzustellen Editor ● DSL-Parser ● ● durch Generierung von Hilfsklassen ● EMF → Erzeugung von Java-Code für das Metamodell - Java-Klassen, die Metamodellelemente repräsentieren - Factories, Switch-Klassen ● durch Interpretation von Generator-Templates ● Metamodell-Mappings ● Constraint-Definitionen (in Constraint-Sprachen) ● 06.4 – Modellgetriebene Softwareentwicklung 29 MDSD mit Metawerkzeugen domain engineering Domänenarchitekt Metamodell Metamodell Metamodell Metamodell Metawerkzeuge Generator/ Interpreter Werkzeuge Werkzeuge Werkzeuge mit mit Hilfe Hilfe generierter generierter Modellzugriffsklassen Modellzugriffsklassen selbst selbst entwickeln entwickeln Repräsentation Checker Modell Modell Modell Modell Keine (eigene) konkrete Syntax. Keine (eigene) application engineeringkonkrete Syntax. Das Das Metawerkzeug Metawerkzeug stellt stellt evtl. evtl. eine eine Standardsyntax Standardsyntax zur zur Verfügung. Verfügung. M2T M2M Quellcode Generat Anwendungsentwickler 06.4 – Modellgetriebene Softwareentwicklung 30 MDSD mit Metawerkzeugen domain engineering Domänenarchitekt Metamodell Metamodell Metamodell Metamodell Metawerkzeuge Generator/ Interpreter Werkzeuge Repräsentation Checker Modell Modell Modell Modell M2T M2M application engineering Quellcode Generat public public EReference EReference getStatemachine_States() getStatemachine_States() {{ return return (EReference)statemachineEClass.getEStructuralFeatures().get(2); (EReference)statemachineEClass.getEStructuralFeatures().get(2); Anwendungsentwickler }} // // …… // // public public EList<Transition> EList<Transition> getTransitions() getTransitions() {{ if (transitions == null) if (transitions == null) {{ 06.4 – Modellgetriebene Softwareentwicklung transitions transitions == new new EObjectContainmentEList<Transition>(Transition.class, EObjectContainmentEList<Transition>(Transition.class, this, this, FowlerdslPackage.STATE__TRANSITIONS); FowlerdslPackage.STATE__TRANSITIONS); 31 MDSD mit Metawerkzeugen domain engineering Domänenarchitekt konkrete Syntax Abbildung Metamodell Metamodell Metamodell Metamodell Zur Zur Generierung Generierung eines eines Parsers Parsers ist ist evtl. evtl. eine eine Abbildung Abbildung der der konkreten konkreten Syntax Syntax auf auf das das Metamodell Metamodell nötig nötig Metawerkzeuge Generator/ Interpreter Werkzeuge Generator/ Interpreter Repräsentation Checker Parser Modell Modell Modell Modell M2T M2M application engineering ModellBeschreibung Quellcode Generat Anwendungsentwickler 06.4 – Modellgetriebene Softwareentwicklung 32 Variante: Variante: aus aus konkreter konkreter Syntax Syntax werden werden Metamodell Metamodell und und Editor Editor domain engineering generiert generiert (xText) (xText) MDSD mit Metawerkzeugen konkrete Syntax Abbildung Domänenarchitekt Metamodell Metamodell Metamodell Metamodell Metawerkzeuge Generator/ Interpreter Werkzeuge Generator/ Interpreter Repräsentation Checker Editor Modell Modell Modell Modell M2T M2M application engineering ModellBeschreibung Quellcode Generat Anwendungsentwickler 06.4 – Modellgetriebene Softwareentwicklung 33 MDSD mit Metawerkzeugen domain engineering Domänenarchitekt konkrete Syntax Abbildung Metamodell Metamodell Metamodell Metamodell Metawerkzeuge Generator/ Interpreter Werkzeuge Generator/ Interpreter Repräsentation Checker Editor Modell Modell Modell Modell M2T M2M application engineering ModellBeschreibung Quellcode Generat Anwendungsentwickler 06.4 – Modellgetriebene Softwareentwicklung 34 Restliche Restliche Metawerkzeuge Metawerkzeuge werden werden MDSD mit Metawerkzeugen anhand anhand entsprechender entsprechender Beschreibungen Beschreibungen ebenfalls ebenfalls generiert generiert domain engineering Domänenarchitekt konkrete Syntax Abbildung Metamodell ModellConstraints M2M-Abbildung GenerierungsTemplate Generator/ Interpreter Generator/ Interpreter Generator/ Interpreter Metamodell Metamodell Metamodell Metawerkzeuge Generator/ Interpreter Werkzeuge Generator/ Interpreter Repräsentation Checker Parser Modell Modell Modell Modell M2T M2M application engineering ModellBeschreibung Quellcode Generat Anwendungsentwickler 06.4 – Modellgetriebene Softwareentwicklung 35 MDSD mit Metawerkzeugen domain engineering Domänenarchitekt konkrete Syntax Abbildung Metamodell ModellConstraints M2M-Abbildung GenerierungsTemplate Generator/ Interpreter Generator/ Interpreter Generator/ Interpreter Metamodell Metamodell Metamodell Metawerkzeuge Generator/ Interpreter Werkzeuge Generator/ Interpreter Repräsentation Checker Parser Modell Modell Modell Modell application engineering FSM FSM {{ ready->wash(start) ready->wash(start) wash->pause(opened) wash->pause(opened) Modellpause->wash(closed) pause->wash(closed) Beschreibung wash->ready(finished) wash->ready(finished) Anwendungsentwickler }} 06.4 – Modellgetriebene Softwareentwicklung M2T M2M Quellcode Generat 36 Modellierungswerkzeuge XML EMF MDA EMF (+oAW) (p::v) Metameta XSD Ecore MOF Ecore, oAW classic, MOF, XSD,(erweiterbar) FeatureMetamodell statische Sem. Schematron OCL Check Relations, Restrictions, Prolog M2M XSLT Mapping: Ecore → Ecore, XML QVT xTend M2T XSLT JET QVT, Mof2Text xPand StandardTransformat ion, XSLT, (eigene) Achtung: weder vollständig noch vollständig ernst zu nehmen - XML ist eigentlich kein „Werkzeug“ und wird z.B. von anderen Werkzeugen als Speicher- oder Austauschformat (XMI!) benutzt. - pure::variants ist kein MDSD-Werkzeug 06.4 – Modellgetriebene Softwareentwicklung 37 Generierung vs. Interpretation ● ● Anstatt Code aus Modellen zu generieren, können diese natürlich auch interpretiert werden Vorteile Modell kann im laufenden Betrieb ausgetauscht werden ● „Code“ ist i.A. kleiner ● ● Nachteil: Interpreter/VM nötig ● ● ● Performance, Leistungsaufnahme eher geeignet für fachliche Modelle als strukturelle Modelle Zwischenvariante: Umwandlung des Modells in Bytecode (Generierung+Interpretation) 06.4 – Modellgetriebene Softwareentwicklung 38 MDSD und ubiquitäre Systeme 06.4 – Modellgetriebene Softwareentwicklung 39 MDSD & Ubiquitäre Systeme ● Plattformen für ubiquitäre Systeme: verschieden(st)e ● Interaktionsmöglichkeiten - Anzeige - Eingabegeräte ● ● ● Software: Plattformen (JavaME, Windows, ...) Umgang mit Kontext: verschiedene ● Kontextontologien ● Kontextrepräsentationen ● → Anwendungsentwickler soll sich nicht um Details kümmern MDSD to the rescue: Modellierung ● abstrakter Benutzerschnittstellen ● von Kontext ● von Kontextadaption 06.4 – Modellgetriebene Softwareentwicklung 40 Modellierung von Kontext ● Es existieren verschiedene, meist auf der MOF basierende, Modellierungssprachen für Kontext ● Allgemeine Metamodelle für Ontologien: OWL (+RDF) ● Kontextontologien enthalten wissen über eine Kontextdomäne[3]: ● ● Objekte/Subjekte (Entitys) und deren ● Attribute ● Funktionen (Operationen, Dienste) ● Beziehungen zwischen Entitys konkretes Beispiel: ContextUML – Context-Awareness für Webservices 06.4 – Modellgetriebene Softwareentwicklung 41 ContextUML[4] Context Modeling AtomicContext Service 1 CompositeContext MechanismAssignment * 1..* Operation input output 0..1 0..1 Message part Part SourceAssignment * CAMechanism CAObject 1..* * * ContextBinding 1..* ContextConstraint ContextSource 1..* * ContextTriggering * 0..* Context 1..* ContextService * ContextService Community * 1..* member * Action Context-Awareness Modeling Quelle: [5] 06.4 – Modellgetriebene Softwareentwicklung 42 ContextUML[4] Context Modeling AtomicContext Service 1 CompositeContext MechanismAssignment * 1..* Operation input output 0..1 0..1 Message part Part CAMechanism CAObject 1..* Context * * ContextBinding 1..* 1..* ContextBinding: ContextBinding: ContextConstraint Verknüpft Verknüpft ein ein CAObject CAObject (ContextAwareObject) (ContextAwareObject) mit mit einem einem Contextu Contextu ContextSource * ContextTriggering * 0..* SourceAssignment * 1..* ContextService * ContextService Community * 1..* member * Action Context-Awareness Modeling Quelle: [5] 06.4 – Modellgetriebene Softwareentwicklung 43 ContextUML[4] Context Modeling AtomicContext Service 1 CompositeContext MechanismAssignment * 1..* Operation input output 0..1 0..1 Message part Part SourceAssignment * CAMechanism CAObject 1..* Context * * 1..* * ContextBinding ContextTriggering * 0..* 1..* ContextConstraint Context-Awareness Modeling ContextSource 1..* ContextService * ContextService Community * 1..* member * Action ContextTriggering: ContextTriggering: Legt Legt fest, fest, welche welche Action Action ausgeführt ausgeführt werden werden soll, soll, wenn wenn eine eine bestimmte bestimmte Bedingung Bedingung (ContextConstraint) (ContextConstraint) erfüllt erfüllt ist. ist. 06.4 – Modellgetriebene Softwareentwicklung Quelle: [5] 44 ● Beispiel für eine Applikation, die abhängig vom Wetter ContextUML[4] Informationen zu Sehenswürdigkeiten liefert: Context Modeling WeatherTrigger AtomicContext Service 1 1..* Operation input output 0..1 0..1 Message part Part Context triggering MechanismAssignment harshWeather=true * * * 1..* ContextConstraint Context-Awareness Modeling SourceAssignment * Context ContextSource 1..* * ContextBinding ContextTriggering 0..* * FilterOutdoorActivities Action ContextConstraint CAMechanism CAObject 1..* CompositeContext 1..* ContextService * ContextService Community * 1..* member * Action ContextTriggering: ContextTriggering: Legt Legt fest, fest, welche welche Action Action ausgeführt ausgeführt werden werden soll, soll, wenn wenn eine eine bestimmte bestimmte Bedingung Bedingung (ContextConstraint) (ContextConstraint) erfüllt erfüllt ist. ist. 06.4 – Modellgetriebene Softwareentwicklung Quelle: [5] 45 ContextUML: Beispiel 06.4 – Modellgetriebene Softwareentwicklung 46 Zusammenfassung 06.4 – Modellgetriebene Softwareentwicklung 47 Bewertung ● Trotz umfangreicher Werkzeugunterstützung ist MDSD zunächst einmal mit zusätzlichem Aufwand verbunden ● Domänenanalyse ● Referenzimplementierung - enthält alles, was der Generator erzeugen können muss - dient als Vorlage für DSL und Generator - wird i.d.R. zunächst „von Hand“ (ohne Generator) erstellt ● Domänenarchitektur - Metamodelle - Transformationen ● lohnt sich das? 06.4 – Modellgetriebene Softwareentwicklung 48 Bewertung ● ● ● MDSD kann die Anwendungsentwicklung beschleunigen ● Entkopplung verschiedener Abstraktionsebenen ● Wiederverwendung von Generatoren, insb. bei Produktlinien ● generierter Plattformcode, insb. bei Verwendung von Cartridges MDSD hilft, Fehler zu vermeiden ● Modell bietet weniger Möglichkeiten als handgeschriebener Code ● Fehler im Generator fallen recht schnell auf MDSD bietet somit Lösungen für die speziellen Probleme ubiquitärer Systeme ● Heterogenität (v.a. der Benutzerschnittstellen) ● Umgang mit Kontext 06.4 – Modellgetriebene Softwareentwicklung 49 Zusammenfassung ● Begriffe ● ● Techniken/Werkzeuge ● ● ((Meta-)Meta-)Modell, Softwareplattform, (abstrakte/konkrete) Syntax, architekturzentrierte/fachliche MDSD, Transformation, DSL, statische/dynamische Semantik, Abstraktionsebenen, MDA, PIM, PSM interne DSLs, M2M, M2T – Generierung, Interpretation, Metawerkzeuge, Constraint-Sprachen, Transformationssprachen, Modellierung von Kontext und Kontextadaption Warum? ● (Software-)plattformunabhängigkeit, DRY, Fehlervermeidung, Flexibilität, Entwicklungsgeschwindigkeit, Produktlinien, Trennung von Domänen-&Plattformwissen 06.4 – Modellgetriebene Softwareentwicklung 50 Literatur [1] [2] [3] [4] [5] T. Stahl, M. Völter, S. Efftinge, A. Haase, Modellgetriebene Softwareentwicklung – Techniken, Engineering, Management, dpunkt.verlag, 2. Auflage, 2007 S. J. Mellor, K. Scott, A. Uhl, D. Weise, MDA Distilled: Principles of Model-Driven Architecture, Addison Wesley, März 2004 N. Georgalas, S. Ou, M. Azmoodeh, K. Yang, Towards a Model-Driven Approach for Ontology-Based Context-Aware Application Development: A Case Study. International Workshop on Model-Based Methodologies for Pervasive and Embedded Software (MOMPES 2007), März 2007. Q. Z. Sheng, B. Benatallah, ContextUML: A UML-Based Modeling Language for Model-Driven Development of ContextAware Web Services Development, International Conference on Mobile Business (ICMB 2005), Juli 2005 www.cs.adelaide.edu.au/~qsheng/presentations/ICMB05Sheng.ppt 06.4 – Modellgetriebene Softwareentwicklung 51 Transformation ● von UML-Profilen «DEFINE «DEFINE Root Root FOR FOR uml::Model» uml::Model» «EXPAND «EXPAND PackageRoot PackageRoot FOREACH FOREACH allOwnedElements().typeSelect(uml::Package)» allOwnedElements().typeSelect(uml::Package)» «ENDDEFINE» Iteration «ENDDEFINE» Iteration über über Unterelemente Unterelemente «DEFINE «DEFINE PackageRoot PackageRoot «EXPAND «EXPAND ClassRoot ClassRoot «ENDDEFINE» «ENDDEFINE» FOR FOR uml::Package» uml::Package» FOREACH FOREACH ownedType.typeSelect(uml::Class)» ownedType.typeSelect(uml::Class)» «DEFINE «DEFINE ClassRoot ClassRoot FOR FOR uml::Class» uml::Class» «FILE «FILE name+".java"» name+".java"» public public class class «name» «name» {} {} Polymorphes Polymorphes Matching Matching auf auf Metamodell-Elemente Metamodell-Elemente «ENDFILE» «ENDFILE» «ENDDEFINE» «ENDDEFINE» «DEFINE «DEFINE ClassRoot ClassRoot FOR FOR test::test» test::test» «FILE «FILE name+".java"» name+".java"» public public class class «name» «name» {{ public public void void hallo hallo {{ System.out.println(“ich System.out.println(“ich bin bin «name»”); «name»”); }} }} // // stereotyped stereotyped «ENDFILE» «ENDFILE» «ENDDEFINE» 06.4 – Modellgetriebene Softwareentwicklung «ENDDEFINE» 52 Hinz.java: Hinz.java: public public class class Hinz Hinz {} {} Transformation ● Beispiel für M2T: oAW Kunz.java: Kunz.java: «DEFINE FOR uml::Model» «DEFINE Root FORKunz uml::Model» public class {} publicRoot class Kunz {} xPand «EXPAND «EXPAND PackageRoot PackageRoot FOREACH FOREACH allOwnedElements().typeSelect(uml::Package)» allOwnedElements().typeSelect(uml::Package)» «ENDDEFINE» Iteration «ENDDEFINE» Iteration über über Unterelemente Unterelemente Foo.java: Foo.java: public class \\ uml::Package» publicPackageRoot class Foo Foo FOR «DEFINE «DEFINE PackageRoot FOR uml::Package» {{«EXPAND «EXPAND ClassRoot ClassRoot FOREACH FOREACH ownedType.typeSelect(uml::Class)» ownedType.typeSelect(uml::Class)» public «ENDDEFINE» public void void hallo() hallo() {{ «ENDDEFINE» System.out.println(“ich System.out.println(“ich bin bin Foo”); Foo”); «DEFINE «DEFINE ClassRoot FOR FOR uml::Class» uml::Class» }} ClassRoot «FILE name+".java"» name+".java"» }}«FILE public public class class «name» «name» {} {} Polymorphes Polymorphes Matching Matching auf auf Metamodell-Elemente Metamodell-Elemente «ENDFILE» «ENDFILE» Bar.java: Bar.java: «ENDDEFINE» «ENDDEFINE» public public class class Bar Bar \\ {{ «DEFINE ClassRoot «DEFINE ClassRoot FOR FOR test::test» test::test» public void «FILE name+".java"» public void hallo() hallo() {{ «FILE name+".java"» public class bin public System.out.println(“ich class «name» «name» {{ System.out.println(“ich bin Bar”); Bar”); public public void void hallo hallo {{ System.out.println(“ich System.out.println(“ich bin bin «name»”); «name»”); }} } } // stereotyped stereotyped }} }} // «ENDFILE» «ENDFILE» «ENDDEFINE» «ENDDEFINE» 06.4 – Modellgetriebene Softwareentwicklung 53