groovy workshop à mix-it 2013
DESCRIPTION
Quelques slides de présentation lors du workshop Groovy à la conférence Mix-IT à Lyon, en 2013.TRANSCRIPT
Groovy, les mains dans le cambouis
Guillaume LaforgeGroovy Project ManagerSpringSource / VMware
Guillaume Laforge @glaforge
http://glaforge.appspot.com http://gplus.to/glaforge
GVM, Groovy enVironment Managerpour installer facilement Groovy
Grails, Gradle, Griffon, Vert.x
Installation de GVM, Groovy et Gradle
Installation de GVM, Groovy et Gradle
• Installation de GVM
• Installation de Groovy
• Installtion de Gradle
curl -‐s get.gvmtool.net | bash
gvm install groovy
gvm install gradle
Vérifiez votre installation$ groovy -‐-‐version
Groovy Version: 2.1.3 JVM: 1.7.0_09 Vendor: Oracle Corporation OS: Mac OS X
$ gradle -‐-‐version
-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐Gradle 1.5-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐
Gradle build time: mercredi 27 mars 2013 13 h 51 UTCGroovy: 1.8.6Ant: Apache Ant(TM) version 1.8.4 compiled on May 22 2012Ivy: 2.2.0JVM: 1.7.0_09 (Oracle Corporation 23.5-‐b02)OS: Mac OS X 10.8.3 x86_64
Quelques bases, pour apprendre Groovy
A la découvertede Groovy...
L’artillerie Groovy-esque
Commande groovy
Compilateur groovyc
REPL groovysh
Console Swing groovyConsole
« Groovy, c’est comme Java,
mais sans le costume
trois pièces »
Une personne... sauce Javapublic class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello, my name is " + name; }}
Une personne... sauce Javapublic class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello, my name is " + name; }}
Les points-virgules, c’est pour les Mickeys !
Une personne... sauce Javapublic class Person { private String name public String getName() { return name } public void setName(String name) { this.name = name } public String greet() { return "Hello, my name is " + name }}
Une personne... sauce Javapublic class Person { private String name public String getName() { return name } public void setName(String name) { this.name = name } public String greet() { return "Hello, my name is " + name }}
En Groovy, la visitbilité est public par défaut
Une personne... sauce Java class Person { private String name String getName() { return name } void setName(String name) { this.name = name } String greet() { return "Hello, my name is " + name }}
Une personne... sauce Java class Person { private String name String getName() { return name } void setName(String name) { this.name = name } String greet() { return "Hello, my name is " + name }}
Le return aussi est optionnel
Une personne... sauce Java class Person { private String name String getName() { name } void setName(String name) { this.name = name } String greet() { "Hello, my name is " + name }}
Une personne... sauce Java class Person { private String name String getName() { name } void setName(String name) { this.name = name } String greet() { "Hello, my name is " + name }}
Groovy a la notion de propriétés
Une personne... sauce Java class Person { String name String greet() { "Hello, my name is " + name }}
Une personne... sauce Java class Person { String name String greet() { "Hello, my name is " + name }}
Un langage sexy avec des GString
Une personne... sauce Java class Person { String name String greet() { "Hello, my name is ${name}" }}
Une personne... sauce Java class Person { String name String greet() { "Hello, my name is ${name}" }}
Reformattons tout ce beau bazar
Une personne... sauce Groovy !
class Person { String name String greet() { "Hello, my name is ${name}" }}
Une personne... sauce Groovy !
class Person { String name String greet() { "Hello, my name is ${name}" }}
public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello, my name is " + name; }}
Comment lui faire dire bonjour...
Person person = new Person();person.setName("Guillaume");
System.out.println(person.greet());
Comment lui faire dire bonjour...
Person person = new Person();person.setName("Guillaume");
System.out.println(person.greet());
Sans points-virgules
Comment lui faire dire bonjour...
Person person = new Person()person.setName("Guillaume")
System.out.println(person.greet())
Comment lui faire dire bonjour...
Person person = new Person()person.setName("Guillaume")
System.out.println(person.greet())
println version raccourcie
Comment lui faire dire bonjour...
Person person = new Person()person.setName("Guillaume")
println(person.greet())
Comment lui faire dire bonjour...
Person person = new Person()person.setName("Guillaume")
println(person.greet())
sans parenthèses
Comment lui faire dire bonjour...
Person person = new Person()person.setName "Guillaume"
println person.greet()
Comment lui faire dire bonjour...
Person person = new Person()person.setName "Guillaume"
println person.greet()
notation d’accès aux propriétés
Comment lui faire dire bonjour...
Person person = new Person()person.name = "Guillaume"
println person.greet()
Comment lui faire dire bonjour...
Person person = new Person()person.name = "Guillaume"
println person.greet()
typage optionnel
Comment lui faire dire bonjour...
def person = new Person()person.name = "Guillaume"
println person.greet()
Comment lui faire dire bonjour...
def person = new Person()person.name = "Guillaume"
println person.greet()
constructeur avec paramètres nommés
Comment lui faire dire bonjour...
def person = new Person(name: "Guillaume")
println person.greet()
Comment lui faire dire bonjour...
def person = new Person(name: "Guillaume")
println person.greet()
un petit coup de reformat pour les yeux
Comment lui faire dire bonjour...
def person = new Person(name: "Guillaume")
println person.greet()
On va se faire la cloture...
Closures — ou « clotures »
• Pas besoin d’attendre JDK 8 en 2014• Groovy a des closures depuis 2003 !
• C’est quoi une closure ?• bloc de code réutilisable• assignable dans une variable• qu’on peut passer en paramètre d’une méthode• pouvant prendre des arguments• y compris des valeurs par défaut
Le défilé des collections
Syntaxe spéciale pour les collectionsdef list = [1, 2, 4, 'a', 'b', 'c']assert list[3] == 'a'
list << 'd'assert list[6] == 'd'
def range = 1..10assert range.size() == 10
def map = [a: 1, b: 2, c: 3]assert map['b'] == 2assert map.b == 2
map['d'] = 'Mix'map.e = 'IT'assert [map.d, map['e']].join('-‐') == 'Mix-‐IT'
Syntaxe spéciale pour les collectionsdef list = [1, 2, 4, 'a', 'b', 'c']assert list[3] == 'a'
list << 'd'assert list[6] == 'd'
def range = 1..10assert range.size() == 10
def map = [a: 1, b: 2, c: 3]assert map['b'] == 2assert map.b == 2
map['d'] = 'Mix'map.e = 'IT'assert [map.d, map['e']].join('-‐') == 'Mix-‐IT'
Liste
Syntaxe spéciale pour les collectionsdef list = [1, 2, 4, 'a', 'b', 'c']assert list[3] == 'a'
list << 'd'assert list[6] == 'd'
def range = 1..10assert range.size() == 10
def map = [a: 1, b: 2, c: 3]assert map['b'] == 2assert map.b == 2
map['d'] = 'Mix'map.e = 'IT'assert [map.d, map['e']].join('-‐') == 'Mix-‐IT'
Liste
Range
Syntaxe spéciale pour les collectionsdef list = [1, 2, 4, 'a', 'b', 'c']assert list[3] == 'a'
list << 'd'assert list[6] == 'd'
def range = 1..10assert range.size() == 10
def map = [a: 1, b: 2, c: 3]assert map['b'] == 2assert map.b == 2
map['d'] = 'Mix'map.e = 'IT'assert [map.d, map['e']].join('-‐') == 'Mix-‐IT'
Liste
Range
Map
Vous avez vu le « power assert » de Groovy ?
def (e, m, c) = [123, 1, 3e9]
assert e == m * c * 2
Vous avez vu le « power assert » de Groovy ?
def (e, m, c) = [123, 1, 3e9]
assert e == m * c * 2Assignation
multiple
Vous avez vu le « power assert » de Groovy ?
def (e, m, c) = [123, 1, 3e9]
assert e == m * c * 2
Assertion failed:
assert e == m * c * 2 | | | | | | | | 1 | | 6E+9 | false| 3E+9 123 3E+9
Assignation multiple
Vous avez vu le « power assert » de Groovy ?
def (e, m, c) = [123, 1, 3e9]
assert e == m * c * 2
Assertion failed:
assert e == m * c * 2 | | | | | | | | 1 | | 6E+9 | false| 3E+9 123 3E+9
Toutes les valeurs des
sous-expressions
Assignation multiple
La magie de la méta-programmation
Créer un projet GradleUtiliser le plugin Groovy
Bon, ben... c’est parti !
Créer un projet et appliquer le plugin Groovy
• Dans un nouveau répertoire projet, créer un fichier build.gradle, contenant :
apply plugin: 'groovy'
repositories { mavenCentral()}
dependencies { compile 'org.codehaus.groovy:groovy-‐all:2.1.3' testCompile 'org.spockframework:spock-‐core:0.7-‐groovy-‐2.0'}
Créer un projet et appliquer le plugin Groovy
• Créer quelques répertoires :
• src/main/groovy
• src/test/groovy
Créer un projet et appliquer le plugin Groovy
• Créer quelques répertoires :
• src/main/groovy
• src/test/groovy
Nos fichiers source Java & Groovy
Créer un projet et appliquer le plugin Groovy
• Créer quelques répertoires :
• src/main/groovy
• src/test/groovy
Nos fichiers source Java & Groovy
Pour découvrir le framework de test Spock
Créer un projet et appliquer le plugin Groovy
• Lister les tâches disponibles :
$ gradle tasks
Pour tester et builder notre projet
Pour tester et builder notre projet
Générer la documentation
Pour tester et builder notre projet
Générer la documentation
Pour lancer les tests
Pour tester et builder notre projet
Générer la documentation
Pour lancer les tests
Faire un peu le ménage
Spock : Enterprise test framework
Questions & Réponses
Merci ! @glaforge
http://glaforge.appspot.com http://gplus.to/glaforge
Crédits images• canon
http://uponamidnightdreary.com/wp-content/uploads/2011/12/AR22442.jpg
• costumehttp://cdn2.kebello.com/8235-thickbox/costume-3-pieces-ref-patrick.jpg
• mickeyhttp://4.bp.blogspot.com/-i9hzB7QYgq4/To9UufDo5dI/AAAAAAAAB2g/lKHHMm-KC68/s1600/f787ec3b56c3bd76_mickey-mouse.jpg
• gstringhttp://cdnb.lystit.com/photos/2012/11/23/dg-noir-gstring-product-1-5588280-166851249_large_flex.jpeg
• défiléhttp://www.lesreceptionstendances.com/wp-content/uploads/2012/07/organiser-un-d%C3%A9fil%C3%A9-de-mode-4.jpg
• fantasiahttp://images.wikia.com/disney/images/d/d8/Fantasia-disneyscreencaps.com-2363.jpg
• Spockhttp://images1.fanpop.com/images/photos/2500000/Zachary-Quinto-Spock-star-trek-2597267-2560-1921.jpg
• cloturehttp://www.lusitane.fr/Userfiles/image/cloture-beton-pedra%20(17).JPG