Introduction à Scala
Scala = “scalable language” Compatible avec Java dans les 2 sens : les 2 produisent du byte code qui est interprété par la JVM
Outils utilisés
- Visual Studio Code (IDE) avec l’extension Metals (Scala)
- SBT
- Scalastyle : plugin SBT, encourage certaines bonnes pratiques
- JUnit : systématiser les tests des programmes
- Scribble : librairie graphique
⇒ utiliser les mots expression et évaluer
Programmes, calculs et effets de bord
Une expression = quelque chose que l’on peut évaluer
Exemple
Dans une calculatrice
2+3
est une expression
Dans une calculatrice : pas d’effet de bord ⇒ rien d’autre que le fait d’évaluer l’expression ⇒ expression pure qui ne dépend que des paramètres fournis.
Donc on essaye le + possible de travailler avec des expressions pures
Quand l’expression n’est pas pure → il existe des effets de bords : modification de la mémoire par exemple.
Important
Savoir distinguer les calculs purs et les calculs avec effets de bord
Essayer de cantonner les effets de bords et les interactions avec l’utilisateur à quelques fonctions de haut niveau
⇒ majorité du programme constitué de fonctions et d’expressions pures ⇒ on peut les analyser/tester + facilement
Toute expression en java a un type. En Scala → pas obligatoire d’indiquer les types (mais il est préférable d’indiquer le type)
Un programme Scala est une (suite d’expression(s) qui décrit le calcul. Certaines expressions ont un effet de bord.
Exécuter un programme Scala = calculer la valeur de l’expression, et réaliser les effets de bord qu’elle contient.
Syntaxe des éléments de bases de Scala
Types disponibles de base en Scala :
- Types numériques :
Char
,Int
,Long
,Float
,Double
- Types non numériques :
Boolean
,Unit
(équivalent du typevoid
en Java donc qui ne contient rien : une seule valeur possible :()
) AnyVal
: type de toutes les valeurs non-objetString
: chaîne de caractèresAnyRef
: toutes les valeurs objetAny
: toutes les valeurs possibles en ScalaList
,Array
,Map
,Set
: les collections Scala
Disponibles dans Scribble :
Image
: représente des imagesColor
couleurs dans Scribble
Un programme Scala est de la forme
object
est l’équivalent du main
- Expression pure :
- Expression impure : calcule une valeur et a un effet de bord (interaction avec l’environnement)
Une séquence d’expressions est aussi une expression. On utilise le point-virgule pour séparer les expressions. Le point-virgule est optionnel si on passe à la ligne.
La valeur d’une séquence est la valeur de la dernière expression. Toutes les valeurs des expressions intermédiaires sont ”oubliées”. Seuls leurs effets de bord sont cumulés.
Exemple : l’expression println("Hey") ; 3+4 ; "Blah" ; println("Yo")
- calcule une valeur de type
Unit
, celle retournée parprintln("Yo")
- et a 2 effets de bord : afficher les messages “Hey” puis “Yo”
Les deux valeurs intermédiaires 7 et “Blah” sont « oubliées ». Elles ne produisent pas d’effet de bord.
Variables mutables et immutables
2 sortes de variables en Scala :
- modifiables = mutables (
var
)
- non modifiables : immutabes (
val
)
Utilisation des variables
On préfère utiliser des
val
(donc des variables immutables qui minimisent les effets de bords) plutôt que desvar
Définition de fonction
Syntaxe de la déclaration de fonction :
maFonction
: nom de la fonctionx1: Type1
sont les paramètres formels de la fonction (la portée dex1
est locale donc uniquement dans la fonction)TypeR
: type de la valeur renvoyéeexpr
: corps de la fonction
La fonction est évaluée à la dernière expression évaluée dans le corps de la fonction
Le mot return
est rarement utilisé en Scala
Spécification : vers un code sans erreurs
Spécification d’une fonction = dit ce qu’elle fait et ce qu’elle renvoie
Approche méthodique de conception logicielle :
- Spécification
- Concevoir l’algo
- Programmation
En Scala, la spécification est répartie entre :
- la signature de la fonction
- tout le reste : doc Scala (=Scaladoc), annotations en commentaires.
Bonne spécification (précise) quand on peut sans regarder le code :
- savoir ce que calcule la fonction
- connaître ses effets de bord observables
Booléns, conditionnelles, pattern-matching
Pour les expressions conditionnelles if
: similaire à Java, sauf que ce sont des expressions
Pattern-matching
= filtrage de motif en français ( avec le switch
de Java)
Syntaxe générale :
Inspecte la valeur de expr
, et si elle « correspond » à motifi
, s’évalue en la valeur de expri
.
Qu’est-ce qu’un motif ? Pour aujourd’hui :
- un littéral Scala numérique, booléen, chaînes de caractères
- ou un ”joker”
_
: le motif universel
Attention
Un motif n’est pas une expression Scala ! Un motif n’a pas de valeur, c’est une information symbolique
Exemples
Autre exemple où l’expression match a pour type
Boolean
: