Enib cours c.a.i. web - séance #5 - groovy

412 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
412
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Enib cours c.a.i. web - séance #5 - groovy

  1. 1. Conception dApplicationsInteractives :Applications Web et JEESéance #5Groovy & Grails
  2. 2. Introduction à Groovy
  3. 3. OrigineJames Strachan to Bob McWhirter in 2003:Wouldn’t it be “groovy” if we could have nativesyntax for lists, maps and regexs in Javalike in most scripting languages?Wouldn’t it be “groovy” if we could haveduck typing in Java?Wouldn’t it be “groovy” if we hadclosures and properties in Java?
  4. 4. GroovyLangage 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. 5. GroovyLangage de POO destiné à la plate-forme Java● Typages statique et dynamique● Support natif pour listes, maps, etexpressions régulières● Fermetures ou clôtures (closures)● Surcharge des opérateurshttp://groovy.codehaus.org/
  6. 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. 7. Un programme en Javapublic 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(quot;Groovyquot;);System.out.println( helloWorld.greet() );}}
  8. 8. Un programme en Groovypublic 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(quot;Groovyquot;);System.out.println( helloWorld.greet() );}}
  9. 9. Le même programme bienrécrit en Groovyclass HelloWorld {String nameString greet() {"Hello $name"}}def helloWorld = new HelloWorld(name: "Groovy")println helloWorld.greet()
  10. 10. ● Même aspect quune déclaration Java○ Le modificateur par défaut est publiqueDéclaration de classesclass HelloWorld {String nameString greet() {"Hello $name"}}
  11. 11. ● Possibilité dutiliser du typage statiquecomme dans Java● Possibilité dutiliser le typage dynamique enremplaçant le type par le mot clé def● Les paramètres formelles dune méthode ouclosure nont pas besoin de defTypage optionneldef helloWorld = new HelloWorld(name: "Groovy")
  12. 12. ● Dans les appels aux méthodes avec des paramètres onpeut omettre les parenthèsesAppel aux méthodesdef a = "Toto"print(a)print amethod(a, b)method a, bmove(from:"ici", to:"là bas")move from:"ici", to:"là bas"list.each( { println it } )list.each(){ println it }list.each { println it }
  13. 13. ● Script : du code Groovy non enfermé dansune déclaration de classe○ Pas besoin dune méthode mainScriptsclass HelloWorld {String nameString greet() {"Hello $name"}}def helloWorld = new HelloWorld(name: "Groovy")println helloWorld.greet()
  14. 14. ● Les propriétés dune classe sont déclaréescomme attributs de la classe○ Des getters et setters sont générés lors de lacompilation/interprétationPropriétésclass Beer {String nameString breweryString countrydouble alcohol}
  15. 15. Opérateurs
  16. 16. ● ExemplesChaînes de caractèresliteral Stringliteralmultiline Stringdef lang = Groovy"GString for $lang""$lang has ${lang.size()} chars""""multiline GString withlate eval at ${-> new Date()}"""text = "Hello World!"text[0] // returns "H"text[0..4] // returns "Hello"text[0..<4] // returns "Hell"text[-1] // returns "!" (last char)text[-6..-1] // "World!"(last 6 to last char)
  17. 17. ● ExemplesGammes de valeursassert (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 }
  18. 18. ● Listes et maps sont des éléments depremière classe dans Groovy○ Syntaxe adaptée, simplificationListes et maps// Une liste videdef a=[]//Ajoutons des élementsa.add("toto")a.add("titi")//Listons les contenusprint a//Résultat : [toto, titi]
  19. 19. 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]]
  20. 20. Manipulation des listesdef anims = [cat,kangaroo,koala]anims[2] == koalaanims[0..1,2] == [cat,kangaroo,koala]def kanims = anims[1..2]anims.findAll{it =~ /k.*/} == kanimsanims.find{ it =~ /k.*/} == kanims[0]anims.grep(~/k.*/) == kanimsanims.join( )anims.remove(1)anims.each { println it }Des indexes négatives indiquent la fin de la listedef list = [0,1,2]assert list[-1] == 2assert list[-1..0] == list.reverse()assert list == [list.head()] + list.tail()
  21. 21. Mapsdef map = [a:0, b:1]def empty = [:]Syntaxe semblable à celle des listesPour récupérer une valeur on peut mettre la clé entrecrochets ou comme une propriété de la mapassert map[a] == 0assert map.b == 1map[a] = xmap.b = yassert map == [a:x, b:y]
  22. 22. Manipulation des mapsdef map = [a:0, b:1]def empty = [:]Syntaxe semblable à celle des listesPour 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 getassert map[a] == 0assert map.b == 1map[a] = xmap.b = yassert map == [a:x, b:y]assert map.c == nullassert map.get(c, 2) == 2assert map.c == 2
  23. 23. Manipulation des mapsmap.each { entry ->println entry.keyprintln 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 }Des méthodes ditération permettent de parcourir la map ensappliquant à chaque couple clé/valeur
  24. 24. ● Des fonctions qui capturent des références àlenvironnement dans lequel ils sexécutent○ Des objets de première classe en GroovyClosures (fermetures)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
  25. 25. ● Paramètres dans une closureClosures (fermetures)
  26. 26. Comment apprendreGroovy ?Je ne vais pas passer une heure à vos passerdes slides● Méthode peu efficaceTentons quelque chose de nouveau● Approche pratiqueEssayons les Groovy Koans !Groovy Koans ? Kesaco ?
  27. 27. KoansUne nouvelle façon dapprendre 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 quilspassent○ Et apprendre le langage en passantMéthode dapprentissage différente et éfficace !
  28. 28. Groovy Koans :Learn Groovy with the Koanshttp://groovykoans.org/
  29. 29. Scala Koans1. Telecharger le .zip sur http://groovykoans.org/2. Extraire tout et exécuter ./gradlew removeSolutions3. Exécuter chaque koan :> ./gradlew koanXXoù XX est le numéro du koan sur 2 charactères4. Ouvrir le fichier source du koan, léditer et voir si çapasse
  30. 30. Cest lheure des Groovy Koans !

×