lunedì 21 aprile 2008

Groovy Programming: An Introduction for Java Developers



Mi sono procurato questo libro, che viene pubblicizzato anche sul sito ufficiale di groovy. In questo post metterò via via i principali concetti, da tenersi bene a mente, che troverò nel libro. I codici presenti nel libro possono essere recuperati nella pagina web predisposta dall'autore.

  • Groovy è un linguaggio di scripting, nativamente compatibile con Java e le sue API (dato che sfruttano la stessa JVM, Java Virtual Machine). Può essere usato come collante per applicazioni create con Java, oppure il codice può essere "mischiato" con codice Java senza grossi problemi.
  • Linguaggi di scripting sono in particolare adeguati per le situazioni in cui bisogna integrare applicazioni già esistenti, manipolare una vasta varietà di entità dinamiche, applicazioni con interfaccia grafica, sono particolarmente adeguati per applicazioni medio-piccole.
  • I linguaggi come Java sono fortemente tipizzati, per garantire al sicurezza del codice e epr rende agevola la manutenzione di grosse applicazioni. Però così si rende il linguaggio poco adeguato per l'integrazione di componenti differenti, perchè spesso non si sa a priori il tipo di dati da associare ad una variabile, in questo vengono in soccorso i linguaggi di scrripting che spesso sono debolmente tipizzati, appunto come groovy. L'altro lato della medaglia è che con un linguaggio poco tipizzato codice che non solleva errori in compile time potrebbe sollevare eccezzioni, per problemi di tipo, a run time. Questo rende obbligatorio una intensa attività di test per questo tipo di applicazioni.
  • Tutto in groovy è un oggetto, quindi ogni variabili è un istanza di una certa classe.
  • Seguono la regola di cui sopra anche i numeri, quindi per esempio, per un dato integer, per esempio il valore 123, possiamo chiamare, per sapere il successivo, il metodo "next" delal classe integer: 123.next() ottenendo quindi 124. Oppure per sommare due numeri possiamo chiamare il metodo +, passando come parametro il secondo numero, quindi per esempio 123.+(56) oppure il metodo plus, 123.plus(56); fortunatamente groovy prevede l'overloading degli operatori, e quindi possiamo efefttuare la somma nella classica forma 123 + 56
    Da notare come la divisione di due integer risulti SEMPRE in un floating point.
    Da sottolineare come l'operazione modulo (mod oppure %) può essere chiamata solo su due integer
  • Sebbene non si debba definire il tipo di una variabile, al variabile stessa deve essere definita tramite la keyword def, in rpatica la prima volta che si usa una variabile bisogna dichiararla così
    def age
    oppure facendo subito un assegnamento
    def age = 25
  • Le stringe si possono specificare con apice singoli ('), apici doppi (") o addirittura triplici apici - cioè tre volte apici doppi - ("""); con apici tripli si possono specificare stringe multiriga. Con gli apici singoli di specificano stringhe letterali, con le altre due interpretate, cioè ogni espressione in questa forma ${expression} viene interpretata e viene scritto il risultato, cioè
    def age = 25
    ’My age is ${age}’ // My age is ${age}
    “My age is ${age}” // My age is 25
  • La comparazione tra stringhe è fatta in maniera molto simile ai classi metodi dei linguaggi di scripting, capitolo 3.5 e 3.6 del libro.
  • Evidentemente groovy (o java) è un po' cambiato da quando è stato fatto il libro. Nella parte dedicata all'I/O infatti, in uno degli esempi si da questo codice
    name = System.in.readLine()
    ma risulta deprecato, quindi va sostituito con
    name = new BufferedReader( new InputStreamReader(System.in) ).readLine()
  • I metodi sono definiti come le variabili con al parola riservata def, esempio
    def printName(name) {
    println “Name (at entry): ${name}”
    name = ‘John’
    println “Name (after assignment): ${name}”
    }

    seguono poi le regole classiche delle funzioni in java
  • interessante poi l'uso delle parentesi graffe come "funzione"... in pratica possiamo chiamare un pezzo di codice con un determinato nome e poi eseguirlo un po' come se fosse una funzione, qui sotto un esempio con verifica dello scope dei parametri

    def greeting = ‘Hello’
    def clos = {param -> println “${greeting} ${param}”}
    clos.call(‘world’)
    // Now show that changes to this variable change the closure.
    greeting = ‘Welcome’
    clos.call(‘world’)
    def demo(clo) {
    def greeting = ‘Bonjour’ // does not affect closure
    clo.call(‘Ken’)
    }
    demo(clos)

    e l'outupt è:

    Hello world
    Welcome world
    Welcome Ken
  • La gestione delle classi è praticamente identica a Java, quindi anche in Groovy ogni classe, per ogni fields, ha il setter preimpostato. Cioè, data una classe con un campo chiamato, per esempio balance, di cui creiamo un istanza chiamata, per esempio, acccount1, possiamo settare il fields sia con account1.balance=300 sia con account.setBalance(300).
  • Molte delle cose qui non scritte sono identiche o pressoché identiche a Java.
  • Il corrispettivo delle JSP per java, in Groovy viene indicato come GSP e il corrispettivo delle servlet viene soprannominato Groovlet, e il funzionamento ne è stato semplificato.
    Per ora non approfondisco le Groovlet, preferisco rimandare il tutto a quando mi metto a studiare Grails. Per quanto riguarda le GSP invece va sottolineato che sono un poco meno potenti delle JSP in quanto si riducono ad essere assimilate ad un template Framework. In partica si condisce una pagina html semplice con del codice groovy ( <% - %> ) per aggiungere contenuto dinamico, definito altrove (secondo la logica del MVC)

2 commenti:

smartsr ha detto...

scusami tanto ma avrei bisogno del tuo aiuto...
ho iniziato ora a fare il tirocini ed il prof mi ha assegnato cm prog una cosa simile alla tua..!!!
uso di gwt..!!!
volevo solo un consiglio...nn riesco a far a partire l'esempio da eclipse...inoltre nn riesco ad installare nemeno i plug in....non so perchè nn se li prende...!!
mi potrst spiegare velocemente un pò?
ti ringrazio tantissimo...

Gabriele ha detto...

di quale esempio stai parlando? e quale plug in intendi?
sii un po' più specifico e vediamo se riusciamo a trovare una soluzione