présentation groovy
TRANSCRIPT
Groovy
Qui je suis?
J’ai inventé Groovy
J’entretiens une relation extraconjugale avec Guillaume Laforge
J’ai écrit un super bouquin sur Groovy
Je siège sur l’expert group de la JSR-241
Je suis committer sur Groovy
Jean-Sébastien Bournival
Architecte de systèmes
Nurun
Mon blog: http://js.jipiju.com
Agenda
• PARTIE I – Introduction– Origines et principes de base
• PARTIE II - Qu'est ce que Groovy?– Comment se décline ce langage
• PARTIE III - Que fait-on avec Groovy?– Applications concrètes du langage
• PARTIE IV – Conclusion– Références, questions
Partie 1: Introduction
Origines et principes de base
Introduction
• Précision importante– Groovy == langage de programmation– Grails == framework de développement web
utilisant Groovy
Introduction
• Manifeste– Groovy est un langage de programmation
dynamique et agile pour la machine virtuelle Java (JVM)
« Groovy is Java » -Graeme Rocher
Grails project lead
Groovy Java
Java Virtual Machine
bytecode
Historique
• Personnel– 2003 James Strachan, le fondateur– 2004 Guillaume Laforge, le récupérateur– 2007 G2One, le catalyseur
• JSR 241– Supportée par IBM, Oracle, Sun, ASF,
ThoughtWorks
Installation
• Environnement• $JAVA_HOME• $GROOVY_HOME• $PATH = $PATH;$GROOVY_HOME\bin;$JAVA_HOME\bin• ~/.groovy/lib
• Outils• Interpréteur (groovy.sh)• Shell (groovysh.sh)• Console Swing (groovyConsole.sh)
Anatomie d’un script
// monScript.groovy// def maVariable = 3
def uneClosure = { it * it}
println ‘Bonjour monde!’
L’instruction return est
optionnelle
Packages importés par défaut:
groovy.lang.*groovy.util.*java.lang.*java.util.*java.io.*java.net.*Java.math.BigDecimalJava.math.BigInteger
Le point virgule et les paranthèses sont
optionnels
System.out est implicite
Ce script ne contient pas de classe: lors de l’exécution, il sera enrobé dans la méthode
run() d’un objet de type Script
Partie 2: Qu’est-ce que Groovy?
Survol du langage
Type de données de base
• Tout est Objet (pour vrai de vrai cette fois-ci!)
– pas de type primitif– typage dynamique (ou pas)– autoboxing
• méthode java qui prend un int en paramètre
– l’opérateur ‘==‘ veut dire equals() … pour tout le monde, pour l’identité, il faut utiliser la méthode is()
Types de données de base
• Strings– java.lang.String ‘’– groovy.lang.GString “”
• Aussi– Slashy //– Triple quote ‘’’ et “””
Expressions régulières
• Sucre syntaxique par-dessus:– java.util.regex.Matcher / Pattern
• Opérateurs ‘~’ ‘=~’ et ‘==~’
// java.util.regex.Patterndef pattern = ~/.ou/
// java.util.regex.Matcherdef matcher = ('hibou pou chou genou' =~ pattern)assert matcher.size() == 4
assert 'hibou' ==~ /.*ou/
Structures de contrôle
• La vérité, rien que la vérité …– true == références objets non-nulle– true == list/map non-vide– true == string non-vide– true == un matcher ayant un match– true == Valeur numérique différente de zéro– true == true (la valeur booléenne)
• Aussi:– l’instruction if () == celle de Java– idem pour les try {…} catch() {…}
Structures de contrôle (2)
• Boucler– le while(expr) est identique à celui de Java– pas de do {…} while (expr) en Groovy– for (variable in iterable) { instr }
def matcher = '12xy5' =~ /\d/for (match in matcher) { println match }
def myString = 'Saku Koivu'for (i in 0..<myString.size()) { ... }
Structures de contrôle (3)
• Un switch beaucoup plus puissant qu’en Java :
switch (x) { case 7: println "7"; break; case 2.3: println "2.3"; break; case "dog": println "dog"; break; case [1, 2, 'alf']: println "in list"; break; case (3..6): println "in range"; break; case Integer: println "Integer"; break; case ~"ca.*": println "regex"; break;}
GDK
• Plusieurs types de Java deviennent plus Groovy!java.io.File:
eachLine (Closure closure)eachFile (Closure closure)
java.util.Date:minus(int days)plus(int days)
java.lang.String:toURL()
java.util.Collection:count(Object value)find(Closure closure)findAll(Closure closure)
Support natif des collections
• Les listes– opérateur subscript [] = getAt()/putAt()– opérateur Spread *.– permet l’utilisation d’index négatifs
def sakuList = []sakuList = ['fi','en']sakuList << 'fr'assert sakuList instanceof java.util.List
Support natif des collections (2)
• Les maps– permet la syntaxe .dot sur les clés– utilisation de valeur par défaut
def sakuMap = [:]sakuMap = [ 'team':'mtl', 'goals':12, 'languages':['fi', 'en'] ]println sakuMap.teamassert sakuMap instanceof java.util.Map
Support natif des collections (3)
• Les ranges– une liste de valeurs séquentielles– opérateur .. et ..<– utilisation: boucles, switch, et closures
def range = 5..8assert range.size() == 4for (i in range) { println "Hello ${i}"}
Closures
• Wikipedia« In computer science, a closure is a function that is evaluated in an environment
containing one or more bound variables. When called, the function can access these variables. The explicit use of closures is associated with functional programming and with languages such as ML and Lisp.»
• Fonction Lambda de Lisp.
(define (derivative f dx)(lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
Closures (2)
• En Groovy– Une "closure" c'est un bout de code:
• assigné à une variable ou anonyme• exécuté ultérieurement• de type groovy.lang.Closure
• Utilisation typique– List (.each())– File (.eachLine(), .eachFile())– …
Programmation objet
• Identique à Java … sauf:– les inner class ne sont pas supportées– le scope par défaut des
classes/méthodes/attributs est public– paramètres positionnels, et nommés– surcharge d’opérateurs permise– safe dereferencing operator ‘?.’
Programmation objet
• GroovyBeans– Ajoute au formalisme des JavaBeans
• get/set sous-entendu pour préserver l’encapsulation
• opérateur @
– Expando, ou un GroovyBean « vierge »• ajout dynamique d’attributs et méthodes
(closures)
Programmation META objet
• Sous le capot de Groovy:– toutes les classes ont une
méta-classe– une méta-classe permet, entre
autres, d’intercepter des appels à des méthodes inexistantes classe
méta-classe
appel de methode()
Partie 3: Que fait-on avec Groovy?
Applications concrètes du langage
Builders
• Principes basés sur le célèbre patron de conception (GOF 97)– Permet de construire des structures de type
«arbre»
def builder = new MarkupBuilder()
builder.'web-app' {
'display-name' 'My Webapp'
} <web-app>
<display-name>My Webapp</display-name>
</web-app>
Builders
• Applications usuelles– MarkupBuilder– AntBuilder– GraphicsBuilder– SwingBuilder– …
XML
• 2 Objets Groovy pour faciliter le parsing de structures XML– groovy.util.XMLParser– groovy.util.XMLSlurper
• Utiliser des librairies Java est tout aussi recommandé!– DOM4J, par exemple
new XmlSlurper().parse(new File('C:/dev/data/file.xml'))
GSQL
• Accès aux SGBD– package groovy.sql.*
– 2 façons de rendre SQL Groovy:• Nature
– groovy.sql.GroovyResultSet
• DataSets– groovy.sql.DataSet
GANT
• Gant permet de construire des scripts de build à l’aide d’Ant, mais écrits en Groovy– « Look Ma! No XML! »– Utilise les tâches d’Ant– Il existe un plugin pour Hudson
target ( default : 'This is the default target.' ) { if (System.getenv ( ).'JAVA_HOME') { anotherTarget() }}
Services Web
• Module GroovyWS– Enrobe le cadre d’application Apache CXF
• Client et serveur se définissent de façon Groovy, c’est-à-dire simple et concise– groovyx.net.ws.WSServer– groovyx.net.ws.WSClient
Services Web
import groovyx.net.ws.WSClient
def proxy = new WSClient("http://localhost:6980/MathService?wsdl", this.class.classLoader)
def result = proxy.add(1.0 as double, 2.0 as double)
import groovyx.net.ws.WSServer
def server = new WSServer()
server.setNode("MathService", "http://localhost:6980/MathService")
Serveur
Client
Tester avec Groovy
• GroovyTestCase– JUnit est enchâssé dans l’environnement
d’exécution de Groovy– Ajoute plusieurs méthodes assert*– GroovyTestSuite s’intègre à merveille avec les
IDE– Il est tout aussi facile de rouler une batterie
de tests avec Ant ou Maven
Tester avec Groovy
• Tester avec d’autres outils– Unit tests
• TestNG
– Services web• Canoo WebTest• SOAPUI
– Coverage• Cobertura
Partie 4: Conclusion
La fin … vraiment? Ou seulement le début?
State of the «groovy» nation
• Version– Dernière livraison: 1.1 RC 2– 1.1 final devrait être à nos portes
• Présence– Spring– Jboss Seam– IBM project ZERO– OpenEJB– ServiceMix– Grails– Hudson– Canoo Web Test– SoapUI
Défis à venir
• Surfer sur la vague sans perdre pied!– maintenir le rythme effréné des livraisons– maintenir le niveau élevé de la qualité
• Documentation– la communauté le réclame: une documentation à
jour, mieux organisée
• Performance– bien que cet aspect ait été amélioré depuis quelques
livraisons, beaucoup de travail reste à faire
Voir la lumière …
• Grails– Cadre d’application web agile– Assemblage de frameworks connus de
l’écosystème Java– Applique les principes de productivité de
Rails en lui chipant plusieurs idées (À tout seigneur, tout honneur.)
– À suivre …
Références
• Bouquins– Groovy in actionDierk König, 2007ISBN 1-932394-84-2
– Groovy programmingKenneth Barclay/John Savage, 2006ISBN 978-0-12-372507-3
– Groovy RecipesScott Davis, Coming soon! ?
Références
• Sur la grande toile– http://groovy.codehaus.org– http://www.groovyblogs.org– http://www.aboutgroovy.com– http://www.g2one.com – http://jcp.org/en/jsr/detail?id=241
– Groovy User Groups• Vancouver http://groovyvan.com/ • Londres http://skillsmatter.com/menu/539 • Melbourne http://tech.groups.yahoo.com/group/groovy-melbourne/ • Stuttgart http://www.jugs.de/sig-groovy.html • Minnesota http://groups.google.com/group/groovymn • Montréal?
Références
• La Blogoshère– Guillaume Laforge– Jason Rudolph– Glen Smith– Sven Haiges– Scott Davis– Venkat Subramaniam– Geertjan Wielenga– Jeremy Rayner– Mark Palmer– Jeff Brown– Andres Almiray– …
http://glaforge.free.fr/weblog/
http://www.jasonrudolph.com/blog/ http://blogs.bytecode.com.au/glen/
http://svenhaiges.de/ http://www.davisworld.org/ http://www.agiledeveloper.com/blog/
http://blogs.sun.com/geertjan/ http://javanicus.com/blog2/ http://www.anyware.co.uk/2005/ http://javajeff.blogspot.com/
http://jroller.com/aalmiray/