Introduction à scala

42
Introduction à Scala Introduction à Scala par Ludwine et Florent

description

Cette présentation aura pour objectif d’introduire le langage de programmation Scala. Ce dernier bénéficie depuis plusieurs mois d’un véritable engouement qui se reflète au regard de la communauté française croissante. Pour cela Ludwine Probst et Florent Lagrede reviendront donc sur les notions fondamentales, illustrées d’exemples sur des problèmes récurrents de programmation, afin de dégager les spécificités de ce langage et certains de ses atouts. Aucune connaissance de Scala n’est donc nécessaire, seulement l’envie de découvrir un nouveau langage.

Transcript of Introduction à scala

Page 1: Introduction à scala

Introduction à Scala

Introduction à Scala par Ludwine et Florent

Page 2: Introduction à scala

Florent Lagrède développeur Java chez voyages-sncf.com

@flowlag

Ludwine Probst développeuse Java chez voyages-sncf.com

DuchessFr et GDG member

@nivdul

Page 3: Introduction à scala

Plan de la soirée

Introduction à Scala...

Partie 1

Généralités

Partie 2

Présentation des concepts

Partie 3

Démonstration avec une appli

Page 4: Introduction à scala

Histoire

Nom : scala vient de "scalable langage"

Auteur: Martin Odersky

Création : 2003

Lieu : EPFL (Lausanne)

But : être élégant et concis, mais pas que...

Page 5: Introduction à scala

Dans la communauté

PSUG (Paris Scala User Group)

• soirée chaque mois avec 60-100 membres

• sujets techniques, retours d'expériences, présentations de projets open-source...

Page 6: Introduction à scala

Scala en quelques mots

• langage mélangeant programmation orientée-objet et fonctionnelle

• tourne sur la JVM

• compatible avec les librairies Java

• statiquement typé

• soucis de la concurrence (immutable)

• inférence de type

• tout est objet (hiérarchie des classes)

• et ça se veut être concis

Page 7: Introduction à scala

// en Java class Album {

private int id;

private String name;

public Album(int id, String name) {

this.id = id;

this.name = name;

}

}

// en Scala class Album(id: Int, name: String)

Page 8: Introduction à scala

La programmation fonctionnelle

• exprime les fonctions au sens mathématique

• exclut le changement d'état lors de l'évaluation de fonctions

• élimine les effets de bords

• s'oppose à la programmation impérative

Page 9: Introduction à scala

Scala dans le milieu professionnel

Page 10: Introduction à scala

Quelques outils pour coder en Scala

• REPL (Read-Evaluate-Print Loop)

• sbt (simple-build-tool)

• éditeur de texte (sublimtext,notepad++...)

• Eclipse/IntelliJ http://typesafe.com/stack/downloads/scala-ide

• scaladoc http://www.scala-lang.org/

Page 11: Introduction à scala

• création d'un projet scala via Eclipse

• utilisation du worksheet

• petits tests en scala via le REPL

• compilation/exécution (tests) d'un projet via sbt

Démo

Page 12: Introduction à scala

Objectifs de la soirée

• présenter les bases, du moins certaines o mutable/immutable, trait, case class, sealed,

List, high order function, pattern matching...

o voir la syntaxe

• regarder de près une appli en Scala

Page 13: Introduction à scala

Présentation de concepts clés

Page 14: Introduction à scala

Introduction à Scala par Ludwine et Florent

Page 15: Introduction à scala

Les classes

Définition :

• définition standard

• pas de mot clé public

• un fichier source peut contenir plusieurs classes et elles sont toutes par défaut public

Page 16: Introduction à scala

Les case classes

Définition : • objet non modifiable après instanciation

• méthodes equals, toString, hashcode... implicitées

• constructeur implicité

• pas de new

• peut se décomposer avec la notion de Pattern Matching

Page 17: Introduction à scala

case class Album(id:Int, name:String)

Ces 3 écritures suivantes sont équivalentes : val album = new Album(3, "Paris")

val album = Album(3, "Paris")

val album = Album.apply(3, "Paris")

album.name = qu'obtient-on???

Exemples

Page 18: Introduction à scala

Les getters/setters (1/2)

//Java public class Image() {

private String name;

public String getName() {...}

public void setName(String name) {...}

}

//Scala class Image(var name:String)

Page 19: Introduction à scala

Les getters/setters (2/2)

En scala,

• les getters/setters sont générés pour la JVM

• on peut les surcharger

• ils sont privés si l'attribut est privé

• il est possible d'empêcher leur génération avec la syntaxe suivante

private[this] name:String

Page 20: Introduction à scala

Val & Var

Définition : • val

o déclaration d'attribut : variable non modifiable

o déclaration de paramètre de classe : getter implicite

• var

o déclaration d'attribut : variable modifiable

o déclaration de paramètre de classe : getter et setter implicite

Page 21: Introduction à scala

class Image(var name: String)

val imageA = new Image("MyImageA")

val imageB = new Image("MyImageB")

Si on écrit ça : imageA = imageB

Que se passe-t-il ?

Exemples

Page 22: Introduction à scala

Les traits

Définition : c'est comme une class sauf qu'il y a le mot-clé trait. C'est l'équivalent de l'interface en Java sauf qu'on peut y implémenter des méthodes.

trait ImageInfos {

val image:Image

def ImageInfos:String = image.name

}

Page 23: Introduction à scala

Possibilité d'un héritage multiple : trait ComputeAverageScore

trait AnotherOne

class Image extends ImageInfos with

ComputeAverageScore with AnotherOne {

val name = "Paris"

}

Pas de paramètres de 'classe' : trait ImageInfos(image: Image) // ne

compile pas

Exemples

Page 24: Introduction à scala

Les Collections

• Utilise le trait Iterable

• Immutable par défaut

• Fonctions d'ordre supérieure

o map

o filter

o foreach

Exemples de collection : List, Map, Set, Vector...

Page 25: Introduction à scala

Les Lists

Définition :

La classe List repose sur les deux case classes :

• Nil représente une liste vide

• :: (se prononce “cons”),

où x::xs représente la liste dont le premier élément est x, suivi du reste des éléments xs.

Page 26: Introduction à scala

Les Lists

Les 3 fonctions clé à retenir :

• head : renvoie le premier élément d’une liste

• tail : renvoie la liste excepté son premier

élément

• isEmpty : renvoie true si la liste est vide, false sinon

Page 27: Introduction à scala

Quelques exemples...

val scores = List(1,2,3)val names =

List(“a”,“b”, “b”)

val list =

List(List(1,0),List(1,1),List(0,1))

val empty: List[Nothing] = List( )

val scores = 1 :: 2 :: 3 :: Nil

val names = “a” :: (“b” :: (“b” :: Nil))

Page 28: Introduction à scala

Fonction partielle

Définition : • une fonction partielle qui s'exécute ou non en

fonction de ses paramètres

• elle doit obligatoirement définir 2 méthodes

o isDefinedAt (condition d'exécution)

o Apply (code exécuté)

Page 29: Introduction à scala

Fonction partiellement appliquée

Définition : • fonction à laquelle on n'applique pas tous les

arguments, créant ainsi une autre fonction.

• peut appliquer aucun ou tous les arguments d'une fonction

Page 30: Introduction à scala

Les fonctions de plus haut niveau

• Expression lambda

o x: Int => x + 1 est équivalent à

f(x: Int) = {x + 1}

• Peut prendre une autre fonction en paramètre

• Peut être retournée en tant que résultat

• Peut être déclarée à l'intérieur d'une autre fonction

• Peut-être stockée dans une variable

Exemples : map, filter, flatten, flatmap...

Page 31: Introduction à scala

Les options (1/2)

Définition :

Le type Option désigne une valeur optionnelle et c'est une Collection.

Page 32: Introduction à scala

L'intérêt des Options ?

Imaginons que l’on veuille trouver une personne dans une BDD...

def findImage(id: Int): Option[Image]

Les options (2/2)

Page 33: Introduction à scala

Pattern Matching

Définition : Le pattern matching peut être assimilé au switch case d'autres langages comme Java.

e match {case p1 => e1 ... case pn => en }

pi représente les patterns et ei la valeur renvoyée dans le cas où le pattern pi match e.

Erreur MatchError renvoyée si besoin.

Page 34: Introduction à scala

def applyEvent(event: Event) = event match

{

case AddImage(image) => add(image)

case RemoveImage(withId) =>

remove(withId)

case SearchImages(term) => search(term)

case _ => this.image

}

C'est quoi ce "_" ?

Exemples (1/4)

Page 35: Introduction à scala

Avec les options : case SortImages(criteria) => criteria match {

case Some(criteria) => sort(criteria)

case None => this.images

}

Exemples (2/4)

Page 36: Introduction à scala

On peut faire du Pattern Matching sur un peu tout ! def describe(x: Any) = x match {

case 5 => "five"

case true => "truth"

case "hello" => "hi!"

case Nil => "the empty list"

case _ => "something else"

}

Exemples (3/4)

Page 37: Introduction à scala

Avec les listes : def eval(list:List[Int]) = list match {

case Nil => println("vide")

case x::Nil => println("un seul élément")

case x::xs => println("au moins 2 élemts")

}

Exemples (4/4)

Page 38: Introduction à scala

Sealed Trait

Définition : le mot-clé sealed devant un trait :

ça facilite le Pattern Matching !

Exemple : sealed trait Criteria

case class ByName extends Criteria

case class ByDate extends Criteria

Page 39: Introduction à scala

Présentation de l'application

• moteur de recherche d'image

• le modèle : Image, Album

• technos : scala 2.10

Page 40: Introduction à scala

Quelques liens

Programming in Scala

Scala in Depth

Scala for the impatient

Pour apprendre scala par la pratique :

https://www.coursera.org/

Page 41: Introduction à scala
Page 42: Introduction à scala

Merci !