Codegeneratoren mit Xtend2. 11.04.2012, A. Arnold

Ähnliche Dokumente
Prinzipien Objektorientierter Programmierung

Software Engineering II

Java Kurs für Anfänger Einheit 5 Methoden

Client-Server-Beziehungen

Java Einführung Abstrakte Klassen und Interfaces

Grundlagen von Python

Java Einführung Packages

Java: Vererbung. Teil 3: super()

Tutorium Rechnerorganisation

Programmieren in Java

DSLs mit Xtext entwerfen , A. Arnold

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Einführung in die Programmierung für Wirtschaftsinformatik

WebService in Java SE und EE

Software Engineering II

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Objektorientierte Programmierung

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Typumwandlungen bei Referenztypen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Klausur zur Einführung in die objektorientierte Programmierung mit Java

WhiteStarUML Tutorial

Erwin Grüner

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Große Übung Praktische Informatik 1

Zählen von Objekten einer bestimmten Klasse

Themen. Web Service - Clients. Kommunikation zw. Web Services

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Vererbung & Schnittstellen in C#

Pragmatik von Programmiersprachen

Innere Klassen in Java

3 Objektorientierte Konzepte in Java

5. Tutorium zu Programmieren

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Gebundene Typparameter

Excel Funktionen durch eigene Funktionen erweitern.

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Kapitel 6. Vererbung

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Definition von domänenspezifischen Sprachen mit Xtext: Einführung. 19. November 2014

Objektorientierte Programmierung. Kapitel 12: Interfaces

Eine Anwendung mit InstantRails 1.7

Mit 'Babysteps' in die XTEXT-XTEND Welt

Vorkurs C++ Programmierung

Programmierkurs Java

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Die Programmiersprache C99: Zusammenfassung

1 Vom Problem zum Programm

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Software Engineering Klassendiagramme Einführung

Factory Method (Virtual Constructor)

Kapselung und Methodenbindung: Javas Designprobleme und ihre Korrektur. Dipl.-Inform. Peter Müller Prof. Arnd Poetzsch-Heffter Fernuniversität Hagen

Kapitel 12: Übersetzung objektorienter Konzepte

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Klausur in Programmieren

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Klassenbeziehungen & Vererbung

Einführung in die Programmierung

Code-Erzeugung aus UML-Klassendiagrammen

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Objektorientiertes JavaScript

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Einführung in Javadoc

C# im Vergleich zu Java

Javakurs zu Informatik I. Henning Heitkötter

Algorithmen und Datenstrukturen

Scala kann auch faul sein

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Client-Server Beziehungen

Funktionale Programmierung

Objektorientierte Programmierung

Einführung in die Java- Programmierung

Version 0.3. Installation von MinGW und Eclipse CDT

Individuelle Erweiterung des generierten Codes. 16. Januar 2013

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Extending tl_member. Andreas Fieger

Applets I. Grundlagen der g Applet-Programmierung

Einführung in die Java- Programmierung

Propädeutikum. Dipl.-Inf. Frank Güttler

4. AuD Tafelübung T-C3

Vorkurs Informatik WiSe 15/16

Comtarsia SignOn Familie

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Javakurs 2013 Objektorientierung

Programmieren in Java

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Computeranwendung und Programmierung (CuP)

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

WPF Steuerelemente Listbox, ComboBox, ListView,

5. Abstrakte Klassen

Ich liebe Java && Ich liebe C# Rolf Borst

Einführung in die C-Programmierung

Transkript:

Codegeneratoren mit Xtend2 11.04.2012, A. Arnold Copyright 2012 anderscore GmbH

Inhalt 1. Was ist Xtend2? 2. Xtend2 Konzepte 3. Hands On! 3 4 8 20 2

Was ist Xtend2? Funktionale, objektorientierte Sprache für Codegeneratoren Klassen Closures Extension Methods Multidispatch Nachfolger von Xpand / Xtend / Check Basiert auf Xbase an Java gebundene Basissprache mit Expressions + Closures basiert auf Java (Typsystem etc.) + Xtext Compiliert zu Java Unmittelbare Integration mit Java, s. Xbase Xtend2 besteht aus Library + Compiler 3

XTEND2 KONZEPTE 2012 anderscore GmbH

Generator erstellen Mit Xtextbasiertem Xtend2- Editor erstellen Xtend Class (*.xtend) Xtend2- Java- Compiler Java- Klasse (*.java) mit Xtext selbst erstellte DSL DSL Runtime Libs o. POJOs Xtend2 Lib + Xtext 5

Codegenerierung DSL basiertes Modell Xtext Reader Compilierte Xtend Klassen Modell in Memory => Slot generierte Artefakte Kompilierter Generator DSL Runtime Libs Xtend2 Lib + Xtext Guice @Inject Customizing + Konfiguration 6

Xtend Klassen Sind Java-Klassen (nach Kompilierung) Vererbung Generics Methoden Attribute Bsp.: class HelloWorld { def String sayhelloto(string to) val date = new Date() var count = 1 count++ return "Hello "+to+"!" 7

Extension Methods Verwendete Klassen/Typen im Scope einer Xtend-Class um zusätzliche Methoden erweitern Methoden haben Parameter des zu erweiternden Typs als ersten Parameter Methode in (anderer) Xtend-Class definiert Bsp.:. def String topackagename (Type t) { switch (t.econtainer) { Package : (t.econtainer as Package).name default: "" class PojoGenerator implements IGenerator { @Inject extension TypeExtensions def generatepojo (BusinessObject bo, IFileSystemAccess fsa) { val content = ''' package «bo.topackagename»; 8

Multidispatch Zur Laufzeit die am besten passende Methode für den Aufruf aussuchen Parametertypen zur Laufzeit ausgewertet Nur mit dispatch gekennzeichnete Methoden Java wertet Parametertypen zur Compiletime aus (kein Multidispatch) Xtend-Verhalten, wenn Xtend-Methoden nicht mit dispatch gekennzeichnet 9

Multidispatch Beispiel Bsp.: Type sei Basistype von BusinessObject //Die Definition def dispatch totypename (Type t) { def dispatch totypename (Enum t) { def dispatch totypename (BusinessObject bo) { und der Aufruf def Iterable<String> gettypenames (Package p) { return p.gettypes().map ( t t.totypename) Polymorpher Methodenaufruf mit Multidispatch 10

Closures s. Groovy, Scala etc. Bsp.: def closures_01(list<person> persons) { persons.personstostring(p p.name+", "+p.forename ) /** Funktion mit Closure als Parameter tostring */ def personstostring(list<person> persons, (Person)=>String tostring) { val result = newarraylist() for (p : persons) result += tostring.apply(p) return result /** Funktionsaufruf mit Closure */ def closures_02(list<person> persons) { Collections::sort(persons, [ a, b a.name.compareto( b.name ) ]) 11

Alles ist ein Ausdruck Also kann alles Variablen zugewiesen oder als Parameter an Methoden übergeben werden Bsp.: val data = try { filecontentstostring('data.txt') catch (IOException e) { 'data.txt' 12

Bessere Switch-Expressions Ähnlich switch Statement in Java Aber: Case-Ausdrücke mit Strings oder Expressions Switch ist selbst ein Ausdruck Case-Ausdrücke können Type-Guards haben Nur bei passendem Typ des switch-values ausgewertet Bsp.: val Shape shape =... switch (shape) { Rectangle case shape.width == shape.height : "Square ("+shape.width+")" Rectangle : "Rectangle ("+shape.width+" x "+shape.height+")" Circle : "Circle ("+shape.diameter+")" default : "Don't know" 13

Switch Besipiele /* mit Type Guards */ def switchexpression_01(shape shape) { switch (shape) { Circle : 'a circle : diameter='+shape.diameter Rectangle case shape.height == shape.width : 'a square : size='+shape.width Rectangle : 'a rectangle : width='+shape.width+', height='+shape.height def switchexpression_02(string value) { switch(value) { case 'foo' : "it's foo " case 'bar' : 'a bar' default : "don't know " 14

Template Expressions Rich Strings Strings mit Ausrücken, die beim Schreiben in die Datei ersetzt werden mit ''' ''' markiert, Ausdrücke stehen in Bsp.: def writeletterto (Person p) ''' Dear «p.forename», bla bla foo Yours sincerely, Joe Developer ''' «signature» Einrückungen für Blockorientierte Zielsprachen berechnet 15

Ausdrücke in Rich Strings Eingebettete Bedingungen Bedingte Evaluierung de jeweils zw. «IF» «ELSE IF» «ELSE» «ENDIF» Eingeschlossenen Blöcke Bsp.: Hello «IF name!= null» «name» «ELSE» Mr. X«ENDIF»! Eingebettete Schleifen Schleife umblock zwischen «FOR» und «ENDFOR» Bsp.: «FOR attr : bo.attributes» private String «attr.name»; «ENDFOR» 16

Outlets Konfigurierbare Zielordner Haben logischen Namen Nutzer des Generators deklariert für jedes Outlet einen Basisordner Artefakte beim Generieren unterhalb eines passenden Zielordners ablegen z.b. Java getrennt von XML Bsp.: Im Generatorskript: outlet = { outletname = 'Java' path = "src/generated/java" Im Template: def generate (BusinessObject bo, IFileSystemAccess fsa) { fsa.generatefile (bo.topojofilename, "Java", content) 17

Konfiguration / @Inject Implementierungen ersetzen mit Guice => Subklassen bzw. Interface- Implementierung nutzen Bsp.: class UIModelGenerator { @Inject IImportsProvider impprov def generate (BusinessObject bo) toimports ( impprov.getimports(bo) ) class MyImportProvider implements IImportProvider { override getimports (BusinessObject bo) { 18

Konfiguration / @Inject cont Konfiguration erfolgt in Guice-Module für Xtext GeneratorComponent Guice Module wird in einer Implementierung von ISetup angelegt ISetups werden bei der GeneratorComponent registriert Oder einfach in Java main() Bsp.: public class MyGeneratorModule extends AbstractModule { public void configure () { bind (IImportProvider.class).to (MyImportProvider.class); 19

Workflow Engine MWE2 ANT ähnliches Scripting von Generatoraufrufen Basiert auf Xtext und dem alten MWE Workflow besteht aus Components Reader zum Modell einlesen Generator zum Generieren Workflows können wie Komponenten behandelt werden Workflows können Workflows aufrufen 20

HANDS ON 2012 anderscore GmbH