SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
Conception d'Applications
Interactives :
Applications Web et JEE
Séance #3
Groovy
Introduction à Groovy
Origine
James Strachan to Bob McWhirter in 2003:
Wouldn’t it be “groovy” if we could have native
syntax for lists, maps and regexs in Java
like in most scripting languages?
Wouldn’t it be “groovy” if we could have
duck typing in Java?
Wouldn’t it be “groovy” if we had
closures and properties in Java?
Groovy
Langage de POO destiné à la plate-forme Java
● Inspiré de Python, Ruby et Smalltalk
● Syntaxe très proche de Java
● Compilé
○ soit à la volée dynamiquement
○ soit classiquement vers bytecode
Groovy
Langage de POO destiné à la plate-forme Java
● Typages statique et dynamique
● Support natif pour listes, maps, et
expressions régulières
● Fermetures ou clôtures (closures)
● Surcharge des opérateurs
http://groovy.codehaus.org/
Intégration avec Java
○ Groovy génère du bytecode Java pour la JVM
■ Same strings, same regex S
■ Same APIs — JDK, collections, 3rd party, etc.
■ Same security model, same threading model
■ Same OO concepts
○ Compilation croisée
■ Compilateur groovyc pour Java et Groovy
■ Interopérabilité et mixité parfaite
Objectifs de Groovy
● Faciliter la vie du développeur Java
○ Un sur-ensemble de Java
○ Très facile à apprendre

● Aussi rapide et sur que Java
○ Avec validation de typage et compilation statiques

● Expressif, concis et légible
Un programme en Java
public class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String greet() {
return quot;Hello quot;+ name;
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Groovy");
System.out.println(helloWorld.greet());
}
}
Un programme en Groovy
public class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String greet() {
return quot;Hello quot;+ name;
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Groovy");
System.out.println(helloWorld.greet());
}
}
Le même programme bien
récrit en Groovy
class HelloWorld {
String name
def greet() {
"Hello $name"
}
}
def helloWorld = new HelloWorld(name: "Groovy")
println helloWorld.greet()
Le développeur Java, déjà
un développeur Groovy
● Code Java valable

Code Groovy valable

○ Dans 90% des cas

● Courbe d'apprentissage très douce
Déclaration de classes
● Même aspect qu'une déclaration Java
○ Le modificateur par défaut est publique

class HelloWorld {
String name
String greet() {
"Hello $name"
}
}
Plein de choses optionnelles
● Les points-virgules en fin de ligntye

● Le typage des variables et méthodes
● Les mots clés return et public
● Les parenthèses dans les appels aux méthodes
Typage optionnel
● Possibilité d'utiliser le typage statique
○ Comme dans Java

● Possibilité d'utiliser le typage dynamique
○ en remplaçant le type par le mot clé def

● Pas besoin de def pour les paramètres formelles
○ pour les des méthodes ou closures

def helloWorld = new HelloWorld(name: "Groovy")
Appel aux méthodes
● Dans les appels aux méthodes avec des paramètres on
peut omettre les parenthèses
def a = "Toto"
print(a)
print a
method(a, b)
method a, b

move(from:"ici", to:"là bas")
move from:"ici", to:"là bas"
list.each({ println it })
list.each(){ println it }
list.each { println it }
Scripts
● Script : du code Groovy non enfermé dans
une déclaration de classe
○ Pas besoin d'une méthode main
class HelloWorld {
String name
String greet() {
"Hello $name"
}
}
def helloWorld = new HelloWorld(name: "Groovy")
println helloWorld.greet()
Propriétés
● Les propriétés d'une classe sont déclarées
comme attributs de la classe
○ Des getters et setters sont générés lors de la
compilation/interprétation

class Beer {
String name
String brewery
String country
double alcohol
}
Opérateurs
Chaînes de caractères
● Exemples
'literal String'
'''literal
multiline String'''
def lang = 'Groovy'
"GString for $lang"
"$lang has ${lang.size()} chars"
"""multiline GString with
late eval at ${-> new Date()}"""
text = "Hello
text[0]
text[0..4]
text[0..<4]
text[-1]
text[-6..-1]

World!"
// returns "H"
// returns "Hello"
// returns "Hell"
// returns "!" (last char)
// "World!"(last 6 to last char)
Gammes de valeurs
● Exemples
assert (0..10).contains(5)
assert (0.0..10.0).containsWithinBounds(3.5)
for (item in 0..10) { println item }
for (item in 10..0) { println item }
(0..<10).each { println it }
Listes et maps
● Listes et maps sont des éléments de
première classe dans Groovy
○ Syntaxe adaptée, simplification
// Une liste vide
def a=[]
//Ajoutons des élements
a.add("toto")
a.add("titi")
//Listons les contenus
print a
//Résultat : [toto, titi]
Manipulation des listes
[1,2,3,4] == (1..4)
[1,2,3] + [1] == [1,2,3,1]
[1,2,3] << 1 == [1,2,3,1]
[1,2,3,1] - [1] == [2,3]
[1,2,3] * 2 == [1,2,3,1,2,3]
[1,[2,3]].flatten() == [1,2,3]
[1,2,3].reverse() == [3,2,1]
[1,2,3].disjoint([4,5,6]) == true
[1,2,3].intersect([4,3,1]) == [3,1]
[1,2,3].collect{ it+3 } == [4,5,6]
[1,2,3,1].unique().size() == 3
[1,2,3,1].count(1) == 2
[1,2,3,4].min() == 1
[1,2,3,4].max() == 4
[1,2,3,4].sum() == 10
[4,2,1,3].sort() == [1, 2, 3, 4]
[4,2,1,3].findAll{it%2 == 0} == [4,2]
[['a', 'b'], [1, 2]].transpose() == [['a', 1], ['b', 2]]
Manipulation des listes
def anims = ['cat','kangaroo','koala']
assert anims[2] == 'koala'
assert anims[0..1,2] == ['cat','kangaroo','koala']
def kanims = anims[1..2]
assert anims.findAll{it =~ /k.*/} == kanims
assert anims.find{ it =~ /k.*/} == kanims[0]
assert anims.grep(~/k.*/) == kanims
assert anims.join(' ') == 'cat kangaroo koala'
anims.remove(1)
assert anims == ['cat','koala']
anims.each { println it }

Des indexes négatives indiquent la fin de la liste
def list = [0,1,2]
assert list[-1] == 2
assert list[-1..0] == list.reverse()
assert list == [list.head()] + list.tail()
Maps
Syntaxe semblable à celle des listes
def map = [a:0, b:1]
def empty = [:]

Pour récupérer une valeur on peut :
● mettre la clé entre crochets
● mettre la clé comme une propriété de la map
● utiliser la méthode get
assert map['a'] == 0
assert map.b == 1
map['a'] = 'x'
map.b = 'y'
assert map == [a:'x', b:'y']
assert map.c == null
assert map.get('c', 2) == 2
assert map.c == 2
Manipulation des maps
Des méthodes d'itération permettent de parcourir la map en
s'appliquant à chaque couple clé/valeur
map.each { entry ->
println entry.key
println entry.value
}
map.each { key, value -> println "$key $value" }
for (entry in map) {
println "$entry.key $entry.value"
}
assert map.every { it.value.size() == 1 }
assert map.any { it.key % 4 == 0 }
Closures (fermetures)
● Des fonctions qui capturent des références à
l'environnement dans lequel ils s'exécutent
○ Des objets de première classe en Groovy
a = [1,2,3]
a.each({ x -> println x * x })
a.each { x -> println x * x }
a.each { println it * it }
def squareIt = { println it * it }
a.each(squareIt)
a.each squareIt
Closures (fermetures)
● Paramètres dans une closure
Comment apprendre
Groovy ?
Je ne vais pas passer une heure à vos passer
des slides
● Méthode peu efficace

Tentons quelque chose de nouveau
● Approche pratique

Essayons les Groovy Koans !
Groovy Koans ? Kesaco ?
Koans
Une nouvelle façon d'apprendre un langage
● Des petits cas pratiques
○ Sous la forme de suites de tests unitaires

● Chaque cas orienté pour un concept
○ Et un ensemble de tests qui ne passent pas

● Objectif : réparer les tests pour qu'ils
passent
○ Et apprendre le langage en passant

Méthode d'apprentissage différente et éfficace !
Groovy Koans :
Learn Groovy with the Koans
http://groovykoans.org/
C'est l'heure des Groovy Koans !

Contenu connexe

Tendances

Beyond F5 - windbg et .Net
Beyond F5 - windbg et .NetBeyond F5 - windbg et .Net
Beyond F5 - windbg et .NetYann Schwartz
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Frank Denis
 
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...cppfrug
 
Good or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptGood or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptNoirdes
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.netZakaria SMAHI
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Ruau Mickael
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Ruau Mickael
 
Rapport Administration des systémes Linux (Shells bash)
Rapport Administration des systémes Linux (Shells bash)Rapport Administration des systémes Linux (Shells bash)
Rapport Administration des systémes Linux (Shells bash)Ayoub Rouzi
 

Tendances (12)

Beyond F5 - windbg et .Net
Beyond F5 - windbg et .NetBeyond F5 - windbg et .Net
Beyond F5 - windbg et .Net
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2)
 
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
 
Good or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptGood or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en Javascript
 
Programmation shell
Programmation shellProgrammation shell
Programmation shell
 
Tour C++
Tour C++Tour C++
Tour C++
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.net
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?
 
Rapport Administration des systémes Linux (Shells bash)
Rapport Administration des systémes Linux (Shells bash)Rapport Administration des systémes Linux (Shells bash)
Rapport Administration des systémes Linux (Shells bash)
 

En vedette

Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...Horacio Gonzalez
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursHoracio Gonzalez
 
Grails Simple Login
Grails Simple LoginGrails Simple Login
Grails Simple Loginmoniguna
 
Enib cours c.a.i. web - séance #5 : td grails
Enib   cours c.a.i. web - séance #5 : td grailsEnib   cours c.a.i. web - séance #5 : td grails
Enib cours c.a.i. web - séance #5 : td grailsHoracio Gonzalez
 
ENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidement
ENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidementENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidement
ENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidementHoracio Gonzalez
 

En vedette (6)

Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
 
Grails Simple Login
Grails Simple LoginGrails Simple Login
Grails Simple Login
 
Enib cours c.a.i. web - séance #5 : td grails
Enib   cours c.a.i. web - séance #5 : td grailsEnib   cours c.a.i. web - séance #5 : td grails
Enib cours c.a.i. web - séance #5 : td grails
 
ENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidement
ENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidementENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidement
ENIB 2013-2014 - CAI Web #3: J’ai besoin d’une appli web rapidement
 

Similaire à ENIB 2013-2014 - CAI Web #3: Groovy

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations GreendroidGDG Nantes
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDidier Plaindoux
 
Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Aurélien Maury
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScriptHabib Ayad
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresECAM Brussels Engineering School
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 

Similaire à ENIB 2013-2014 - CAI Web #3: Groovy (20)

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations Greendroid
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015
 
Dynamic Languages
Dynamic LanguagesDynamic Languages
Dynamic Languages
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvements
 
Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScript
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 

Plus de Horacio Gonzalez

Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Horacio Gonzalez
 
But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...Horacio Gonzalez
 
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27Horacio Gonzalez
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...Horacio Gonzalez
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSHoracio Gonzalez
 
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09Horacio Gonzalez
 
Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09Horacio Gonzalez
 
Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20Horacio Gonzalez
 
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24 Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24 Horacio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScriptENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScriptHoracio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...Horacio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQLENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQLHoracio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JSENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JSHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQLENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQLHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScriptENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScriptHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...Horacio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...Horacio Gonzalez
 
Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18Horacio Gonzalez
 
Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16 Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16 Horacio Gonzalez
 

Plus de Horacio Gonzalez (20)

Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
 
But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...
 
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
 
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
 
Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09
 
Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20
 
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24 Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
 
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScriptENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
 
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQLENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JSENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
 
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQLENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
 
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScriptENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
 
Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18
 
Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16 Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16
 

ENIB 2013-2014 - CAI Web #3: Groovy

  • 3. Origine James Strachan to Bob McWhirter in 2003: Wouldn’t it be “groovy” if we could have native syntax for lists, maps and regexs in Java like in most scripting languages? Wouldn’t it be “groovy” if we could have duck typing in Java? Wouldn’t it be “groovy” if we had closures and properties in Java?
  • 4. Groovy Langage de POO destiné à la plate-forme Java ● Inspiré de Python, Ruby et Smalltalk ● Syntaxe très proche de Java ● Compilé ○ soit à la volée dynamiquement ○ soit classiquement vers bytecode
  • 5. Groovy Langage de POO destiné à la plate-forme Java ● Typages statique et dynamique ● Support natif pour listes, maps, et expressions régulières ● Fermetures ou clôtures (closures) ● Surcharge des opérateurs http://groovy.codehaus.org/
  • 6. Intégration avec Java ○ Groovy génère du bytecode Java pour la JVM ■ Same strings, same regex S ■ Same APIs — JDK, collections, 3rd party, etc. ■ Same security model, same threading model ■ Same OO concepts ○ Compilation croisée ■ Compilateur groovyc pour Java et Groovy ■ Interopérabilité et mixité parfaite
  • 7. Objectifs de Groovy ● Faciliter la vie du développeur Java ○ Un sur-ensemble de Java ○ Très facile à apprendre ● Aussi rapide et sur que Java ○ Avec validation de typage et compilation statiques ● Expressif, concis et légible
  • 8. Un programme en Java public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return quot;Hello quot;+ name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }
  • 9. Un programme en Groovy public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return quot;Hello quot;+ name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }
  • 10. Le même programme bien récrit en Groovy class HelloWorld { String name def greet() { "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  • 11. Le développeur Java, déjà un développeur Groovy ● Code Java valable Code Groovy valable ○ Dans 90% des cas ● Courbe d'apprentissage très douce
  • 12. Déclaration de classes ● Même aspect qu'une déclaration Java ○ Le modificateur par défaut est publique class HelloWorld { String name String greet() { "Hello $name" } }
  • 13. Plein de choses optionnelles ● Les points-virgules en fin de ligntye ● Le typage des variables et méthodes ● Les mots clés return et public ● Les parenthèses dans les appels aux méthodes
  • 14. Typage optionnel ● Possibilité d'utiliser le typage statique ○ Comme dans Java ● Possibilité d'utiliser le typage dynamique ○ en remplaçant le type par le mot clé def ● Pas besoin de def pour les paramètres formelles ○ pour les des méthodes ou closures def helloWorld = new HelloWorld(name: "Groovy")
  • 15. Appel aux méthodes ● Dans les appels aux méthodes avec des paramètres on peut omettre les parenthèses def a = "Toto" print(a) print a method(a, b) method a, b move(from:"ici", to:"là bas") move from:"ici", to:"là bas" list.each({ println it }) list.each(){ println it } list.each { println it }
  • 16. Scripts ● Script : du code Groovy non enfermé dans une déclaration de classe ○ Pas besoin d'une méthode main class HelloWorld { String name String greet() { "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  • 17. Propriétés ● Les propriétés d'une classe sont déclarées comme attributs de la classe ○ Des getters et setters sont générés lors de la compilation/interprétation class Beer { String name String brewery String country double alcohol }
  • 19. Chaînes de caractères ● Exemples 'literal String' '''literal multiline String''' def lang = 'Groovy' "GString for $lang" "$lang has ${lang.size()} chars" """multiline GString with late eval at ${-> new Date()}""" text = "Hello text[0] text[0..4] text[0..<4] text[-1] text[-6..-1] World!" // returns "H" // returns "Hello" // returns "Hell" // returns "!" (last char) // "World!"(last 6 to last char)
  • 20. Gammes de valeurs ● Exemples assert (0..10).contains(5) assert (0.0..10.0).containsWithinBounds(3.5) for (item in 0..10) { println item } for (item in 10..0) { println item } (0..<10).each { println it }
  • 21. Listes et maps ● Listes et maps sont des éléments de première classe dans Groovy ○ Syntaxe adaptée, simplification // Une liste vide def a=[] //Ajoutons des élements a.add("toto") a.add("titi") //Listons les contenus print a //Résultat : [toto, titi]
  • 22. Manipulation des listes [1,2,3,4] == (1..4) [1,2,3] + [1] == [1,2,3,1] [1,2,3] << 1 == [1,2,3,1] [1,2,3,1] - [1] == [2,3] [1,2,3] * 2 == [1,2,3,1,2,3] [1,[2,3]].flatten() == [1,2,3] [1,2,3].reverse() == [3,2,1] [1,2,3].disjoint([4,5,6]) == true [1,2,3].intersect([4,3,1]) == [3,1] [1,2,3].collect{ it+3 } == [4,5,6] [1,2,3,1].unique().size() == 3 [1,2,3,1].count(1) == 2 [1,2,3,4].min() == 1 [1,2,3,4].max() == 4 [1,2,3,4].sum() == 10 [4,2,1,3].sort() == [1, 2, 3, 4] [4,2,1,3].findAll{it%2 == 0} == [4,2] [['a', 'b'], [1, 2]].transpose() == [['a', 1], ['b', 2]]
  • 23. Manipulation des listes def anims = ['cat','kangaroo','koala'] assert anims[2] == 'koala' assert anims[0..1,2] == ['cat','kangaroo','koala'] def kanims = anims[1..2] assert anims.findAll{it =~ /k.*/} == kanims assert anims.find{ it =~ /k.*/} == kanims[0] assert anims.grep(~/k.*/) == kanims assert anims.join(' ') == 'cat kangaroo koala' anims.remove(1) assert anims == ['cat','koala'] anims.each { println it } Des indexes négatives indiquent la fin de la liste def list = [0,1,2] assert list[-1] == 2 assert list[-1..0] == list.reverse() assert list == [list.head()] + list.tail()
  • 24. Maps Syntaxe semblable à celle des listes def map = [a:0, b:1] def empty = [:] Pour récupérer une valeur on peut : ● mettre la clé entre crochets ● mettre la clé comme une propriété de la map ● utiliser la méthode get assert map['a'] == 0 assert map.b == 1 map['a'] = 'x' map.b = 'y' assert map == [a:'x', b:'y'] assert map.c == null assert map.get('c', 2) == 2 assert map.c == 2
  • 25. Manipulation des maps Des méthodes d'itération permettent de parcourir la map en s'appliquant à chaque couple clé/valeur map.each { entry -> println entry.key println entry.value } map.each { key, value -> println "$key $value" } for (entry in map) { println "$entry.key $entry.value" } assert map.every { it.value.size() == 1 } assert map.any { it.key % 4 == 0 }
  • 26. Closures (fermetures) ● Des fonctions qui capturent des références à l'environnement dans lequel ils s'exécutent ○ Des objets de première classe en Groovy a = [1,2,3] a.each({ x -> println x * x }) a.each { x -> println x * x } a.each { println it * it } def squareIt = { println it * it } a.each(squareIt) a.each squareIt
  • 28. Comment apprendre Groovy ? Je ne vais pas passer une heure à vos passer des slides ● Méthode peu efficace Tentons quelque chose de nouveau ● Approche pratique Essayons les Groovy Koans ! Groovy Koans ? Kesaco ?
  • 29. Koans Une nouvelle façon d'apprendre un langage ● Des petits cas pratiques ○ Sous la forme de suites de tests unitaires ● Chaque cas orienté pour un concept ○ Et un ensemble de tests qui ne passent pas ● Objectif : réparer les tests pour qu'ils passent ○ Et apprendre le langage en passant Méthode d'apprentissage différente et éfficace !
  • 30. Groovy Koans : Learn Groovy with the Koans http://groovykoans.org/
  • 31. C'est l'heure des Groovy Koans !