SlideShare une entreprise Scribd logo
Conception d'Applications
       Interactives :
 Applications Web et JEE
            Séance #5
     Scala / Play! Framework
Langages alternatives pour la JVM
Langages alternatives pour la JVM



                 Java ≠ JVM
● Java : Langage qui compile vers du bytecode
● JVM : Machine virtuelle qui exécute du bytecode
La JVM en tant que plate-forme
● Build once, run everywhere
  ○ Des implémentations de JVM pour la plupart du
    hardware et OS
  ○ Bytecode format pivot indépendant de la plate-forme


● Tendance à s'affranchir de l'OS
  ○ Côté client : navigateur comme plate-forme
  ○ Côté serveur : JVM comme plate-forme
Pourquoi des nouveaux langages
         If all you have is a hammer,
          everything looks like a nail

Java est un très bon langage généraliste, mais
pas la solution ultime
● Scripting ?
● Programmation fonctionnelle ?
● Simplification et réduction du boilerplate ?
Pourquoi des nouveaux langages
sur la JVM
● Le target est le bytecode
  ○ Pas besoin d'implémenter la compilation vers le
    format natif de chaque OS


● Profiter de l'écosystème Java
  ○ Bibliothèques, serveurs, outils...
  ○ Courbe d'adoption moins ardue


● Support pour langages à typage dynamique
  ○ JSR 292, invokedynamic
  ○ Intégrée à la JVM depuis Java 1.7
Quels sont ces langages ?



● Des langages nouveaux :
  ○ Clojure, Groovy, Scala, Ceylon, Kotlin...



● Des implémentations d'autres langages
  ○ JRuby (Ruby), Jython (Python), Rhino (JS), Elastic
    COBOL (Cobol), JGNAT (Ada), Luaj (Lua)...
Jython
Interprète Python écrit en Java, créé en 1997

●   Compilation de code Python en bytecode
●   Héritage de classes Java par des classes Python
●   Scripting de code Python dans un programme Java
●   Utilisation d'objets Java dans du code Python

Très utilisé pour prototypage, scripting et exploration des
classes Java


                http://www.jython.org/
JRuby
Interprète Ruby écrit en Java, créé en 2001

● Equivalente de Jython pout Ruby
● Capable de faire tourner Rails
● Plus rapide que l'implémentation de
  référence
   ○   Option JIT


                http://www.jruby.org/
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
● 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/
Ceylon
Nouveau langage pour la JVM par RedHat
● "Java tel qu'ils serait si il avait été développé
  aujourd'hui"
● Typage statique
  ○ Types union et intersection
● Syntaxe régulière
  ○ Sucre syntactique ajouté
● Modulaire
  ○ Dépôt Ceylon Herd


             http://www.ceylon-lang.org/
Scala
Langage de programmation multi-paradigme
  ○ Programmations orientée objet et fonctionnelle


● Typage statique, syntaxe concise
● Compilé vers bytecode
● Intéropérabilité avec le code Java

           http://www.scala-lang.org/
Le développeur multi-lingue
● Environnement JVM en mouvement continu
  ○ Nouveaux langages
  ○ Nouveaux frameworks
  ○ Nouveaux outils


● Ne pas se tenir à jour, ne pas apprendre =
  stagner, régresser.
  ○ Un nouveau langage par an
  ○ Un nouveau framework tous les 3 mois
Introduction à Scala
Scala
Langage de programmation multi-paradigme
  ○ Programmations orientée objet et fonctionnelle


● Typage statique, syntaxe concise
● Compilé vers bytecode
● Intéropérabilité avec le code Java

           http://www.scala-lang.org/
La console REPL
REPL : Read Event Print Loop

● Console intéractive pour l'interprétation de
  Scala
    horacio@horacio-laptop:$ scala
    Welcome to Scala version 2.10.0-RC3 (Java HotSpot(TM)
    Server VM, Java 1.6.0_31).
    Type in expressions to have them evaluated.
    Type :help for more information.

    scala> val revolution : Int = 1789
    revolution: Int = 1789

    scala>
val et var
● var : variables (mutables)
● val : valeurs (constantes, inmutables)

    scala> val revolution : Int = 1789
    revolution: Int = 1789

    scala> revolution = 1917
    <console>:8: error: reassignment to val
           revolution = 1917
                      ^
    scala> var variable : String = "Ma variable"
    variable: String = Ma variable

    scala> variable = "Notre variable"
    variable: String = Notre variable

    scala>
Classes
● Pas besoin de déclarer les attributs privés et
  les getters et setters
   ○ Le constructeur suffit


● Constructeur avec des valeurs par défaut
     scala> case class Employee( name:String="guest", age:
     Int=30, company:String = "DevCode" )
     defined class Employee

     scala> val guest = Employee()
     guest: Employee = Employee(guest,30,DevCode)

     scala> val guestAge = guest.age
     guestAge: Int = 30

     scala>
Classes
● Définition explicite des paramètres lors des appels aux
  méthodes

● Méthode copy pour créer des copies des objets

     scala> case class Employee( name:String="guest", age:
     Int=30, company:String = "DevCode" )
     defined class Employee

     scala> val luke = Employee("Luke", company="LucasArt")
     luke: Employee = Employee(Luke,30,LucasArt)

     scala> val yoda = luke.copy("Yoda", age=800)
     yoda: Employee = Employee(Yoda,800,LucasArt)


     scala>
Collections
● Les listes et les maps sont des types natifs
  ○ Immuables par défaut

● Simplification des génériques Java
  ○ Inférence des types
     scala> val numbers = List(1,2,3)
     numbers: List[Int] = List(1, 2, 3)

     scala>   for (n <- numbers) println("Number "+n)
     Number   1
     Number   2
     Number   3

     scala>
Collections
● Le for est "très Java"
  ○ Façon Scala : Utiliser des fonctions
                             functionName { input =>
                                             body
                                           }




  scala> val numbers = List(1,2,3)
  numbers: List[Int] = List(1, 2, 3)

  scala>   numbers.foreach { n:Int =>   // Enter to continue on the next line
       |   println("Number "+n)
       |   }
  Number   1
  Number   2
  Number   3



  scala>
Collections
● D'autres exemples des fonctions sur des listes
  scala> val reversedList = numbers.reverse
  reversedList: List[Int] = List(3, 2, 1)

  scala> val numbersLessThan3 = numbers.filter { n => n < 3 }
  numbersLessThan3: List[Int] = List(1, 2)

  scala> val oddNumbers = numbers.filterNot { n => n % 2 == 0 }
  oddNumbers: List[Int] = List(1, 3)

  scala> val higherNumbers = numbers.map { n => n + 10 }
  higherNumbers: List[Int] = List(11, 12, 13)

  scala> val sumOfNumbers = numbers.foldLeft(0) { (total,element) =>
     | total + element
     | }
  sumOfNumbers: Int = 6

  scala> val sumOfNumbers = numbers.sum
  sumOfNumbers: Int = 6

  scala> val higherNumbers = numbers.map(_+10)
  higherNumbers: List[Int] = List(11, 12, 13)

  scala>
Comment apprendre
Scala ?
Je ne vais pas passer une heure à vos passer
des slides
● Méthode peu éfficace

Tentons quelque chose de nouveau
● Approche pratique

      Essayons les Scala Koans !

Scala 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 !
Scala Koans :
Learn Scala with the Koans
       http://www.scalakoans.org/
Scala Koans

1. Telecharger le .zip sur http://www.scalakoans.org/
2. Extraire tout et exécuter le fichier ./sbt
3. Compiler les tests avec :
   > test:compile
4. Exécuter tous les koans avec :
   > ~test-only org.functionalkoans.forscala.Koans
   ou
   Exécuter un koan en concret :
   > ~test-only org.functionalkoans.forscala.AboutAsserts
5. Ouvrir le fichier source du koan, l'éditer et voir si ça
   passe
C'est l'heure des Scala Koans !
Play! Framework



Play 2.0, a Web framework for a new era
Le projet Play!
Play! est un framework pour
● faire du développement web
● avec une haute productivité
● avec l'état de l'art des technologies web
● sur la JVM
Play! : productivité et plaisir
● Conçu par des développeurs web pour des
    développeurs web
●   Gestion simple, flexible et puissante du protocole HTTP
    ○ Framework web -> HTTP au centre
    ○ Stateless, request-response
●   Facilité de démarrage
    ○ Courbe d'apprentissage douce
●   Rapidité et simplicité : change le code et recharge la
    page !
●   Framework complet, full-stack
Play! : pas un jouet
●   Modèle de programmation HTTP asynchrone
●   Architecture scalable de haute performance
●   Modèle reactive, non bloquant
●   Typage fort
Suivons le web !
    When a web framework starts an architecture fight
          with the web, the framework loses.




● PHP et Ruby on Rails l'ont bien compris
   ○ Si on fait du web, on s'adapte au web !

● Exemples : session, bouton back...

● Play! a une architecture stateless basé sur HTTP
Modifiez, rechargez, c'est fait !



● Devoir redémarrer le serveur après une modif ?
● Redéployer car on a changé un fichier ?

● A nouveau, regardons PHP ou Ruby on Rails
   ○ Si on fait du web, on s'adapte au web !

● Avec Play! il suffit de recharger la page et la modif est
   prise en compte
   ○ Ca, c'est de la productivité !
Play! ne se bat pas contre le web
● Des URL à ralonge avec des paramètres techniques ?
             C'est pas du web, ça !




● Play! utilise HTTP comme protocole, avec sa
   semantique
   ○ il ne cherche pas à faire son meta-protocole au dessus
Le web a évolué




● On est au bord d'une nouvelle évolution :
    ○ Les requêtes asynchrones en temps réel
    ○ Des énormes flux de données
    ○ Les BDD non relationnelles
●   Les frameworks classiques ont du mal à s'adapter
Les limites des frameworks
classiques

● Chaque utilisateur connecté consomme des
  ressources
  ○ Mémoire, threads...


● Modèles basés sur l'attente active
  ○ Synchronisme entre requête et réponse
  ○ On bloque un thread côté serveur

● Les I/O sont bloquantes
Play! utilise un modèle réactif

● Inversion de contrôle
  ○ On agit que lorsqu'on a quelque chose à faire


● Sans perte de contrôle
  ○ Mais on est capable de garder le contrôle

● Iteratee/Enumerator IO
Play! Framework




 Voici une petite démo

Contenu connexe

PPTX
Cours VB 2012 seance 1
PDF
Cours JavaScript
PPTX
Nouveautés de java 8
PPTX
Présentation JavaScript
PDF
Techday Arrow Group: Java 8
PDF
Introduction à scala
PPTX
Nouveautés JavaScript dans le monde Microsoft
Cours VB 2012 seance 1
Cours JavaScript
Nouveautés de java 8
Présentation JavaScript
Techday Arrow Group: Java 8
Introduction à scala
Nouveautés JavaScript dans le monde Microsoft

Tendances (20)

PPTX
Vbisigk
PPTX
TypeScript for dummies
PPTX
Environnement de développement de bases de données
PPTX
JAVA8, créer votre future
PDF
Javascript pour les Développeurs WEB
PPTX
Développement de plug in sous eclipse
PPTX
Présentation Javascript à l'ESI (Alger)
PPTX
Visual studio
PPTX
Présentation de ECMAScript 6
PPTX
Tour d’horizon de scala
PPT
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
PDF
Présentation (brève) de scala
PPTX
mis
PPTX
Javascript un langage supérieur
PPTX
Rouabhi algiers meetup
PDF
OSIS 2017 - Scala REX dans Rudder
PDF
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
PPTX
The Future of Javascript
PPTX
Environnement de développement de bases de données
PDF
La programmation fonctionnelle en javascript / PF
Vbisigk
TypeScript for dummies
Environnement de développement de bases de données
JAVA8, créer votre future
Javascript pour les Développeurs WEB
Développement de plug in sous eclipse
Présentation Javascript à l'ESI (Alger)
Visual studio
Présentation de ECMAScript 6
Tour d’horizon de scala
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
Présentation (brève) de scala
mis
Javascript un langage supérieur
Rouabhi algiers meetup
OSIS 2017 - Scala REX dans Rudder
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
The Future of Javascript
Environnement de développement de bases de données
La programmation fonctionnelle en javascript / PF
Publicité

En vedette (20)

PDF
Tp switch
PDF
Play framework - Human Talks Grenoble - 12.02.2013
PDF
Web application development using Play Framework (with Java)
PPTX
Play! Framework for JavaEE Developers
PDF
Exercices shell
PDF
Choisir scala en entreprise, est ce bien raisonnable ?
PDF
Using Play Framework 2 in production
PDF
Open Source Software and GitHub
PDF
Serveur web sur lindux debian
PPTX
Why Play Framework is fast
PDF
Play Framework: async I/O with Java and Scala
PPTX
Play Framework
PDF
Formation Play! framework
PPS
Cataratas
PPT
Webquest
PDF
Seguridad y redes
PPTX
Xxxi Aniversario A
PDF
Redes Sociales en la EINA
PPT
Le livre numérique (4) : ergonomie et fabrication
PDF
EBE09, la presentación que no usé
Tp switch
Play framework - Human Talks Grenoble - 12.02.2013
Web application development using Play Framework (with Java)
Play! Framework for JavaEE Developers
Exercices shell
Choisir scala en entreprise, est ce bien raisonnable ?
Using Play Framework 2 in production
Open Source Software and GitHub
Serveur web sur lindux debian
Why Play Framework is fast
Play Framework: async I/O with Java and Scala
Play Framework
Formation Play! framework
Cataratas
Webquest
Seguridad y redes
Xxxi Aniversario A
Redes Sociales en la EINA
Le livre numérique (4) : ergonomie et fabrication
EBE09, la presentación que no usé
Publicité

Similaire à Enib cours c.a.i. web - séance #5 : scala play! framework (20)

PDF
Université des langages scala
PPTX
Introduction Kotlin
PDF
Introduction à Groovy - OpenSource eXchange 2008
PDF
Enib cours c.a.i. web - séance #5 - langages alternatives dans la jvm
PPT
Présentation Groovy
PPT
Présentation Groovy
PDF
Introduction à Play Framework 2
PDF
ENIB 2013-2014 - CAI Web #3: Groovy
PDF
Mix it 2011 - Clojure
PPT
informatique présentation cour JAVA_2016.ppt
PPTX
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
PDF
CHOUGDALI_Cours_Java.pdfjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PDF
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
PDF
Enib cours c.a.i. web - séance #5 - groovy
PPT
Java programmation OO, héritage et polymorphisme
PPTX
Formation python micro club.net
PDF
RMLL 2013: Projet rudder, retour sur 4 ans de Scala
PPT
Java PROGRAMATION CLASSE INFORMATIQUE.ppt
PPTX
Introduction a Java
PPTX
Erlang
Université des langages scala
Introduction Kotlin
Introduction à Groovy - OpenSource eXchange 2008
Enib cours c.a.i. web - séance #5 - langages alternatives dans la jvm
Présentation Groovy
Présentation Groovy
Introduction à Play Framework 2
ENIB 2013-2014 - CAI Web #3: Groovy
Mix it 2011 - Clojure
informatique présentation cour JAVA_2016.ppt
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
CHOUGDALI_Cours_Java.pdfjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
Enib cours c.a.i. web - séance #5 - groovy
Java programmation OO, héritage et polymorphisme
Formation python micro club.net
RMLL 2013: Projet rudder, retour sur 4 ans de Scala
Java PROGRAMATION CLASSE INFORMATIQUE.ppt
Introduction a Java
Erlang

Plus de Horacio Gonzalez (20)

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

Enib cours c.a.i. web - séance #5 : scala play! framework

  • 1. Conception d'Applications Interactives : Applications Web et JEE Séance #5 Scala / Play! Framework
  • 3. Langages alternatives pour la JVM Java ≠ JVM ● Java : Langage qui compile vers du bytecode ● JVM : Machine virtuelle qui exécute du bytecode
  • 4. La JVM en tant que plate-forme ● Build once, run everywhere ○ Des implémentations de JVM pour la plupart du hardware et OS ○ Bytecode format pivot indépendant de la plate-forme ● Tendance à s'affranchir de l'OS ○ Côté client : navigateur comme plate-forme ○ Côté serveur : JVM comme plate-forme
  • 5. Pourquoi des nouveaux langages If all you have is a hammer, everything looks like a nail Java est un très bon langage généraliste, mais pas la solution ultime ● Scripting ? ● Programmation fonctionnelle ? ● Simplification et réduction du boilerplate ?
  • 6. Pourquoi des nouveaux langages sur la JVM ● Le target est le bytecode ○ Pas besoin d'implémenter la compilation vers le format natif de chaque OS ● Profiter de l'écosystème Java ○ Bibliothèques, serveurs, outils... ○ Courbe d'adoption moins ardue ● Support pour langages à typage dynamique ○ JSR 292, invokedynamic ○ Intégrée à la JVM depuis Java 1.7
  • 7. Quels sont ces langages ? ● Des langages nouveaux : ○ Clojure, Groovy, Scala, Ceylon, Kotlin... ● Des implémentations d'autres langages ○ JRuby (Ruby), Jython (Python), Rhino (JS), Elastic COBOL (Cobol), JGNAT (Ada), Luaj (Lua)...
  • 8. Jython Interprète Python écrit en Java, créé en 1997 ● Compilation de code Python en bytecode ● Héritage de classes Java par des classes Python ● Scripting de code Python dans un programme Java ● Utilisation d'objets Java dans du code Python Très utilisé pour prototypage, scripting et exploration des classes Java http://www.jython.org/
  • 9. JRuby Interprète Ruby écrit en Java, créé en 2001 ● Equivalente de Jython pout Ruby ● Capable de faire tourner Rails ● Plus rapide que l'implémentation de référence ○ Option JIT http://www.jruby.org/
  • 10. 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 ● 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/
  • 11. Ceylon Nouveau langage pour la JVM par RedHat ● "Java tel qu'ils serait si il avait été développé aujourd'hui" ● Typage statique ○ Types union et intersection ● Syntaxe régulière ○ Sucre syntactique ajouté ● Modulaire ○ Dépôt Ceylon Herd http://www.ceylon-lang.org/
  • 12. Scala Langage de programmation multi-paradigme ○ Programmations orientée objet et fonctionnelle ● Typage statique, syntaxe concise ● Compilé vers bytecode ● Intéropérabilité avec le code Java http://www.scala-lang.org/
  • 13. Le développeur multi-lingue ● Environnement JVM en mouvement continu ○ Nouveaux langages ○ Nouveaux frameworks ○ Nouveaux outils ● Ne pas se tenir à jour, ne pas apprendre = stagner, régresser. ○ Un nouveau langage par an ○ Un nouveau framework tous les 3 mois
  • 15. Scala Langage de programmation multi-paradigme ○ Programmations orientée objet et fonctionnelle ● Typage statique, syntaxe concise ● Compilé vers bytecode ● Intéropérabilité avec le code Java http://www.scala-lang.org/
  • 16. La console REPL REPL : Read Event Print Loop ● Console intéractive pour l'interprétation de Scala horacio@horacio-laptop:$ scala Welcome to Scala version 2.10.0-RC3 (Java HotSpot(TM) Server VM, Java 1.6.0_31). Type in expressions to have them evaluated. Type :help for more information. scala> val revolution : Int = 1789 revolution: Int = 1789 scala>
  • 17. val et var ● var : variables (mutables) ● val : valeurs (constantes, inmutables) scala> val revolution : Int = 1789 revolution: Int = 1789 scala> revolution = 1917 <console>:8: error: reassignment to val revolution = 1917 ^ scala> var variable : String = "Ma variable" variable: String = Ma variable scala> variable = "Notre variable" variable: String = Notre variable scala>
  • 18. Classes ● Pas besoin de déclarer les attributs privés et les getters et setters ○ Le constructeur suffit ● Constructeur avec des valeurs par défaut scala> case class Employee( name:String="guest", age: Int=30, company:String = "DevCode" ) defined class Employee scala> val guest = Employee() guest: Employee = Employee(guest,30,DevCode) scala> val guestAge = guest.age guestAge: Int = 30 scala>
  • 19. Classes ● Définition explicite des paramètres lors des appels aux méthodes ● Méthode copy pour créer des copies des objets scala> case class Employee( name:String="guest", age: Int=30, company:String = "DevCode" ) defined class Employee scala> val luke = Employee("Luke", company="LucasArt") luke: Employee = Employee(Luke,30,LucasArt) scala> val yoda = luke.copy("Yoda", age=800) yoda: Employee = Employee(Yoda,800,LucasArt) scala>
  • 20. Collections ● Les listes et les maps sont des types natifs ○ Immuables par défaut ● Simplification des génériques Java ○ Inférence des types scala> val numbers = List(1,2,3) numbers: List[Int] = List(1, 2, 3) scala> for (n <- numbers) println("Number "+n) Number 1 Number 2 Number 3 scala>
  • 21. Collections ● Le for est "très Java" ○ Façon Scala : Utiliser des fonctions functionName { input => body } scala> val numbers = List(1,2,3) numbers: List[Int] = List(1, 2, 3) scala> numbers.foreach { n:Int => // Enter to continue on the next line | println("Number "+n) | } Number 1 Number 2 Number 3 scala>
  • 22. Collections ● D'autres exemples des fonctions sur des listes scala> val reversedList = numbers.reverse reversedList: List[Int] = List(3, 2, 1) scala> val numbersLessThan3 = numbers.filter { n => n < 3 } numbersLessThan3: List[Int] = List(1, 2) scala> val oddNumbers = numbers.filterNot { n => n % 2 == 0 } oddNumbers: List[Int] = List(1, 3) scala> val higherNumbers = numbers.map { n => n + 10 } higherNumbers: List[Int] = List(11, 12, 13) scala> val sumOfNumbers = numbers.foldLeft(0) { (total,element) => | total + element | } sumOfNumbers: Int = 6 scala> val sumOfNumbers = numbers.sum sumOfNumbers: Int = 6 scala> val higherNumbers = numbers.map(_+10) higherNumbers: List[Int] = List(11, 12, 13) scala>
  • 23. Comment apprendre Scala ? Je ne vais pas passer une heure à vos passer des slides ● Méthode peu éfficace Tentons quelque chose de nouveau ● Approche pratique Essayons les Scala Koans ! Scala Koans ? Kesaco ?
  • 24. 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 !
  • 25. Scala Koans : Learn Scala with the Koans http://www.scalakoans.org/
  • 26. Scala Koans 1. Telecharger le .zip sur http://www.scalakoans.org/ 2. Extraire tout et exécuter le fichier ./sbt 3. Compiler les tests avec : > test:compile 4. Exécuter tous les koans avec : > ~test-only org.functionalkoans.forscala.Koans ou Exécuter un koan en concret : > ~test-only org.functionalkoans.forscala.AboutAsserts 5. Ouvrir le fichier source du koan, l'éditer et voir si ça passe
  • 27. C'est l'heure des Scala Koans !
  • 28. Play! Framework Play 2.0, a Web framework for a new era
  • 29. Le projet Play! Play! est un framework pour ● faire du développement web ● avec une haute productivité ● avec l'état de l'art des technologies web ● sur la JVM
  • 30. Play! : productivité et plaisir ● Conçu par des développeurs web pour des développeurs web ● Gestion simple, flexible et puissante du protocole HTTP ○ Framework web -> HTTP au centre ○ Stateless, request-response ● Facilité de démarrage ○ Courbe d'apprentissage douce ● Rapidité et simplicité : change le code et recharge la page ! ● Framework complet, full-stack
  • 31. Play! : pas un jouet ● Modèle de programmation HTTP asynchrone ● Architecture scalable de haute performance ● Modèle reactive, non bloquant ● Typage fort
  • 32. Suivons le web ! When a web framework starts an architecture fight with the web, the framework loses. ● PHP et Ruby on Rails l'ont bien compris ○ Si on fait du web, on s'adapte au web ! ● Exemples : session, bouton back... ● Play! a une architecture stateless basé sur HTTP
  • 33. Modifiez, rechargez, c'est fait ! ● Devoir redémarrer le serveur après une modif ? ● Redéployer car on a changé un fichier ? ● A nouveau, regardons PHP ou Ruby on Rails ○ Si on fait du web, on s'adapte au web ! ● Avec Play! il suffit de recharger la page et la modif est prise en compte ○ Ca, c'est de la productivité !
  • 34. Play! ne se bat pas contre le web ● Des URL à ralonge avec des paramètres techniques ? C'est pas du web, ça ! ● Play! utilise HTTP comme protocole, avec sa semantique ○ il ne cherche pas à faire son meta-protocole au dessus
  • 35. Le web a évolué ● On est au bord d'une nouvelle évolution : ○ Les requêtes asynchrones en temps réel ○ Des énormes flux de données ○ Les BDD non relationnelles ● Les frameworks classiques ont du mal à s'adapter
  • 36. Les limites des frameworks classiques ● Chaque utilisateur connecté consomme des ressources ○ Mémoire, threads... ● Modèles basés sur l'attente active ○ Synchronisme entre requête et réponse ○ On bloque un thread côté serveur ● Les I/O sont bloquantes
  • 37. Play! utilise un modèle réactif ● Inversion de contrôle ○ On agit que lorsqu'on a quelque chose à faire ● Sans perte de contrôle ○ Mais on est capable de garder le contrôle ● Iteratee/Enumerator IO
  • 38. Play! Framework Voici une petite démo