Autrefois cantonnée aux laboratoires ou aux esprits les plus fous, la programmation fonctionnelle s'invite depuis quelques années dans les applications web et d'entreprises au travers de langages comme Scala, F# mais aussi JavaScript, au point de devenir un des sujets chaud du moment.
Mais les habitudes ont la vie dure, et sortir de sa zone de confort de développeur impératif maître de Java, Python ou PHP n'est pas chose facile, les bénéfices n'étant pas forcément évidents.
C'est toutefois le chemin que je vous propose d'entreprendre, au travers d'une introduction pragmatique aux concepts et principes portés par la programmation fonctionnelle.
Cette présentation a été effectuée dans le cadre du meetup Link Value Tech du 10 janvier 2017.
2. Ce qui compte
C’est les valeurs !
Introduction à la programmation
fonctionnelle
3. Linkvalue | whoami
Moi ?
@raphaelbacconni
2
Lead Dev Backend @LinkValue
• Développeur Web
• PHP
• Java
• Scala, JavaScript
• … débute la programmation fonctionnelle avec Scala en janvier
2015
• … apprécie la programmation fonctionnelle depuis ± juillet
2015
4. Why FP
matters ?
Vous avez dit fonctionnel ?
Des programmes comme suite
d’applications
Sortir du labo
SOMMAIRE
Linkvalue | sommaire
3
Functions
Everywhere
Function
Closure
Memoïsation
Function Composition
AD T
A l g e b r a i c D a t a T y p e s
C a l l m e M a y b e
T r a i t e r l e s e r r e u r s
5. Linkvalue | Why FP matters ?
Vous avez dit “fonctionnelle” ?
4
Qu’est-ce que la programmation fonctionnelle ?
• Un nouveau langage ?
• Une nouvelle architecture ?
• Une manière de rédiger ses tests ?
• Un nouveau framework JavaScript ?
7. Linkvalue | Why FP matters ?
Vous avez dit “fonctionnelle” ?
6
Qu’est-ce que la programmation fonctionnelle ?
• Un nouveau langage ?
• Non ! Mais les langages exposent des apis dédiées au fonctionnel
• Une nouvelle architecture ?
• Non ! Mais de nombreux design patterns sont transposables
• Oui… de nouvelles architectures en découlent
• Une manière de rédiger ses tests ?
• Non ! Mais permet d’écrire du code facilement testable
• Un nouveau framework JavaScript ?
• Non ! Mais il existe de nombreux frameworks FP
• … et ce n’est pas non plus (seulement) faire des filter / map / reduce !
8. Linkvalue | Why FP matters ?
Des programmes comme suites d’applications
7
Penser mathématiques
• Toute expression produit une valeur
• Basé sur le lambda calcul (Alonzo Church, 1930’s) : tout est fonction
• Influence de la théorie des catégories
• Parfois présentée comme opposée à la POO
• …
9. Linkvalue | Why FP matters ?
Des programmes comme suites d’applications
8
Application informatique
• Ne plus raisonner en fonction de changement d’état
• Appliquer une fonction sur des inputs produit toujours 1 même résultat
• Principe de substitution et transparence référentielle
• Fonction « pure »
• Données immuables
• Lisp (1958), Scheme (1975), Erlang (1987), Haskell (1990)
• ML (1973, 1983)
16. W h y F P m a t t e r s ?
V o u s a v e z d i t f o n c t i o n n e l ?
D e s p r o g r a m m e s c o m m e
s u i t e d ’ a p p l i c a t i o n s
S o r t i r d u l a b o
SOMMAIRE
Linkvalue | sommaire
15
Functions
Everywhere
Function
Closure
Memoïsation
Function Composition
AD T
A l g e b r a i c D a t a T y p e s
C a l l m e M a y b e
T r a i t e r l e s e r r e u r s
21. Linkvalue | Functions Everywhere
Function as First Class citizen
20
Multiparadigme – Approche fonctionnelle
22. Linkvalue | Functions Everywhere
Function as First Class citizen
21
Multiparadigme – Approche fonctionnelle
23. Linkvalue | Functions Everywhere
TP : Filtrer les utilisateurs en fonction de la conf
22
24. Linkvalue | Functions Everywhere
TP : Filtrer les utilisateurs en fonction de la conf
23
25. Linkvalue | Functions Everywhere
Closure
24
Principes
• Fonction qui peut accéder aux variables du scope
• Permet d’embarquer un contexte
• Initialiser des valeurs depuis une fonction constructeur
31. Linkvalue | Functions Everywhere
Function composition
30
Principes
• Créer une fonction qui appliquera successivement n fonctions
• Permet d’appliquer des transformations indépendamment du contexte
• Currying & Partiall application function
• Allège l’écriture de code
32. Linkvalue | Functions Everywhere
TP : composer nos fonctions d’affichage
31
Il nous faut :
• Enrichir les fonctions de sélection d’une donnée
• Préparer les appels de fonctions avec les paramètres à disposition
• Transformer légèrement la fonction d’affichage
33. Linkvalue | Functions Everywhere
TP : composer nos fonctions d’affichage
32
Il nous faut :
• Enrichir les fonctions de sélection d’une donnée
34. Linkvalue | Functions Everywhere
TP : composer nos fonctions d’affichage
33
Il nous faut :
• Enrichir les fonctions de sélection d’une donnée
• Préparer les appels de fonctions avec les paramètres à disposition
35. Linkvalue | Functions Everywhere
TP : composer nos fonctions d’affichage
34
Il nous faut :
• Enrichir les fonctions de sélection d’une donnée
• Préparer les appels de fonctions avec les paramètres à disposition
• Transformer légèrement la fonction d’affichage
36. W h y F P m a t t e r s ?
V o u s a v e z d i t f o n c t i o n n e l ?
D e s p r o g r a m m e s c o m m e
s u i t e d ’ a p p l i c a t i o n s
S o r t i r d u l a b o
SOMMAIRE
Linkvalue | sommaire
35
F u n c t i o n s
E v e r yw h e r e
F u n c t i o n
C l o s u r e
M e m o ï s a t i o n
F u n c t i o n C o m p o s i t i o n
ADT
Algebraic Data Types
Call me Maybe
Traiter les erreurs
41. Linkvalue | Algebraic Data Types
Gérer les erreurs
40
Call me maybe : le type Option
• Conteneur qui contient éventuellement une valeur
• None : vide
• Some : contient une valeur
• Permet d’appliquer des transformations sans avoir à gérer l’absence de
résultat
• Évite les NullPointerException
• Permet de définir une application par défaut en cas d’absence de résultat
• Aussi appelé Maybe …
47. Linkvalue | Algebraic Data Types
Gérer les erreurs
46
La liberté c’est de choisir, et choisir c’est renoncer : Le type Either
48. Linkvalue | Algebraic Data Types
Traiter les erreurs : Either Type
47
Catégoriser les retours avec Either
• Conteneur qui contient distinctement la valeurs calculée par le traitement
ou une valeur alternative si le traitement échoue
• Left : Contiendra une information sur l’erreur si une erreur survient
• Right : Contiendra la valeur telle qu’on l’attend
• Dans le meilleur des cas : parcours semblable au parcours d’une Option
• On récupère l’erreur sous forme d’une valeur
50. Linkvalue | Pour conclure…
Pour conclure
49
On aime !
• Repenser la manière dont on crée des programmes
• Focus sur les traitements et les transformations
• Penser valeur
• Renvoyer les effets de bord en périphérie du cœur de l’application
Does FP rules the world ?
• On doit faire avec les effets de bord: le fonctionnel pur est compliqué dans
une application d’entreprise
• Coût du ticket d’entrée peut être élevé
• Haut niveau d’abstraction : certains traitements peuvent être plus
performants en mode impératif
• Langages multiparadigmes offrent le choix
• Possible d’appliquer les concepts de FP dans des langages impératifs
52. Linkvalue | Références
Références
51
Learn
• https://twitter.github.io/scala_school/
• http://danielwestheide.com/scala/neophytes.html
• https://www.scala-exercises.org/
• https://www.coursera.org/specializations/scala
Articles
• http://www.vasinov.com/blog/16-months-of-functional-programming/
• https://medium.com/@sinisalouc/demystifying-the-monad-in-scala-
cc716bb6f534
• https://www.infoq.com/articles/no-more-mvc-frameworks
Books
• Functional Programming in Scala, Paul Chiusano and Rúnar Bjarnason,
Manning 2014
• Functional Programming Patterns in Scala and Clojure - Write Lean
Programs for the JVM, Michael Bevilacqua-Linn, The Pragmatic Bookshelf
2013
• Functional Programming in JavaScript, Dan Mantyla, Packt Publishing 2015
• Mostly adequate Guide to Functional Programming -
https://github.com/MostlyAdequate/mostly-adequate-guide
53. www.linkvalue.fr
NOUS CONTACTER
MAIL TELEPHONEADRESSE
Raphaël Bacconnier| Partner Tech
raphael.bacconnier@link-value.fr
06 61 32 19 97
01 45 22 30 27
5 rue de la ruche, 69003, Lyon
Linkvalue | Nom de la partie
52
108 rue des Dames, 75017, Paris