Enterprise-class DSLs
          in
  Groovy & Grails
       Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grai...
About me

Strategic IT consultant
Trainer
      - Skills Matter, ...
Articoli
      - Mokabyte, …
Blogger
      - Ziobrand...
A cosa serve un DSL?


Un DSL è uno strumento per la condivisione di
 informazioni specializzato per uno specifico
 contes...
… un classico esempio di DSL




   Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                  ...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                                      ...
Ecosistema di progetto



                      Domain
                                                                   ...
Ecosistema di progetto
            DSL


                      Domain
                                                    ...
Ecosistema di progetto
            DSL                                                                          ?


      ...
Ecosistema di progetto
            DSL                                                                          ?


      ...
Ecosistema di progetto
            DSL                                                                          ?


      ...
Ecosistema di progetto
            DSL                                                                          ?


      ...
Ecosistema di progetto
            DSL                                                                          ?


      ...
Avviciniamo i contesti



                            Domain
                                                             ...
Avviciniamo i contesti



                            Domain
                                                             ...
DSL in Enterprise Application


  ...scrivere codice che si possa leggere e capire a
     colpo d’occhio.
  A chi giova?
 ...
Different approcci ali DSL


  Vari approcci al problema:
       Parser/interpreti interni all’applicazione
       Scrittu...
DSL in Groovy


  Groovy introduce nuovi strumenti che aprono scenari
   sulla JVM:
               - overloading degli ope...
Money: obiettivi

                                       Vogliamo esplorare le
   - Domain Class
                         ...
DDD Value Object


  In Domain Driven Design un Value Object è un
    oggetto caratteristico del dominio applicativo:
    ...
Time and Money


  Libreria Java open source “emanazione” di Domain
    Driven Design
  Tipi di dato riutilizzabili in sva...
Java “blocca la strada”


  BigDecimal non è un tipo numerico primitivo
       Operatori aritmetici da ridefinire
       C...
...una buona notizia

  La scrittura della classe, a parità di test superati, ha
    richiesto circa la metà del codice:
 ...
The comparable bug

       junit.framework.AssertionFailedError:

       expected:EUR
10
but
was:EUR
10.00

  Scompaiono a...
Money - continued


                                   E’ necessario intervenire più in
  - Creazione
                    ...
Expando Meta Class


EMC permette di aggiungere
 nuovi comportamenti alle
 classi già esistenti, a run                    ...
I soldi iniziano a girare...

                assert 20.EUR == 10.EUR + 10.EUR

                assertEquals 45.EUR, 9.EUR...
...proviamo a spingerci oltre...


   assertEquals 250.€,                             10.€ * 25

              Funziona! :...
Però, così
 facendo,
 finisco per
 attribuire alla
 classe Number
 responsabilità
 che non le
 competono,
 violando uno
 d...
Legacy e Black Bok


                                  Il foglio bianco è il sogno di ogni
  - maggiore
                  ...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                                      ...
Joda Time


Libreria con funzionalità avanzate per Date e Time
Candidata alla sostituzione di java.util.Date nelle
  pross...
Black Box approach


Prendendo in esame qualcosa di più complesso, ha
  senso rivolgersi all’esistente.
In ambito DSL alcu...
JScience


Libreria con supporto per:
  - unità di misura (SI)
  - quantità
  - calcoli type-safe


Amount m3 = Amount.val...
Il punto della situazione




                                      Alberto Brandolini - alberto.brandolini@avanscoperta.i...
Il punto della situazione

          Molti DSL già
          disponibili “off
          the shelf” :-)




               ...
Il punto della situazione

          Molti DSL già
          disponibili “off                      possibilità
          t...
Il punto della situazione

          Molti DSL già
          disponibili “off                      possibilità
          t...
Il punto della situazione

          Molti DSL già
          disponibili “off                      possibilità
          t...
Il punto della situazione

          Molti DSL già
          disponibili “off                      possibilità
          t...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                                      ...
Groovy
     è bestiale, posso
     scrivere i miei
          DSL!!




                                     Alberto Brando...
Groovy
                                                                                Fico!
     è bestiale, posso
      ...
Groovy
                                                                                Fico!
     è bestiale, posso
      ...
Groovy
                                                                                Fico!
     è bestiale, posso
      ...
Groovy
                                                                                Fico!
     è bestiale, posso
      ...
Multiple DSL

 - Fare convivere Un unico punto di innesco
                   configurabile per più DSL
   più DSL nello
  ...
DSL Descriptor


     Repository di delle caratteristiche specifiche del
      nostro DSL
         parole chiave
         ...
Scenario Money

                                                               Corretta allocazione
       Interface
     ...
Scenario Time and Money

                                                                                 Libreria
       ...
DSLEngine


  Un ruolo di coordinatore centralizzato per
   l’attivazione simultanea di più DSL
  Si aprono nuovi problemi...
Separazione delle
Interface                           Interface
 DSLEngine                             DSLDescriptor

    ...
DSL Multipli

  ...perché limitarci ad uno solo quando possiamo
     combinarne più di uno?

    Interface                ...
DSL Compositi


  A volte, la maggiore espressività si raggiunge
    componendo frammenti di DSL separati

               ...
DSL Compositi


  A volte, la maggiore espressività si raggiunge
    componendo frammenti di DSL separati

               ...
DSL Compositi


  A volte, la maggiore espressività si raggiunge
    componendo frammenti di DSL separati

               ...
Grails


Framework per lo sviluppo rapido di applicazioni Web
  (ma non solo)
      - basato su Groovy
      - si appoggia...
Grails




                                     Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
      ...
Grails
                                                                                s
                                 ...
Grails
                                                                                s
                                 ...
Grails
                                                                                s
                                 ...
Grails
                                                                                s
                                 ...
Grails
                                                                                  s
                               ...
Grails
                                                                                       s
                          ...
Grails
                                                                                       s
                          ...
Grails
                                                                                       s
                          ...
Grails
                                                                                       s
                          ...
Grails
                                                                                       s
                          ...
Grails
                                                                                       s
                          ...
Value Object in Grails


Grails nasce privo del concetto di Value Object:
 - il dominio applicativo nasce in corrispondenz...
Ed il nostro DSL?


Il supporto ai tipi di dato definiti dall’utente passa
   attraverso:
  - Grails Scaffolding
       - ...
Grails Scaffolding




Così com’è Grails non ci permette di trarre il meglio dal DSL e dai tipi di dato che lo
caratterizz...
Obiettivi


                                  Componente di presentation che
 - Widget                          mirato sul...
Tag Libraries in Java


La scrittura di una tag library in Java è un’operazione
  abbastanza punitiva
      - sintassi ed ...
Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                                                      ...
Tag Libraries


  grails create-taglib


  ‐ grails
crea
il
sorgente
della

      nostra
Tag
Library
nella
cartella

     ...
Tag Libraries in Grails

         -Illusione di un unico spazio condiviso:
              -possibile referenziare altri tag...
Extending Grails Scaffolding


                    Interface
                                                         Rend...
GORM

                                                      Tipi persistenti
                                             ...
Scrittura degli User                           class BankingAccount {

   Type semplificata
                              ...
...considerazioni finali


  Non reinventare la ruota:
       Alcuni dialetti già disponibili off-the shelf
       I lingu...
Domande?




Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                          Javaday Roma II...
Riferimenti




Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT
                          Javaday Roma...
Riferimenti


http://groovy.codehaus.org/




http://grails.org




  Alberto Brandolini - alberto.brandolini@avanscoperta...
Riferimenti


JScience: http://jscience.org/
Joda Time: http://www.joda.org/
Time and Money: http://
  timeandmoney.source...
Riferimenti


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


                  ...
Open Source it!


Sorgenti presto su:
http://code.google.com/p/diesel/




                  Alberto Brandolini - alberto....
Upcoming SlideShare
Loading in...5
×

Enterprise-Class DSL In Groovy & Grails

1,413

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,413
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
74
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Enterprise-Class DSL In Groovy & Grails

  1. 1. Enterprise-class DSLs in Groovy & Grails Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 1
  2. 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. 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. 4. … un classico esempio di DSL Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 4
  5. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 30. Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 non vedo, non sento, non parlo. 23
  31. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 81. Domande? Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 51
  82. 82. Riferimenti Alberto Brandolini - alberto.brandolini@avanscoperta.it – Grails-IT Javaday Roma III Edizione – 24 gennaio 2009 52
  83. 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. 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. 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. 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×