1. Enterprise-class DSLs
in
Groovy & Grails
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
1
2. About me
Strategic IT consultant
Trainer
- Skills Matter, ...
Articoli
- Mokabyte, …
Blogger
- Ziobrando’s Lair
“animatore” di Community
- Grails-IT
- DDD-IT
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
2
3. A cosa serve un DSL?
Un DSL è uno strumento per la condivisione di
informazioni specializzato per uno specifico
contesto
Mettere la foto di
- dominio del problema un addetto
all’atterraggio
- ruoli coinvolti
- ambito di applicazione
- Facilita la condivisione di informazioni (precise e
prive di ambiguità) all’interno di un gruppo
- si tratta di uno strumento per migliorare
l’efficienza della comunicazione
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
3
4. … un classico esempio di DSL
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
4
5. Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un Domain Specific Language nasce per coprire un’esigenza di comunicazione in un contesto5specifico
indirizzando alcuni elementi della comunicazione: l’impossibilità di utilizzare determinati canali (in
questo caso l’audio), la necessità di comunicare con maggiore rapidità e precisione, la necessità di
essere sintetici
6. Ecosistema di progetto
Domain
Analyst
Expert
Specification
Architect Tester
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
7. Ecosistema di progetto
DSL
Domain
Analyst
Expert
Specification
Architect Tester
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
8. Ecosistema di progetto
DSL ?
Domain
Analyst
Expert
Specification
Architect Tester
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
9. Ecosistema di progetto
DSL ?
Domain
Analyst
Expert
Specification
UML
Architect Tester
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
10. Ecosistema di progetto
DSL ?
Domain
Analyst
Expert
Specification
UML
Architect Tester
Java
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
11. Ecosistema di progetto
DSL ?
Domain
Analyst
Expert
Specification
Java
UML
Architect Tester
Java
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
12. Ecosistema di progetto
DSL ?
Domain
Analyst
Expert
Specification
Java
UML
Architect Tester
SQL
Java
Code
DBA
Developer
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un DSL è comunque uno strumento di comunicazione: perchè sia eficace la comunicazione deve
6
coinvolgere almeno due soggetti che condividano informazioni.
In un classico contesto di progetto sono presenti diversi ruoli che fanno uso d diversi linguaggi.
Esistono DSL specificati per determinati compiti, ma ciò che può avere impatto sul nostro modo di
produrre software è rappresentato dal DSL specifico del dominio applicativo, ovvero della lingua
parlata dall’esperto di dominio.
13. Avviciniamo i contesti
Domain
Analyst
Expert
Specification
Tester
Architect
Code
Developer DBA
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Potendo intervenire sulla forma dell’applicazione e sulla lingua utilizzata al suo interno, possiamo
7
avvicinare mondi diversi. Possiamo avere maggiore controllo sulla corrispondenza tra il codice
applicativo e le specifiche e ridurre molto del fardello di overhead e sincronizzazione legato alla
presenza di due “viste” sulla stessa applicazione.
14. Avviciniamo i contesti
Domain
Analyst
Expert
Specification
qui può succedere
qualcosa di interessante
Tester
Architect
Code
Developer DBA
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Potendo intervenire sulla forma dell’applicazione e sulla lingua utilizzata al suo interno, possiamo
7
avvicinare mondi diversi. Possiamo avere maggiore controllo sulla corrispondenza tra il codice
applicativo e le specifiche e ridurre molto del fardello di overhead e sincronizzazione legato alla
presenza di due “viste” sulla stessa applicazione.
15. DSL in Enterprise Application
...scrivere codice che si possa leggere e capire a
colpo d’occhio.
A chi giova?
- codice applicativo più conciso e self-explaining
- possibilità di controllare la più rapidamente la
correttezza e/o la corrispondenza alle specifiche
- scrittura di test più veloce
- scrittura di test allargata a ruoli tradizionalmente
esclusi
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Quindi è interessante notare che il focus si sposta sul codice di test: abbiamo qualche vantaggio 8
significativo a livello di codice applicativo, che risulta più leggibile e privo di fronzoli (basti pensare alle
acrobazie necessarie per gestire i BigDecimal o le Date.
16. Different approcci ali DSL
Vari approcci al problema:
Parser/interpreti interni all’applicazione
Scrittura di codice self-explaining
Domain Driven Design, fluent interfaces
Generazione specializzata di codice applicativo
Intentional Software, MDA, …
…
Espansione delle possibilità espressive del linguaggio
C++, Groovy, ...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Dove l’esigenza di conformarsi ad un SL già esistente era particolarmente forte, si è fatto ricorso ad
9
interpreti/parser dedicati, che permettessero l’uso del DSL nelle applicazioni.
Altri tentativi sono stati legati alla possibilità di rendere il codice più accessibile, ma la verbosità
tecnologica di Java ha ostacolato questa direzione.
Un’altra strada è quella legata alla generazione di codice a partire da una specifica espressa in una
sorta di DSL (quindi realizzando l’applicazione in due fasi) separate.
Infine (ed è la zona in cui si colloca Groovy) c’è la possibilità di allargare le possibilità espressive del
linguaggio stesso, sfruttandone le possibilità di espansione.
17. DSL in Groovy
Groovy introduce nuovi strumenti che aprono scenari
sulla JVM:
- overloading degli operatori
- object orientation completa
- coercition dei tipi numerici
- risoluzione dinamica dei metodi
- strumenti di metaprogrammazione
- … piccole “chicche” sparse qua e la.
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Groovy in questo senso rappresenta un passo in avanti notevole rispetto a Java, la cui struttura non era
10
suficientemente flessibile.
Matte infatti a disposizione una serie di strumenti legati alle sue caratteristiche di linguaggio dinamico
che permettono di raggiungere risultati interessanti, senza arrivare alla complicazione di un parser
dedicato.
18. Money: obiettivi
Vogliamo esplorare le
- Domain Class
possibilità di scrittura di
in Groovy
queste componenti offerte
da Groovy
- Value Object
riutilizzabile
Approccio white-box,
- Aritmetica
partendo dal foglio bianco
Domain
(?)
Specific
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Come primo esempio delle possibilità oerte da Groovy, esaminiamo la possibilità di definire11un
piccolo dialetto legato alle operazioni finanziarie, gestendo quindi una “tipica” classe Money
19. DDD Value Object
In Domain Driven Design un Value Object è un
oggetto caratteristico del dominio applicativo:
immutabile
condivisibile
privo di identità specifica
La presenza dei Value Object è un elemento
caratterizzante dei Rich Domain Model
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Money, rappresenta un classico esempio di Value Object, secondo la classificazione di DDD. 12
Non c’è una corrispondenza precisa tra VO e DSL, i due concetti sono in larga parte ortogonali, tuttavia
buona parte dei DSL “general purpose” quindi legati a più domini applicativi sono basati su concetti
che ricadono in questa categoria. Gli strumenti oerti da Groovy al riguardo, rendono estremamente
conveniente arontare il problema in quest’ottica.
20. Time and Money
Libreria Java open source “emanazione” di Domain
Driven Design
Tipi di dato riutilizzabili in svariati dominii
alcuni problemi ricorrenti già affrontati:
precisione del calcolo finanziario,
usabilità delle date
persistenza dei tipi di dato
Maggiore espressività e chiarezza
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Come esempio di riferimento prendiamo quindi l’implementazione di Money, definita dalla libreria
13
Time and Money, con l’obiettivo di verificare costi e benefici di una “riscrittura” in Groovy
21. Java “blocca la strada”
BigDecimal non è un tipo numerico primitivo
Operatori aritmetici da ridefinire
Cambiamento di tipo tutt’altro che fluido Come sono
arrivato a
Comportamento non sempre “user friendly” questa
situazione?
java.lang.AssertionError: expected:EUR 4 but was:
EUR 4.0000000000000002220446049250313080847263336181640625
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
La scrittura di una componente relativamente semplice, ha però in Java qualche complicazione in più
14
del previsto, legata al fatto che BigDecimal NON è un tipo primitivo, quindi anche l’autoboxing di java
5 non ci aiuta più di tanto.
In particolare va rimarcato che BigDecimal ha un comportamento diverso nel caso sia invocato come
new BigDecimal(...) rispetto a BigDecimal.valueOf(...) con lo stesso argomento!
22. ...una buona notizia
La scrittura della classe, a parità di test superati, ha
richiesto circa la metà del codice:
Sintassi più concisa
gestione dei BigDecimal molto smooth (via coercition)
Alcuni metodi di utilità non più necessari
Zucchero sintattico decisamente demodè
Non solo…
l’overloading degli operatori permette di scrivere:
Money tenEuros = Money.euros(10)
Money twentyEuros = Money.euros(20)
assert twentyEuros == tenEuros + tenEuros
assert twentyEuros == tenEuros * 2
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Tenendo ferme le caratteristiche definite dalla suite di test la scrittura del codice si è rivelata 15
molto più
agevole, tanto in lunghezza, che in complessità.
Molti metodi erano relativi a problematiche che in Groovy sono assolte direttamente dalla piattaforma,
altre risultano obsolete dalle possibilità oerte dalla meta programmazione. L’overloading degli
operatori premette già di trattare Money come un tipo primitivo.
23. The comparable bug
junit.framework.AssertionFailedError:
expected:EUR 10 but was:EUR 10.00
Scompaiono anche i problemi nella gestione della
precisione… (sembra troppo facile…)
... in effetti era un bug
Groovy usa compareTo() dietro le quinte se si
invoca ‘==’ su un Comparable
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Qualche piccola sorpresa legata ad un problema “atteso” ma non presentatosi. Si tratta in realtà di
16
un’anomalia “benigna” di Groovy, ma che sarà corretta prima o poi. Nel nostro caso l’implementazione
corrente fa al caso nostro, ma dovremo verificare il comportamento con le prossime versioni del
linguaggio.
24. Money - continued
E’ necessario intervenire più in
- Creazione
profondità per rendere la cosa
delle istanze
più interessante
di Money
- reversibilità
Entra in gioco la
delle
ExpandoMetaClass
operazioni
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
… Quanto fato fino adesso è già piuttosto interessante, ma possiamo fare di meglio. la 17
metaprogrammazione in Grovy ci permette di manipolare le classi Java e Groovy, spingendole oltre
l’immaginazione dei progettisti originari.
25. Expando Meta Class
EMC permette di aggiungere
nuovi comportamenti alle
classi già esistenti, a run Currency currency
BigDecimal amount
time, senza modificarne il plus(...)
codice minus(...)
...
Currency currency
BigDecimal amount
multiply(..)
getReference()
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In particolare ci interesserà l’operatore ‘.’ corrispondente al metodo getReference, che simula18
l’invocazione di un metodo getter su una property che non esiste nella classe originaria ma che
abbiamo definito nella corrispondente MetaClass
26. I soldi iniziano a girare...
assert 20.EUR == 10.EUR + 10.EUR
assertEquals 45.EUR, 9.EUR * 5
assertEquals 45.EUR, 5 * 9.EUR
assertEquals 4.EUR, 36.EUR / 9
assertEquals 4, 36.EUR / 9.EUR
assert 4.EUR == 1.60.EUR * 2.5
assertEquals 4.EUR, 1.60.EUR * 2.5
assertEquals 250.EUR, (10.EUR + 15.EUR) * 10
assertEquals 25.EUR, (100.EUR + 150.EUR) / 10
assertEquals 2.5.EUR, (10.EUR + 15.EUR) / 10
assertEquals 250.EUR, 10 * (10.EUR + 15.EUR)
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In Groovy tutto è un oggetto, quindi anche gli interi ed i decimali lo sono. 19
Fornendo una Closure di valutazione innescata dalla ricerca di una property sulle classi numeriche, ed
associandola alla MetaClass dele classi numeriche possiamo intercettare la valutazione della notazione
postfissa e piegarla alle nostre esigenze.
27. ...proviamo a spingerci oltre...
assertEquals 250.€, 10.€ * 25
Funziona! :-)
assertEquals 250.£, 10.£ * 25
Errore di compilazione :-(
assertEquals 250.$, 10.$ * 25
...Pure peggio :-(
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
E’ abbastanza interessante notare che l’ipotetico passo successivo ci viene però sbarrato dalla 20
struttura del linguaggio, in maniera asimmetrica rispetto ala valuta utilizzata. In particolar modo per il
tradizionale ruolo del simbolo ‘$’ come operatore.
… non resta che passare alla moneta unica!
28. Però, così
facendo,
finisco per
attribuire alla
classe Number
responsabilità
che non le
competono,
violando uno
dei principi
della OOP
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Stiamo definendo nuovi modi per creare istanze della classe Money, ma stiamo distribuendo il codice
21
di pertinenza nelle gerarchie della classi numeriche che dovrebbero restare agnostiche rispetto a
Money. Le classi della famiglia Number non vengono toccate direttamente, però non stiamo lavorando
in modalità OOP “canonica”
29. Legacy e Black Bok
Il foglio bianco è il sogno di ogni
- maggiore
programmatore.
espressività
su librerie La dura realtà ...è il legacy.
Java
- reversibilità Vorremmo avere le stesse
possibilità espressive, senza
delle
operare in modalità white-box
operazioni
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
La prova eetuata su Money, è interessante, ma non è forse realistica. In un contesto reale non sempre
22
godiamo del privilegio di poter “riscrivere tutto in groovy”, vediamo che si può fare in modalità:
30. Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
non vedo, non sento, non parlo. 23
31. Joda Time
Libreria con funzionalità avanzate per Date e Time
Candidata alla sostituzione di java.util.Date nelle
prossime versioni di Java
Supporto out-of-the box per Hibernate
supporto out-of-the box per JSP
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
24
32. Black Box approach
Prendendo in esame qualcosa di più complesso, ha
senso rivolgersi all’esistente.
In ambito DSL alcune aree di maggior complessità
risultano già coperte:
- Date ed Intervalli con Time and Money
- Date ed Intervalli con Groovy (Duration, etc.)
- Joda Time
- JScience
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
25
33. JScience
Libreria con supporto per:
- unità di misura (SI)
- quantità
- calcoli type-safe
Amount m3 = Amount.valueOf(3, KILO(GRAM));
Amount m2 = Amount.valueOf(“2 Kg”);
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
26
34. Il punto della situazione
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Ho molti potenziali candidati a diventare DSL utili all’interno del mio contesto applicativo, in 27
particolare per le aree dove la sintassi del inguaggo java si dimostra particolarmente infelice (le date
sono un esempio lampante). Ciò spingerebbe verso una modularizzazione ed un uso estensivo dei
DSL.
D’altra parte l’implementazione dei DSL è semplice in termini di righe di codice, ma decisamente
complicata in termini di debugging, per cui sarabbe bene che fosse il più possibile disaccoppiata dal
codice applicativo.
35. Il punto della situazione
Molti DSL già
disponibili “off
the shelf” :-)
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Ho molti potenziali candidati a diventare DSL utili all’interno del mio contesto applicativo, in 27
particolare per le aree dove la sintassi del inguaggo java si dimostra particolarmente infelice (le date
sono un esempio lampante). Ciò spingerebbe verso una modularizzazione ed un uso estensivo dei
DSL.
D’altra parte l’implementazione dei DSL è semplice in termini di righe di codice, ma decisamente
complicata in termini di debugging, per cui sarabbe bene che fosse il più possibile disaccoppiata dal
codice applicativo.
36. Il punto della situazione
Molti DSL già
disponibili “off possibilità
the shelf” :-) espressive
interessanti :-)
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Ho molti potenziali candidati a diventare DSL utili all’interno del mio contesto applicativo, in 27
particolare per le aree dove la sintassi del inguaggo java si dimostra particolarmente infelice (le date
sono un esempio lampante). Ciò spingerebbe verso una modularizzazione ed un uso estensivo dei
DSL.
D’altra parte l’implementazione dei DSL è semplice in termini di righe di codice, ma decisamente
complicata in termini di debugging, per cui sarabbe bene che fosse il più possibile disaccoppiata dal
codice applicativo.
37. Il punto della situazione
Molti DSL già
disponibili “off possibilità
the shelf” :-) espressive
interessanti :-)
Debugging dei
DSL :-(
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Ho molti potenziali candidati a diventare DSL utili all’interno del mio contesto applicativo, in 27
particolare per le aree dove la sintassi del inguaggo java si dimostra particolarmente infelice (le date
sono un esempio lampante). Ciò spingerebbe verso una modularizzazione ed un uso estensivo dei
DSL.
D’altra parte l’implementazione dei DSL è semplice in termini di righe di codice, ma decisamente
complicata in termini di debugging, per cui sarabbe bene che fosse il più possibile disaccoppiata dal
codice applicativo.
38. Il punto della situazione
Molti DSL già
disponibili “off possibilità
the shelf” :-) espressive
interessanti :-)
Debugging dei
DSL :-( I DSL agiscono
sulle stesse
Classi chiave :-/
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Ho molti potenziali candidati a diventare DSL utili all’interno del mio contesto applicativo, in 27
particolare per le aree dove la sintassi del inguaggo java si dimostra particolarmente infelice (le date
sono un esempio lampante). Ciò spingerebbe verso una modularizzazione ed un uso estensivo dei
DSL.
D’altra parte l’implementazione dei DSL è semplice in termini di righe di codice, ma decisamente
complicata in termini di debugging, per cui sarabbe bene che fosse il più possibile disaccoppiata dal
codice applicativo.
39. Il punto della situazione
Molti DSL già
disponibili “off possibilità
the shelf” :-) espressive
interessanti :-)
Debugging dei
Sovrapposizioni
DSL :-( I DSL agiscono
fra i differenti
sulle stesse
dialetti :-/
Classi chiave :-/
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Ho molti potenziali candidati a diventare DSL utili all’interno del mio contesto applicativo, in 27
particolare per le aree dove la sintassi del inguaggo java si dimostra particolarmente infelice (le date
sono un esempio lampante). Ciò spingerebbe verso una modularizzazione ed un uso estensivo dei
DSL.
D’altra parte l’implementazione dei DSL è semplice in termini di righe di codice, ma decisamente
complicata in termini di debugging, per cui sarabbe bene che fosse il più possibile disaccoppiata dal
codice applicativo.
40. Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Gli eetti della sovrapposizione degli interventi sulle stesse classi chiave possono infatti essere
28
sorprendenti e presentarsi in aree applicative molto lontane da dove il problema è stato eettivamente
introdotto.
41. Groovy
è bestiale, posso
scrivere i miei
DSL!!
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Gli eetti della sovrapposizione degli interventi sulle stesse classi chiave possono infatti essere
28
sorprendenti e presentarsi in aree applicative molto lontane da dove il problema è stato eettivamente
introdotto.
42. Groovy
Fico!
è bestiale, posso
...quasi quasi me
scrivere i miei
ne faccio uno
DSL!!
anche io...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Gli eetti della sovrapposizione degli interventi sulle stesse classi chiave possono infatti essere
28
sorprendenti e presentarsi in aree applicative molto lontane da dove il problema è stato eettivamente
introdotto.
43. Groovy
Fico!
è bestiale, posso
...quasi quasi me
scrivere i miei
ne faccio uno
DSL!! Grande!
anche io...
posso riscrivere
la grammatica del
linguaggio!!!
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Gli eetti della sovrapposizione degli interventi sulle stesse classi chiave possono infatti essere
28
sorprendenti e presentarsi in aree applicative molto lontane da dove il problema è stato eettivamente
introdotto.
44. Groovy
Fico!
è bestiale, posso
...quasi quasi me
scrivere i miei
ne faccio uno
DSL!! Grande!
anche io...
posso riscrivere
la grammatica del Credono
linguaggio!!! di essere capaci
solo loro? Mo’ gli
faccio vedere...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Gli eetti della sovrapposizione degli interventi sulle stesse classi chiave possono infatti essere
28
sorprendenti e presentarsi in aree applicative molto lontane da dove il problema è stato eettivamente
introdotto.
45. Groovy
Fico!
è bestiale, posso
...quasi quasi me
scrivere i miei
ne faccio uno
DSL!! Grande!
anche io...
posso riscrivere
la grammatica del Credono
linguaggio!!! Hey! di essere capaci
solo loro? Mo’ gli
ho quest’errore
faccio vedere...
strano...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Gli eetti della sovrapposizione degli interventi sulle stesse classi chiave possono infatti essere
28
sorprendenti e presentarsi in aree applicative molto lontane da dove il problema è stato eettivamente
introdotto.
46. Multiple DSL
- Fare convivere Un unico punto di innesco
configurabile per più DSL
più DSL nello
stesso
contesto DSL Modulari e componibili
applicativo
- Separazione
netta delle
responsabilità
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Vorremmo quindi la possibilità di disporre di un punto di controllo centralizzato per coordinare più
29
DSL a granularità fine. Ovviamente supponendo che questo siano adeguatamente testati e supportati
così da poterci eettivamente concentrare solo sul codice applicativo con in più le nuove potenzialità
espressive.
47. DSL Descriptor
Repository di delle caratteristiche specifiche del
nostro DSL
parole chiave
operatori
operazioni di setUp
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Un primo elemento di questo nuovo approccio è la definizione d un descrittore del DSL che esponga le
30
caratteristiche specifiche del nostro DSL in formato standard.
48. Scenario Money
Corretta allocazione
Interface
delle responsabilità
DSLDescriptor
getPostfix
tra la classe ed il
Operation
descrittore
Riscruttura del codice
Money
MoneyDSLDescriptor
Currency currency
Attribute
Interazione con i tipi
BigDecimal amount
Attribute
plus(...)
Operation
primitivi
minus(...)
Operation
...
Number
Currency currency
BigDecimal amount
ExpandoMetaClass
multiply(..)
getReference()
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In uno scenario come quello di money, il descrittore si limita a coordinare le operazioni sulle 31
classi
esterne al subdominio (nel nostro caso la classe Number), mentre le classi caratteristiche del DSL
(Money) sono in grado di definire da sole il proprio comportamento.
49. Scenario Time and Money
Libreria
complessa e
già testata
Interface CalendarDate
DSLDescriptor plus(...)
getPostfix minus(...)
Maggiore ricorso
Operation ...
alla EMC
TimeInterval
plus(...)
TimeAndMoneyDSLDescriptor
minus(...)
Attribute
...
Attribute
Operation
Operation String
getReference
Number
ExpandoMetaClass
Currency currency
BigDecimal amount
multiply(..)
getReference()
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Nel caso Time Money, il nostro descrittore contiene una logica più complessa, e funge anche da32
repository delle closure di valutazione delle classi del sottodominio delle date, per i metodi non
direttamente esposti da queste.
50. DSLEngine
Un ruolo di coordinatore centralizzato per
l’attivazione simultanea di più DSL
Si aprono nuovi problemi:
- priorità nell’ordine della risoluzione
- sovrapposizione degli operatori
- registrazione e de-registrazione dei DSL
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Al centro di questo scenario si collocherà il nostro coordinatore. 33
Dotato di risoluzione della priorità di valutazione, di gestione dei conflitti tra operatori utilizzati da più
dialetti, e delle funzionalità di registrazione e de-registrazione dei DSL
51. Separazione delle
Interface Interface
DSLEngine DSLDescriptor
responsabilità:
Operation getPostfix
Operation Operation
Engine come punto
AbstractDSLDescriptor
di coordinamento
priority
Operation
Operation
Descriptor come
componente
MoneyDSLDescriptor TimeDSLDescriptor
pluggabile
Attribute Attribute
Attribute Attribute
Operation Operation
Operation Operation
QuantityDSLDescriptor JodaTimeDSLDescriptor
Attribute Attribute
Attribute Attribute
Operation Operation
Operation Operation
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
34
52. DSL Multipli
...perché limitarci ad uno solo quando possiamo
combinarne più di uno?
Interface Interface
DSLEngine DSLDescriptor
Operation getPostfix
Operation Operation
k,
M, ...
EUR,
USD, GBP MoneyDSLDescriptor QuantityDSLDescriptor
Attribute Attribute
Attribute Attribute
Operation Operation
Operation Operation
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Perchè è interessante combinare più DSL? 35
Perchè in determinate circostanze, l’unione di più componenti semplici può risultare significativa. in
questo caso combinando Money e Quantity abbiamo una grammatica abbastanza significativa.
53. DSL Compositi
A volte, la maggiore espressività si raggiunge
componendo frammenti di DSL separati
assert 20.k.EUR == 10.EUR * 2000
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Che permette una notazione sintetica dei grandi numeri combinando due grammatiche definite
36
indipendentemente l’una dall’altra.
54. DSL Compositi
A volte, la maggiore espressività si raggiunge
componendo frammenti di DSL separati
assert 20.k.EUR == 10.EUR * 2000
SL
yD
tit
an
Qu
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Che permette una notazione sintetica dei grandi numeri combinando due grammatiche definite
36
indipendentemente l’una dall’altra.
55. DSL Compositi
A volte, la maggiore espressività si raggiunge
componendo frammenti di DSL separati
assert 20.k.EUR == 10.EUR * 2000
SL
yD
L
tit
S
yD
an
ne
Qu
Mo
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Che permette una notazione sintetica dei grandi numeri combinando due grammatiche definite
36
indipendentemente l’una dall’altra.
56. Grails
Framework per lo sviluppo rapido di applicazioni Web
(ma non solo)
- basato su Groovy
- si appoggia su librerie Java note e provate
(Spring, Hibernate, Quartz, etc.)
- integrabile con svariate tecnologie
- La risposta a Ruby on Rails sulla JVM
- migliore curva di apprendimento dal mondo Java
- infrastruttura spesso già installata
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
37
57. Grails
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
58. Grails
s
as
- l
te n-c
ea ai
cr om
d
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
59. Grails
s
as
- l
te n-c
ea ai
cr om
d
class Persona {
String nome
String cognome
String e-mail
Date dataNascita
…
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
60. Grails
s
as
- l
te n-c
ea ai
cr om
d
class Persona {
String nome
String cognome
create-
String e-mail
controller
Date dataNascita
…
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
61. Grails
s
as
- l
te n-c
ea ai
cr om
d
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita }
…
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
62. Grails
s
as
- l
te n-c
ea ai
cr om
d
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita }
…
}
Persone
Id nome cognome eMail dataNascita
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
63. Grails
s
as
- l
te n-c
ea ai
cr om
d
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita
ew
vi }
ate- …
e
cr
}
Persone
Id nome cognome eMail dataNascita
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
64. Grails
s
as
- l
te n-c
ea ai
cr om
d
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita
ew
vi }
ate- …
e
cr
}
Persone
Id nome cognome eMail dataNascita
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
65. Grails
s
as
- l
te n-c
ea ai
cr om
d
Entity
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita
ew
vi }
ate- …
e
cr
}
Persone
Id nome cognome eMail dataNascita
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
66. Grails
s
as
- l
te n-c
ea ai
cr om
d
Entity
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita
ew
vi }
ate- …
e
cr
}
Value Object Persone
Id nome cognome eMail dataNascita
class Money {
Currency currency
BigDecimal amount
…
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
67. Grails
s
as
- l
te n-c
ea ai
cr om
d
Entity
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita
ew
vi }
ate- …
e
cr
}
? Value Object Persone
Id nome cognome eMail dataNascita
class Money {
Currency currency
BigDecimal amount
…
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
68. Grails
s
as
- l
te n-c
ea ai
cr om
d
Entity
class Persona {
String nome
class PersonaController {
String cognome def list = { … }
create-
String e-mail def create = { … }
controller …
Date dataNascita
ew
vi }
ate- …
e
cr
}
? ?
Value Object Persone
Id nome cognome eMail dataNascita
class Money {
Currency currency
BigDecimal amount
…
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In 2 parole: Grails permette di partire da una definizione estremamente sintetica delle classi di38
dominio, per generare lo strato di presentation (con navigazione e validazione del dato sulla base dei
constraints definiti dall’utente) e tutto il codice di gestione della persistenza (comprese del DDL di
popolamento del database) che permettono la realizzazione di una CRUD application in tempi
brevissimi
69. Value Object in Grails
Grails nasce privo del concetto di Value Object:
- il dominio applicativo nasce in corrispondenza 1-1
con il database sottostante
- localizzazione della logica applicativa nelle classi
di dominio
- La gestione di eventuali tipi di dato ricorrenti è
delegata a Hibernate via Gorm
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
39
70. Ed il nostro DSL?
Il supporto ai tipi di dato definiti dall’utente passa
attraverso:
- Grails Scaffolding
- che però riconosce e gestisce di default solo i tipi
primitivi
- GORM
- che delega la gestione agli User Type di Hibernate
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
40
71. Grails Scaffolding
Così com’è Grails non ci permette di trarre il meglio dal DSL e dai tipi di dato che lo
caratterizzano. La generazione delle pagine e dello strato di persistenza non ha infatti le
informazioni necessarie per generare pagine e database così come avviene per le classi di
dominio basate sui dati primitivi.
72. Obiettivi
Componente di presentation che
- Widget mirato sulle caratteristiche
specifiche del nostro oggetto
riutilizzabile
Grails deve essere in grado di
- integrato nel
riconoscere le istanze del
processo di
nostro oggetto ed integrarle nel
scaffolding proprio processo di creazione
della view
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Il nostro obiettivo è ora quello di verificare i punti di espansione e customizzazione oerti dalla
42
piattaforma per allargare le potenzialità di Grails anche al nostro DSL.
73. Tag Libraries in Java
La scrittura di una tag library in Java è un’operazione
abbastanza punitiva
- sintassi ed API di basso livello
- integrazione conl’ambiente di sviluppo non eccelsa
- processo di registrazione delle taglibraries
- … varie ed eventuali
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
43
74. Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Fortunatamente abbiamo scoperto chi è l’autore delle specifiche :-) 44
75. Tag Libraries
grails create-taglib
‐ grails crea il sorgente della
nostra Tag Library nella cartella
taglib
‐ contestualmente crea anche il
corrispondente test nella
cartella /test/integration
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
In grails la gestione delle tag libraries è largamente semplificata: 45
- si tratta di un’operazione gestita diretamente dal framework, che provvede anche a creare i test.
76. Tag Libraries in Grails
-Illusione di un unico spazio condiviso:
-possibile referenziare altri tags
direttamente all’interno del nostro codice
-sintassi estremamente semplice
-tag già registrati
def money = { attrs -
...
out currencySelect(name:quot;${attrs.name}.currencyquot;, value:attrs.value.currency)
out textField(name:quot;${attrs.name}.amountquot;, value:attrs.value.amount)
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Inoltre la gestione dei namespaces è opzionale: di default il namespace è condiviso con le tag di
46
sistema, permettendo di referenziarle direttamente da codice.
77. Extending Grails Scaffolding
Interface
RenderEditor.template
GrailsTemplateGenerator
setResourceLoader(ResourceLoader)
contiene le direttive di
generateViews(GrailsDomainClass, String)
generateController(GrailsDomainClass, String)
Grails per lo Scaffolding
setOverwrite(boolean)
generateView(GrailsDomainClass, String, Writer)
generateController(GrailsDomainClass, Writer)
!quot;#$quot;%$'()%*(quot;+,-.(quot;
DefaultGrailsTemplateGenerator
...
...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Una volta definito il nostro componente grafico per il rendering, il nostro obiettivo è quello di renderlo
47
parte del processo di scaolding di Grails. é suficiente andare a modificare il template oerto da
Grails.
78. GORM
Tipi persistenti
riutilizzabili
Integrati nel
processo di
scaffolding
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Per quanto riguarda la gestione della persistenza gestita da GORM, di fatto stiamo interagendo quasi
48
direttamente con Hibernate.
79. Scrittura degli User class BankingAccount {
Type semplificata
String name
String bank
dalle caratteristiche String iban
Money currentBalance
dei Value Object Currency currency
static hasMany = [operations:BankingOperation,
Discriminazione delle statements:Statement]
strategie di static embedded = ['currentBalance']
persistenza sulla static mapping = {
columns {
base della classe currentBalance type:MoneyCurrencyUserType
}
}
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Sarà necessario disporre di Hibernate User Type corrispondenti ai tipi di dato caratteristici del nostro
49
DSL. Si tratta di un’operazione inizialmente tediosa che può essere notevolmente semplificata
ricordando che si tratta generalmente di Value Object con la caratteristica dell’immutabilità.
80. ...considerazioni finali
Non reinventare la ruota:
Alcuni dialetti già disponibili off-the shelf
I linguaggi interessanti esistono già, non dobbiamo
inventarli
L’utente ha (quasi) sempre ragione
Keep it Simple Stupid:
Non aggiungiamo nulla che non serva
Test, Test ed ancora Test:
… e magari se rimane tempo, qualche altro test
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
Groovy ore una soluzione di compromesso interessante sul panorama dei DSL e Grails ne permette
50
l’integrazione in maniera tutto sommato agevole.
81. Domande?
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
51
84. Riferimenti
JScience: http://jscience.org/
Joda Time: http://www.joda.org/
Time and Money: http://
timeandmoney.sourceforge.net/
http://glaforge.free.fr/weblog/
http://www.warneronstine.com/blog/articles/
2008/04/24/groovy-dsl-roundup
http://peterbacklund.blogspot.com/
http://www.jakusys.de
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
54
86. Open Source it!
Sorgenti presto su:
http://code.google.com/p/diesel/
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
Javaday Roma III Edizione – 24 gennaio 2009
56