name: inverse layout: true class: center, middle, inverse --- layout: false #Xtext - Framework für DSL-Generierung - Eclipse Distribution - Eclipse Plug-in --- # Modelle über Modelle - Modell: Problemdomäne - Metamodell: DSL, Definition der Sprachelemente der DSL - Metametamodell: Sprache, mit der die DSL definiert wird (Xtext) - Metametametamodell: Umgebung, mit der Xtext definiert wird (ANTLR) WTF? --- # Was macht Xtext als Metametamodell? - Dient zur Beschreibung von Problemdomänen -> Beschreibung der Probleme aus Sicht der Kundensprache - Kann beliebige Ausgabe auf Basis der Probledomäne erzugen - Erlaubt das Erzeugen vom validen Java-Code (Inferring) - Dieser kann interpretiert werden - Erzeugt Grundstruktur für Validierung, Scoping, Outlining in Eclipse --- # Praxis! Wie sieht denn so eine DSL aus? domain User { String username; String password; } --- # Ausgabe public class User { private String username; public User() { } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } // you got the idea... } --- # Ich erkenne enormes Potenzial! - Boilerplate Code kann generiert werden - ich kann mich um die fachlichen Domäne kümmern - Validierung des Modells, z. B. auf zyklische Abhängigkeiten - Automatische Generierung von Dokumentation oder UML-Diagrammen - _Enorme Zeitersparnis_ --- # Alternativen - mbeddr - T4-Templates - jede beliebige Programmiersprache - Scala --- # X-Wirrwarr im Xtext-Konglomerat - Xtend: Programmiersprache, die nach Java kompiliert (nicht Bytecode) - Lambda-Expressions - Type Inferring - Dispatchmethoden - Überladung von Operatoren // Java amountOfApples.greaterThan(0).get() // Extension für Xtend def op_greaterThan(IntegerProperty other) { return other.greaterThan(this.get()) } if (amountOfApples >= 0) { // ... } // oder // Java: You can do math with properties! sum.bind(amountOfApples.add(amountOfChips).add(amountOfPotatoes)); // Xtend sum += amountOfApples + amountOfChips + amountOfPotatoes - Xbase: Programmiersprachenvorlage - Xpect: Unit Test DSL in Xtext - Xpand: Templating Engine --- # XtendFX. Weil wir über JavaFX redeten. https://github.com/svenefftinge/xtendfx // JAVA CODE! startButton.disableProperty().bind(anim.statusProperty().isNotEqualTo(Animation.Status.STOPPED)); pauseButton.disableProperty().bind(anim.statusProperty().isNotEqualTo(Animation.Status.RUNNING)); resumeButton.disableProperty().bind(anim.statusProperty().isNotEqualTo(Animation.Status.PAUSED)); stopButton.disableProperty().bind(anim.statusProperty().isEqualTo(Animation.Status.STOPPED)); // Xtend startButton.disableProperty -> (anim.statusProperty != STOPPED) pauseButton.disableProperty -> (anim.statusProperty != RUNNING) resumeButton.disableProperty -> (anim.statusProperty != PAUSED) stopButton.disableProperty -> (anim.statusProperty == STOPPED) --- # Anwendungsbeispiele - Generierung von Umfrageapplikationen - Generierung der gesamten CRUD-Operatoren und Eingabemasken - Generierung von REST-APIs - JavaFX-Applikationen! --- # Praxis - Kunde möchte Komponenten in Fahrzeugen beschreiben - Bussysteme, Komponenten, Nachrichten - Nachrichten haben Parameter --- # Modell Busses CAN, Ethernet Messages { Error has fields { char msg is required int checksum } } Components { Motorsteuergeraet sends messages { of type Error("A") over CAN as broadcast } } Vehicles { Golf has components { Motorsteuergeraet } }