DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf ·...

51
DSL á la Groovy - Sprechen Sie Domänisch? Bernd Schiffer [email protected] Mitarbeit: Stefan Roock [email protected]

Transcript of DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf ·...

Page 1: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy -Sprechen Sie Domänisch?

Bernd Schiffer

[email protected]

Mitarbeit: Stefan Roock

[email protected]

Page 2: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 2

+49 172 44 256 68

Herzlich Willkommen!Stefan Roock

� akquinet AG

� Coach für agile Methoden, Projektleiter, Softwarearchitekt

� XP, Scrum, Akzeptanztests, TDD, Refactoring …

Bernd Schiffer

� akquinet AG

� Softwareentwickler

� XP, Scrum, TDD, Groovy, Grails

Page 3: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 3

+49 172 44 256 68

Was Sie heute erwartet

� Was sind DSLs?

� Beispiele für DSLs

� Von Java zur Groovy-DSL in 8 Schritten

� MOP in Groovy

� Builder in Groovy

Page 4: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 4

+49 172 44 256 68

Historie: Little Languages

DSLanguage� strukturierte Sprache

� keine Turingvollständigkeit erforderlich

Page 5: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 5

+49 172 44 256 68

Fachlicher Bezug

DomainSpecificL� Text oder Grafik (oder Audio)

Page 6: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 6

+49 172 44 256 68

Gegenteil von DSL

GeneralPurposeLanguage� „gängige“ Programmiersprachen

(etwa Java, C#, Perl, Ruby, Groovy, Python, Smalltalk)

� turingvollständig

� Datentypen/Objekte (z.B. Listen, Bäume)

Page 7: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 7

+49 172 44 256 68

Konkret vs. Abstrakt

DSL vs. GPL

Page 8: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 8

+49 172 44 256 68

DSL-Qualitätsansprüche

�Schreibbarkeit

�Lesbarkeit

�Testbarkeit

�Erweiterbarkeit

Page 9: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 9

+49 172 44 256 68

Beispiel

1.e2 – e4

2.e7 – e5

3.Sg1 – f3

4.Sb1 – c3

5.Lg1 – b2 Schach

Page 10: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 10

+49 172 44 256 68

Beispiel

♥A ♥K ♥Q ♥J ♥T

Texas Hold‘em Poker

Page 11: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 11

+49 172 44 256 68

Beispiel

MusikSergey Rachmaninov

Page 12: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 12

+49 172 44 256 68

Beispiel

— · — · · · — · ·

· — · · · · — · · · — — · — — ·

K e i n e

A h n u n g

Morsecode

Page 13: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 13

+49 172 44 256 68

Beispiel

EKG

Page 14: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 14

+49 172 44 256 68

Beispiel

SELECT *

FROM adresse

WHERE ...

SQL

Page 15: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 15

+49 172 44 256 68

Beispiel

[A-Z0-9 ]?Hauptstraße 42 (no go)HAUPTSTRASSE 42 (go)

RegExp

Page 16: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 16

+49 172 44 256 68

Externe vs. Interne� external DSL

� yacc

� lex

� awk

� ANTLR

� internal DSL

� basiert auf General Purpose Language

� „Jede iDSL ist in einer GPL ausführbar!“

Page 17: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 17

+49 172 44 256 68

Text vs. Grafik vs. Audio

Text

Grafik

Schach PokerMusik

Morse-code

EKGSQL

RegExpAudio

Terrain von Groovy!

Page 18: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 18

+49 172 44 256 68

DSL in Groovy in 8 Schritten (1/8)

new Meter(2000)

.plus(

new Kilometer(3))

Page 19: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 19

+49 172 44 256 68

DSL in Groovy in 8 Schritten (2/8)

new M(2000)

.plus(

new KM(3))

Page 20: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 20

+49 172 44 256 68

DSL in Groovy in 8 Schritten (3/8)

new m(2000)

.plus(

new km(3))

Page 21: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 21

+49 172 44 256 68

DSL in Groovy in 8 Schritten (4/8)

new Distance(2000)

.getM().plus(

new Distance(3)

.getKm())

Page 22: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 22

+49 172 44 256 68

DSL in Groovy in 8 Schritten (5/8)

new Distance(2000).m

.plus(

new Distance(3).km)Ab hier wird‘s Groovy: Property-Notation

Page 23: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 23

+49 172 44 256 68

DSL in Groovy in 8 Schritten (6/8)

2000.m.plus(3.km)

Groovy-MOP:z.B. Category!

Page 24: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 24

+49 172 44 256 68

DSL in Groovy in 8 Schritten (7/8)

2000.m + 3.km

Operator-Overloadingmit Groovy!

Page 25: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 25

+49 172 44 256 68

DSL in Groovy in 8 Schritten (8/8)

2000 m + 3 km

Kein Groovy:Reguläre Ausdrücke!

Page 26: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 26

+49 172 44 256 68

Von Drinnen nach Draußen

2000 m + 3 km

2000.m + 3.km

External DSL

Internal DSL

Page 27: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 27

+49 172 44 256 68

Code zum ersten Schrittassert new Meter(5000) ==

new Meter(2000).plus(

new Kilometer(3))

class Kilometer {

def meter

Kilometer(kilometer){

meter = kilometer * 1000

}

}

class Meter {

def meter

Meter(meter) {this.meter = meter

}

def plus(kilometer) {new Meter(

meter + kilometer.meter)}

boolean equals(other) {this.meter == other.meter

}

}

Page 28: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 28

+49 172 44 256 68

Code zum zweiten/dritten Schritt

2. new M(2000).plus(new KM(3))

3. new m(2000).plus(km(3))

Sparen wir uns, oder?! ;-)

Page 29: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 29

+49 172 44 256 68

Code zum vierten Schrittassert new Meter(5000) ==

new Distance(2000).getM().plus(new Distance(3).getKm())

class Meter {/* keine Änderungen*/

}

class Kilometer {/* keine Änderungen*/

}

class Distance {

def distance

Distance(distance) {this.distance = distance

}

def getM() {new Meter(distance)

}

def getKm() {new Kilometer(distance)

}

}

Page 30: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 30

+49 172 44 256 68

Code zum fünften Schritt5. new Distance(2000).m.plus(

new Distance(3).km)

Keine Änderung am Code notwendig, da

Property-Notation

Page 31: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 31

+49 172 44 256 68

Code zum sechsten Schrittuse(Distance) {

assert 5000.m == 2000.m.plus(3.km)

}

class Meter { /*...*/ }class Kilometer { /*...*/ }

class Distance {

static def getM(distance) {new Meter(distance)

}

static def getKm(distance) {new Kilometer(distance)

}

}

/* VORHER!! */class Distance {

def distance

Distance(distance) {this.distance = distance

}

def getM() {new Meter(distance)

}

def getKm() {new Kilometer(distance)

}

}

Page 32: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 32

+49 172 44 256 68

Code zum siebten Schritt

7. 2000.m + 3.kmKeine Änderung am Code

notwendig, da

Operator-Overloading

Page 33: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 33

+49 172 44 256 68

Code zum finalen achten Schrittuse(Distance) {

assert werteAus('5000 m == 2000 m + 3 km')

}

def werteAus(String anweisung) {evaluate(

anweisung.replaceAll(/ (k*m)/, {alle, eineit -> ".${einheit}"

}))

}

Page 34: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 34

+49 172 44 256 68

MOP – Mein ominöses Programm?� MOP heißt

� Meta-Object Protocol

� Meta(-Object) Programming

� Verarbeitet unbekannte Signale

� Methoden

� In Groovy auf vielerlei Weise erreichbar

� Category

� invokeMethod()

� Custom Metaclass

� Injected Metaclass

� ExpandoMetaClass

Page 35: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 35

+49 172 44 256 68

Beispiel: ExpandoMetaClassgroovy> class Stefan {}

groovy> stefan = new Stefan()

groovy> stefan.sagWas()

Exception thrown:

groovy.lang.MissingMethodException: No signature

of method: Stefan.sagWas() is applicable for

argument types: () values: {}

Unbekannte Methode!

Unbekannte Methode!

Page 36: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 36

+49 172 44 256 68

Beispiel: ExpandoMetaClassgroovy> class Stefan {}

groovy> stefan = new Stefan()

groovy> stefan.metaClass.sagWas =

{println 'Sorry, konnte heute leider nicht...'}

groovy> stefan.sagWas()

Sorry, konnte heute leider nicht...

Page 37: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 37

+49 172 44 256 68

DSLs für Bäume� Beispiele für Bäume

� XML, HTML

� Datenabfragen (SQL, HQL, ...)

� Jason, YAML, ODGL

� Swing

� Ant

� proprietär

Page 38: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 38

+49 172 44 256 68

Groovy-Bäume – noch ein Beispiel<vorträge>

<vortrag nummer="1" titel="Groovy – eine Einführung"><sprecher name="Joachim Baumann" />

</vortrag><vortrag nummer="2" titel="Groovy für Fortgeschrittene">

<sprecher name="Dierk König" /></vortrag><vortrag nummer="3" titel="GTDD">

<sprecher name="Stefan Roock" /><sprecher name="Bernd Schiffer" />

</vortrag></vorträge>

Page 39: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 39

+49 172 44 256 68

XML in Groovy-Notationvorträge {

vortrag(nummer:1, titel: 'Groovy – eine Einführung') {

sprecher(name:'Joachim Baumann')

}

vortrag(nummer:2, titel:'Groovy für Fortgeschrittene') {

sprecher(name:'Dierk König')

}

vortrag(nummer:3, titel:'GTDD') {

sprecher(name:'Stefan Roock')

}

}

interneDSL

Page 40: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 40

+49 172 44 256 68

Kann aus externem

File geladen werden!

Embedded internal DSLdsl = '''vorträge {

vortrag(nummer:1,

titel:'Groovy – eine Einführung') {

sprecher(name:'Joachim Baumann')

}

}'''

writer = new StringWriter()

builder = new groovy.xml.MarkupBuilder(writer)

evaluate("builder.$dsl")

result = writer.toString()

Page 41: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 41

+49 172 44 256 68

Der Datenzugriff – Voll Groovy!dsl = '''vorträge {

vortrag(nummer:1, titel:'Groovy – eine Einführung') {

sprecher(name:'Joachim Baumann')

}

}'''

result = ... // vom MarkupBuilder bekommen

vorträge = new XmlSlurper().parseText(result)

assert 'Joachim Baumann' ==

vorträ[email protected]()

GPathResult

Page 42: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 42

+49 172 44 256 68

Voll Groovy in DSL – aber Vorsicht!vorträge {

def alleTitel = ['Groovy – eine Einführung','Groovy für Fortgeschrittene','GTDD']

def alleSprecher = ['Joachim Baumann','Dierk König','Stefan Roock']

alleTitel.eachWithIndex{ titel, index ->

vortrag(nummer:index + 1, titel:titel) {

sprecher(name:alleSprecher[index])

}}}

Ob das der Kunde

noch versteht?

Page 43: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 43

+49 172 44 256 68

DSL: Kunde-Entwickler-Kanal

KundeEntwickler

Domäne

� e2 – e4

� e7 – e5

� Sg1 – f3

� Sb1 – c3

� Lg1 – b2DSL

Schlecht, wenn der Kunde das nicht mehr versteht!

Page 44: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 44

+49 172 44 256 68

Wie baue ich einen Builder?� Implementiere groovy.util.BuilderSupport –

und fertig!class XBuilder extends BuilderSupport {

void setParent(parent, node) {}

def createNode(Object name) {}

def createNode(Object name, Object value) {}

def createNode(Object name, Map attributes) {}

def createNode(Object name, Map attributes, Object value) {}

}

Page 45: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 45

+49 172 44 256 68

Andere Formate

Das Ziel

vorträge

vortrag["titel":"Groovy – eine Einführung", "nummer":1]

sprecher["name":"Joachim Baumann"]

Page 46: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 46

+49 172 44 256 68

Andere Formateclass XBuilder extends BuilderSupport {

int level

StringBuffer markup =

new StringBuffer()

void setParent(parent, node) {}

void nodeCompleted(parent, node) {

level++

}

def createNode(Object name) {

write(name + attributes)

}

String toString() { markup }

def createNode(Object name,

Map attributes) {

write(name + attributes)

}

def createNode(Object name,

Map attributes,

Object value) {}

def write(string) {

markup << indent() + string + '\n'

level++

markup

}

def indent() { (' ' * level) }

}

Page 47: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 47

+49 172 44 256 68

AntBuilderdef vortragende = ['Stefan', 'Joachim', 'Dierk']

def ant = new AntBuilder()

vortragende.each{

ant.mail(mailhost: 'my.email.server',

subject : 'build ist fertig') {

from(address: '[email protected]')

to(address: "[email protected]")

message("Hey $it, denk' an Deinen Vortrag heute! Gruß, Bernd!")

}

}

Page 48: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 48

+49 172 44 256 68

SwingBuilderimport groovy.swing.SwingBuilder

frame =

new SwingBuilder().frame(

title:'Buchstabenzähler') {

label = label(

text:'Buchstaben werden' +

'gezählt...')

}

frame.pack()

frame.show()

while(true) {

label.text =

new File(args[0]).text.size()

sleep 200

}

Page 49: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 49

+49 172 44 256 68

HibernateCriteriaBuilder

def c = Account.createCriteria()

def results = c {

like("holderFirstName", "Fred%")

and {

between("balance", 500, 1000)

eq("branch", "London")

}

maxResults(10)

order("holderLastName", "desc")

}

Quelle: http://grails.codehaus.org/Hibernate+Criteria+Builder

Fundgrube an MOP- & DSL-Beispielen!

Page 50: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 50

+49 172 44 256 68

Lust bekommen auf mehr?� Groovy: http://groovy.codehaus.org

� Groovy-Mailinglisten: http://groovy.codehaus.org/Mailing+Lists

� Grails: http://grails.org/

Page 51: DSL ála Groovy - Sprechen Sie Domänisch?alt.java-forum-stuttgart.de/jfs/2007/folien/C7.pdf · 2007. 7. 6. · DSL á la Groovy – Sprechen Sie domänisch? 2 +49 172 44 256 68 Herzlich

DSL á la Groovy – Sprechen Sie domänisch? 51

+49 172 44 256 68

Noch Fragen?

Vielen Dank für die Aufmerksamkeit