Ce qui compte c'est les valeurs ! Introduction à la programmation fonctionnelle

Preview:

Citation preview

Committed to innovateLINKVALUE

Ce qui compteC’est les valeurs !

Introduction à la programmation fonctionnelle

3Linkvalue | whoami

Moi ?

@raphaelbacconni

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’applicationsSortir du labo

SOMMAIRE

Linkvalue | sommaire

Functions Everywhere

FunctionClosure

Memoïsation Function Composition

A D T

A l g e b r a i c D a t a Ty p e sC a l l m e M a y b e

Tr a i t e r l e s e r r e u r s

5Linkvalue | Why FP matters ?

Vous avez dit “fonctionnelle” ?

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 ?

6Linkvalue | Why FP matters ?

Vous avez dit “fonctionnelle” ?

7Linkvalue | Why FP matters ?

Vous avez dit “fonctionnelle” ?

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

!

8Linkvalue | Why FP matters ?

Des programmes comme suites d’applications

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

• …

9Linkvalue | Why FP matters ?

Des programmes comme suites d’applications

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)

10Linkvalue | Why FP matters ?

Sortir du laboratoire

11Linkvalue | Why FP matters ?

Sortir du laboratoire

Langages impératifs modernes exposent des API fonctionnelles

• Java 8

• C#

• PHP

• Python

• Swift

• Ruby

• …

12Linkvalue | Why FP matters ?

De nouveaux langages

Langages multiparadigmes

• Scala

• F#

• Rust

• JavaScript 2015

• Elixir

Fonctionnels (presque) purs

• Clojure

• ELM

13Linkvalue | Why FP matters ?

Quelles technos ?

Champs d’application

• Traitement de données : Spark, Apex

• Messages brokers : Apache Kafka, Rabbitmq

• Architectures asynchrones et message driven : Akka

• Data streaming : Apache Flink, Akka Stream, Rx*

• Serveur web : Playframework, Twitter Finatra, Nodejs

• Construction d’IHM : Reactjs, Temporal Logic of Actions

14Linkvalue | Why FP matters ?

Pour qui ?

Acteurs et domaines d’application

• Banque, assurances : Axa, April, …

• Réseaux sociaux : Twitter, LinkedIn, Facebook, WhatsApp, Instagram, …

• Streaming : Soundcloud, Spotify, Deezer

• Data storage : Dropbox

15Linkvalue | Why FP matters ?

16

W hy 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

Functions Everywhere

FunctionClosure

Memoïsation Function Composition

A D T

A l g e b r a i c D a t a Ty p e sC a l l m e M a y b e

Tr a i t e r l e s e r r e u r s

17Linkvalue | Functions Everywhere

Préambule : coder en scala

18Linkvalue | Functions Everywhere

TP : afficher une liste d’utilisateurs

19Linkvalue | Functions Everywhere

TP : afficher une liste d’utilisateursImpératif – Orienté Objet

20Linkvalue | Functions Everywhere

Function as First Class citizen

21Linkvalue | Functions Everywhere

Function as First Class citizen

Multiparadigme – Approche fonctionnelle

22Linkvalue | Functions Everywhere

Function as First Class citizen

Multiparadigme – Approche fonctionnelle

23Linkvalue | Functions Everywhere

TP : Filtrer les utilisateurs en fonction de la conf

24Linkvalue | Functions Everywhere

TP : Filtrer les utilisateurs en fonction de la conf

25Linkvalue | Functions Everywhere

Closure

Principes

• Fonction qui peut accéder aux variables du scope

• Permet d’embarquer un contexte

• Initialiser des valeurs depuis une fonction constructeur

26Linkvalue | Functions Everywhere

Memoïsation : implémenter un cache local

27Linkvalue | Functions Everywhere

Memoïsation : implémenter un cache local

28Linkvalue | Functions Everywhere

TP : rationaliser l’affichage des infos MeetupGuest

29Linkvalue | Functions Everywhere

TP : rationaliser l’affichage des infos MeetupGuest

30Linkvalue | Functions Everywhere

TP : rationaliser l’affichage des infos MeetupGuest

31Linkvalue | Functions Everywhere

Function composition

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

32Linkvalue | Functions Everywhere

TP : composer nos fonctions d’affichage

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

33Linkvalue | Functions Everywhere

TP : composer nos fonctions d’affichage

Il nous faut :

• Enrichir les fonctions de sélection d’une donnée

34Linkvalue | Functions Everywhere

TP : composer nos fonctions d’affichage

Il nous faut :

• Enrichir les fonctions de sélection d’une donnée

• Préparer les appels de fonctions avec les paramètres à disposition

35Linkvalue | Functions Everywhere

TP : composer nos fonctions d’affichage 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 hy 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

Func t i ons Ev er y wh er e

F u n c t i o nC 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

ADTAlgebraic Data Types

Call me MaybeTraiter les erreurs

37Linkvalue | Algebraic Data Types

Monoïd ! Monad ! Functor !

38Linkvalue | Algebraic Data Types

Algebraic Data Types

Présentation

• Structures de données

• exposent une api d’applications : transformations, morphismes, …

• Conteneurs : List, Int, String…

• ≠ Objet

• Théorie des catégories

39Linkvalue | Algebraic Data Types

En pratique

40Linkvalue | Algebraic Data Types

TP : Afficher les infos des amis

41Linkvalue | Algebraic Data Types

Gérer les erreurs

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 …

42Linkvalue | Algebraic Data Types

Gérer les erreurs – Option Type

43Linkvalue | Algebraic Data Types

Gérer les erreurs – Option Type

44Linkvalue | Algebraic Data Types

Gérer les erreurs – Option Type

45Linkvalue | Algebraic Data Types

Gérer les erreurs – Option Type

46Linkvalue | Algebraic Data Types

Gérer les erreurs – Option Type

47Linkvalue | Algebraic Data Types

Gérer les erreurs

La liberté c’est de choisir, et choisir c’est renoncer : Le type Either

48Linkvalue | Algebraic Data Types

Traiter les erreurs : Either Type

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

49Linkvalue | Pour conclure…

Pour conclure

50Linkvalue | Pour conclure…

Pour conclure

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

51Linkvalue | Merci !

Merci !

52Linkvalue | Références

RéférencesLearn

• 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 TELEPHONEADRESSERaphaë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

108 rue des Dames, 75017,

Paris

Recommended