SlideShare une entreprise Scribd logo
1  sur  86
Télécharger pour lire hors ligne
Enterprise-class DSLs
          in
  Groovy & Grails
       Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                 Javaday Roma III Edizione – 24 gennaio 2009

                                                                  1
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
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
… un classico esempio di DSL




   Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                             Javaday Roma III Edizione – 24 gennaio 2009

                                                              4
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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
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!
...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.
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.
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.
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
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.
...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!
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”
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à:
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                                            Javaday Roma III Edizione – 24 gennaio 2009
non vedo, non sento, non parlo.                                                              23
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
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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.
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
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                                              Javaday Roma III Edizione – 24 gennaio 2009
Fortunatamente abbiamo scoperto chi è l’autore delle specifiche :-)                             44
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.
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.
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.
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.
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à.
...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.
Domande?




Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                          Javaday Roma III Edizione – 24 gennaio 2009

                                                           51
Riferimenti




Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                          Javaday Roma III Edizione – 24 gennaio 2009

                                                           52
Riferimenti


http://groovy.codehaus.org/




http://grails.org




  Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                            Javaday Roma III Edizione – 24 gennaio 2009

                                                             53
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
Riferimenti


Grails-IT: http://it.groups.yahoo.com/group/Grails-IT/
Mokabyte: http://www.mokabyte.it


                            http://ziobrando.blogspot.com
                   http://albertobrandolini.wikidot.com




                   Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                             Javaday Roma III Edizione – 24 gennaio 2009

                                                                              55
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

Contenu connexe

En vedette

Buzzword Deathmatch: Agile vs SOA
Buzzword Deathmatch: Agile vs SOABuzzword Deathmatch: Agile vs SOA
Buzzword Deathmatch: Agile vs SOAAlberto Brandolini
 
Il Web design nella Pubblica Amministrazione in 10 passi
Il Web design nella Pubblica Amministrazione in 10 passiIl Web design nella Pubblica Amministrazione in 10 passi
Il Web design nella Pubblica Amministrazione in 10 passiMassimo Azzolini
 
Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014Alberto Brandolini
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVMMario Fusco
 
Design leadership and experience management
Design leadership and experience managementDesign leadership and experience management
Design leadership and experience managementLuca Mascaro
 
Projections explained
Projections explainedProjections explained
Projections explainedYves Reynhout
 
The final words about software estimation
The final words about software estimationThe final words about software estimation
The final words about software estimationAlberto Brandolini
 

En vedette (15)

Buzzword Deathmatch: Agile vs SOA
Buzzword Deathmatch: Agile vs SOABuzzword Deathmatch: Agile vs SOA
Buzzword Deathmatch: Agile vs SOA
 
Il Web design nella Pubblica Amministrazione in 10 passi
Il Web design nella Pubblica Amministrazione in 10 passiIl Web design nella Pubblica Amministrazione in 10 passi
Il Web design nella Pubblica Amministrazione in 10 passi
 
Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014
 
Optimized for what
Optimized for whatOptimized for what
Optimized for what
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVM
 
Model storming
Model stormingModel storming
Model storming
 
Design leadership and experience management
Design leadership and experience managementDesign leadership and experience management
Design leadership and experience management
 
Context Mapping In Action
Context Mapping In ActionContext Mapping In Action
Context Mapping In Action
 
Projections explained
Projections explainedProjections explained
Projections explained
 
Transactions redefined
Transactions redefinedTransactions redefined
Transactions redefined
 
Event storming recipes
Event storming recipesEvent storming recipes
Event storming recipes
 
The final words about software estimation
The final words about software estimationThe final words about software estimation
The final words about software estimation
 
Event storming
Event stormingEvent storming
Event storming
 
Kickstarting Design Thinking
Kickstarting Design ThinkingKickstarting Design Thinking
Kickstarting Design Thinking
 
The Build Trap
The Build TrapThe Build Trap
The Build Trap
 

Similaire à Enterprise-Class DSL In Groovy & Grails

Tesi Marco Ventura
Tesi Marco VenturaTesi Marco Ventura
Tesi Marco Venturaguest335584
 
Ribesdesign interfacce
Ribesdesign interfacceRibesdesign interfacce
Ribesdesign interfacceRibesdesign
 
Corso Unified Modeling Language (UML)
Corso Unified Modeling Language (UML)Corso Unified Modeling Language (UML)
Corso Unified Modeling Language (UML)K-Tech Formazione
 
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...Corrado Musumeci
 
AUGMENTED REALITY EXPERT
AUGMENTED REALITY EXPERTAUGMENTED REALITY EXPERT
AUGMENTED REALITY EXPERTMirko Compagno
 
CMDBuild: progetto, modi di utilizzo, evoluzioni
CMDBuild: progetto, modi di utilizzo, evoluzioniCMDBuild: progetto, modi di utilizzo, evoluzioni
CMDBuild: progetto, modi di utilizzo, evoluzioniCMDBuild org
 
IBM Enterprise 2.0 / Valori Distintivi della soluzione
IBM Enterprise 2.0 / Valori Distintivi della soluzioneIBM Enterprise 2.0 / Valori Distintivi della soluzione
IBM Enterprise 2.0 / Valori Distintivi della soluzioneMax Ardigó 🇦🇷
 
Gestione dell'illuminazione pubblica | 3DGIS luce
Gestione dell'illuminazione pubblica | 3DGIS luceGestione dell'illuminazione pubblica | 3DGIS luce
Gestione dell'illuminazione pubblica | 3DGIS luce3DGIS
 
3 domande a marco de michele - owner @nu-tech
3 domande a  marco de michele - owner @nu-tech 3 domande a  marco de michele - owner @nu-tech
3 domande a marco de michele - owner @nu-tech Ionela
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGiacomoZorzin
 
B Human Progetti di Stage 2009
B Human Progetti di Stage 2009B Human Progetti di Stage 2009
B Human Progetti di Stage 2009B Human Srl
 
(5) master in server 2012 didier - strumenti e risorse per aiutare i partner
(5) master in server 2012   didier - strumenti e risorse per aiutare i partner(5) master in server 2012   didier - strumenti e risorse per aiutare i partner
(5) master in server 2012 didier - strumenti e risorse per aiutare i partnermsoemit
 
DI.As.Pro - Forum PA Challenge
DI.As.Pro - Forum PA ChallengeDI.As.Pro - Forum PA Challenge
DI.As.Pro - Forum PA ChallengeDML Srl
 
TBIZ 2011 - Bisquits
TBIZ 2011 - BisquitsTBIZ 2011 - Bisquits
TBIZ 2011 - BisquitsTechnologyBIZ
 
Mathcad Prime 2.0
Mathcad Prime 2.0Mathcad Prime 2.0
Mathcad Prime 2.0GMSL S.r.l.
 
Lo stato dell' arte sulla documentazione dei progetti ICT
Lo stato dell' arte sulla documentazione dei progetti ICTLo stato dell' arte sulla documentazione dei progetti ICT
Lo stato dell' arte sulla documentazione dei progetti ICTMatteo Gentile
 

Similaire à Enterprise-Class DSL In Groovy & Grails (20)

Tesi Marco Ventura
Tesi Marco VenturaTesi Marco Ventura
Tesi Marco Ventura
 
Ribesdesign interfacce
Ribesdesign interfacceRibesdesign interfacce
Ribesdesign interfacce
 
Corso Unified Modeling Language (UML)
Corso Unified Modeling Language (UML)Corso Unified Modeling Language (UML)
Corso Unified Modeling Language (UML)
 
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
 
cv Armando Maglio
cv Armando Magliocv Armando Maglio
cv Armando Maglio
 
AUGMENTED REALITY EXPERT
AUGMENTED REALITY EXPERTAUGMENTED REALITY EXPERT
AUGMENTED REALITY EXPERT
 
CMDBuild: progetto, modi di utilizzo, evoluzioni
CMDBuild: progetto, modi di utilizzo, evoluzioniCMDBuild: progetto, modi di utilizzo, evoluzioni
CMDBuild: progetto, modi di utilizzo, evoluzioni
 
Corba
CorbaCorba
Corba
 
#dd12 Domino e DB2
#dd12 Domino e DB2#dd12 Domino e DB2
#dd12 Domino e DB2
 
IBM Enterprise 2.0 / Valori Distintivi della soluzione
IBM Enterprise 2.0 / Valori Distintivi della soluzioneIBM Enterprise 2.0 / Valori Distintivi della soluzione
IBM Enterprise 2.0 / Valori Distintivi della soluzione
 
Gestione dell'illuminazione pubblica | 3DGIS luce
Gestione dell'illuminazione pubblica | 3DGIS luceGestione dell'illuminazione pubblica | 3DGIS luce
Gestione dell'illuminazione pubblica | 3DGIS luce
 
3 domande a marco de michele - owner @nu-tech
3 domande a  marco de michele - owner @nu-tech 3 domande a  marco de michele - owner @nu-tech
3 domande a marco de michele - owner @nu-tech
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptx
 
B Human Progetti di Stage 2009
B Human Progetti di Stage 2009B Human Progetti di Stage 2009
B Human Progetti di Stage 2009
 
(5) master in server 2012 didier - strumenti e risorse per aiutare i partner
(5) master in server 2012   didier - strumenti e risorse per aiutare i partner(5) master in server 2012   didier - strumenti e risorse per aiutare i partner
(5) master in server 2012 didier - strumenti e risorse per aiutare i partner
 
CV FEDERICO CASTELLANI
CV FEDERICO CASTELLANI CV FEDERICO CASTELLANI
CV FEDERICO CASTELLANI
 
DI.As.Pro - Forum PA Challenge
DI.As.Pro - Forum PA ChallengeDI.As.Pro - Forum PA Challenge
DI.As.Pro - Forum PA Challenge
 
TBIZ 2011 - Bisquits
TBIZ 2011 - BisquitsTBIZ 2011 - Bisquits
TBIZ 2011 - Bisquits
 
Mathcad Prime 2.0
Mathcad Prime 2.0Mathcad Prime 2.0
Mathcad Prime 2.0
 
Lo stato dell' arte sulla documentazione dei progetti ICT
Lo stato dell' arte sulla documentazione dei progetti ICTLo stato dell' arte sulla documentazione dei progetti ICT
Lo stato dell' arte sulla documentazione dei progetti ICT
 

Plus de Alberto Brandolini

L'illusione dell'ortogonalità
L'illusione dell'ortogonalitàL'illusione dell'ortogonalità
L'illusione dell'ortogonalitàAlberto Brandolini
 
Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Alberto Brandolini
 
Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Alberto Brandolini
 
Software design as a cooperative game with EventStorming
Software design as a cooperative game with EventStormingSoftware design as a cooperative game with EventStorming
Software design as a cooperative game with EventStormingAlberto Brandolini
 
Reshaping enterrprise software
Reshaping enterrprise softwareReshaping enterrprise software
Reshaping enterrprise softwareAlberto Brandolini
 
Guerrilla portfolio management
Guerrilla portfolio managementGuerrilla portfolio management
Guerrilla portfolio managementAlberto Brandolini
 
Idea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw editionIdea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw editionAlberto Brandolini
 
Bullshit Asymmetry Principle lightning talk
Bullshit Asymmetry Principle lightning talkBullshit Asymmetry Principle lightning talk
Bullshit Asymmetry Principle lightning talkAlberto Brandolini
 

Plus de Alberto Brandolini (20)

L'illusione dell'ortogonalità
L'illusione dell'ortogonalitàL'illusione dell'ortogonalità
L'illusione dell'ortogonalità
 
Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021
 
What lies beneath
What lies beneathWhat lies beneath
What lies beneath
 
Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)
 
Extreme DDD modelling
Extreme DDD modellingExtreme DDD modelling
Extreme DDD modelling
 
The gordian knot
The gordian knotThe gordian knot
The gordian knot
 
Software design as a cooperative game with EventStorming
Software design as a cooperative game with EventStormingSoftware design as a cooperative game with EventStorming
Software design as a cooperative game with EventStorming
 
La fatina dei denti
La fatina dei dentiLa fatina dei denti
La fatina dei denti
 
50.000 orange stickies later
50.000 orange stickies later50.000 orange stickies later
50.000 orange stickies later
 
The alignment
The alignmentThe alignment
The alignment
 
Chasing elephants
Chasing elephantsChasing elephants
Chasing elephants
 
Reshaping enterrprise software
Reshaping enterrprise softwareReshaping enterrprise software
Reshaping enterrprise software
 
Guerrilla portfolio management
Guerrilla portfolio managementGuerrilla portfolio management
Guerrilla portfolio management
 
The precision blade
The precision bladeThe precision blade
The precision blade
 
Idea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw editionIdea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw edition
 
Managing debt remastered
Managing debt remasteredManaging debt remastered
Managing debt remastered
 
The sweet spot
The sweet spotThe sweet spot
The sweet spot
 
Liberate il kraken
Liberate il krakenLiberate il kraken
Liberate il kraken
 
Bullshit Asymmetry Principle lightning talk
Bullshit Asymmetry Principle lightning talkBullshit Asymmetry Principle lightning talk
Bullshit Asymmetry Principle lightning talk
 
It's not simple at all
It's not simple at allIt's not simple at all
It's not simple at all
 

Enterprise-Class DSL In Groovy & Grails

  • 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
  • 82. Riferimenti Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 52
  • 83. Riferimenti http://groovy.codehaus.org/ http://grails.org Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 53
  • 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
  • 85. Riferimenti Grails-IT: http://it.groups.yahoo.com/group/Grails-IT/ Mokabyte: http://www.mokabyte.it http://ziobrando.blogspot.com http://albertobrandolini.wikidot.com Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 55
  • 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