Introduction à la programmation fonctionnelle<span class="wtr-time-wrap after-title"><span class="wtr-time-number">14</span> min read</span>

Introduction à la programmation fonctionnelle14 min read

La programmation fonctionnelle c’est un paradigme vieux de plusieurs décennies qui revient à la mode ces dernières années. C’est très complexe de comprendre la programmation fonctionnelle notamment à cause des notions d’immutabilité et de pureté.

Beaucoup de gens sont confus au début de leur apprentissage de la programmation fonctionnelle. Dans cet article nous verrons quels sont les principes de ce paradigme, pourquoi l’utiliser et avec quels langages.

Pour des raisons pratique je vais utiliser javascript comme langage de programmation. C’est un des langage les plus utilisé, c’est facile à comprendre et je commenterai correctement afin que même ceux qui ne comprennent pas ce langage puissent suivre sans problèmes.

C’est quoi la programmation fonctionnelle ?

Avant toute chose, on doit comprendre ce qu’est la programmation fonctionnelle et comment elle fonctionne.

Bon , je pense que c’est clair pour tout le monde, la programmation fonctionnelle utilise principalement les fonctions. Je pense que vous savez tous ce que c’est mais au cas ou il me semble important de faire un cour aparté sur le principe des fonctions en programmation.

Les fonctions

Une fonction c’est une suite d’instructions utilisable plusieurs fois dans un programme. On peux les voir comme de lignes de code contenus dans une variables qui seront exécutés à l’appel de la variable.

La principale idée des fonctions c’est de pouvoir leur fournir des arguments , c’est à dire de variables qui seront utilisées dans le code.

Prenons un exemple simple, (ceci est du javascript) , créons une fonction permettant de mettre au carré un nombre

function square(number)
{
    return number * number;
}


const square4 = square(4);

Ici notre variable number est remplacée par le nombre entre parenthèse lors de l’appel de la function. Ce qui fait que la variable “square4” faudras 4 x 4 donc 16.

Les principes de la programmation fonctionnelle

Vous l’aurez compris, lorsque l’on utilise la programmation fonctionnelle on va maximiser l’utilisation de fonctions et éviter le code procédural ou orienté objet.

La grande question qui se pose, c’est pourquoi ? Pourquoi voudrais-on utiliser les fonctions lorsque l’on as des classes ?

Pour répondre à cette question il faut comprendre que l’on ne va pas créer des fonctions classiques. Celles-ci vont respecter quelques règles qui vont nous permettre d’écrire du code optimisé.

Les règles des fonctions

Pour résumer, la programmation fonctionnelle as pour principe de n’utiliser que des fonctions, donc d’éviter tout code procédural ou orienté objet. En plus de cela, ces fonctions doivent respecter certaines règles que nous allons étudier juste après afin d’avoir un code de bonne qualité

Le principe de pureté

Derrière ce nom bizare se cache un concept extrêmement important, je dirais même que c’est le principe clé de la programmation fonctionnelle.

Les fonctions que vous écrivez doivent être pures, pour se faire elles doivent respecter plusieurs conditions :

  • Elle ne doivent pas avoir de “side effect”, c’est à dire qu’elles ne doivent pas modifier des variables à l’extérieur de la fonction. La fonction n’as le droit d’intervenir que sur les arguments qui lui sont donnés. Ainsi elle ne peux pas commettre d’erreurs et ainsi modifier des données à un mauvais moment.
  • La fonction doit être prévisible, on doit pouvoir connaître la valeur de retour avant qu’elle soit exécutée. Donc on exclus les appels AJAX si ils ne sont pas prévisibles ainsi que les facteurs aléatoires.
  • Votre fonction doit toujours retourner quelque chose. Cette règle va de paire avec la règle des “side effects”, si votre fonction ne retourne rien, c’est que vous avez modifié quelque chose d’externe à la fonction. Vous devez impérativement garder en tête qu’une fonction doit toujours prendre au moins un argument et doit retourner quelque chose.

Bien sur, on ne peux pas avoir 100% de fonctions pures. L’idée c’est d’en avoir le plus possible. Au début 20% d’impure seras correct mais un bon programmeur peux descendre à 10% sans problèmes.

Mais pourquoi voulons nous que les fonctions soit pures ?

Bon, on as toutes ces règles mais à quoi elles servent exactement ? C’est vrai , à quoi bon appliquer des règles contraignantes si on en retire aucun bénéfice ? Et bien nous allons voir quels sont les avantages à suivre ces principes de pureté.

La programmation fonctionnelle est souvent appelé composition, et ce n’est pas anodin. Le principe est de créer un programme avec des fonctions indépendantes et réutilisables.

Puisque les fonctions pures n’ont pas de “side effect”, elles sont utilisables dans n’importe quel situation et avec n’importe quel variables en entrée.

Donc le premier avantage c’est d’avoir des blocs de code modulables, utilisable ensemble et surtout ré utilisables. Cette méthode permets de gagner un temps fou lorsque l’on développe, puisque nos fonctions sont pures, elles sont utilisables dans n’importe quel situation puisqu’elles ne dépendent pas d’éléments externes.

Ensuite, les fonctions pures sont beaucoup plus simples à débugger et à patcher. Si vous êtes débutants vous n’avez peut être jamais touché au déboggage et à la correction de bugs. En effet, ces choses viennent bien plus tard lorsque l’on s’attaque à des projets de plus grande envergure.

Croyez moi, les fonctions pures sont d’une simplicité enfantine à corriger. Puisqu’elles ne dépendent pas d’autres éléments et qu’elles ne modifient rien à part les variables à l’intérieur de la fonction, il est très simple de comprendre d’ou proviens un bug. Puisque rien ne communique réellement, il n’y a pas de raisons qu’un bug soit caché ou irréparable.

Pur VS impur

Voyons quelques exemples de fonctions pur et de leur équivalent impur :

function pursquare(number)
{
    return number * number;
}

const number = 12;

function square()
{
    console.log(number * number)
}


console.log(pursquare(12));
square();

La première fonction que nous allons comparer est la fonction qui permets d’afficher un nombre au carré. La première fonction est pure et la seconde est impur.

Le but ici est de créer une fonction capable d’afficher à la console le carré d’un nombre, voyons la solution pure et son équivalent impure.

Dans la première fonction, on utilise un argument, ce qui rends la fonction unniverselle, on peux donner n’importe quoi à la fonction, tant que c’est un nombre ça fonctionneras.

La fonction retourne bien quelque chose puisque c’est notre nombre au carré. Il suffit de faire un console.log( pursquare(votrenombre) ) pour afficher le nombre sur la console.

Maintenant intéressons nous à l’équivalent impure de notre fonction square. Celle-ci ne prends pas d’arguments, elle se base sur une variable extérieure, ce qui casse d’office le principe de pureté puisque l’on utilise un “side effect”.

Ensuite celle-ci ne retourne rien , on en déduis donc qu’elle n’est pas pure, on peux vérifier cela en voyant qu’elle console.log() directement, ce qui est un side effect et donc interdit.

L’immutabilité

Maintenant que nous avons vu que nos fonctions devaient être pure , nous allons nous intéresser à une deuxième propriété de la programmation fonctionnelle, l’immutabilité.

Le principe est encore plus loufoque que les fonctions pures, ici on cherche à ne jamais modifier de variables..

Mais pourquoi on ferait quelque chose d’aussi contraignant ??

C’est vrai qu’a première vu, cela n’as aucun sens. En programmation les variables varient, c’est dans leur noms, alors pourquoi on voudrait leur retirer cette caractéristique principale ?

Croyez moi, ce n’est pas aussi inutile que ça en as l’air, je dirais même que c’est extrêmement pratique si c’est bien utilisé, nous allons voir les avantages de l’immutabilité maintenant !

Les avantages de l’immutabilité

Bon, je sais comme ça , ça ne donne pas envie, mais en fait l’immutabilité simplifie grandement notre code si elle est bien maniée.

La programmation fonctionnelle se rapproche énormément des mathématiques, contrairement a la POO, on utilise des fonctions informatiques qui sont semblables aux fonction mathématiques f(x).

Ajouter de la mutabilité dans les fonctions rend la chose beaucoup plus complexe, et ce pour plusieurs raisons. D’abord parce que cela crée très souvent des “side effect”, ce qui rend la fonction impure.

Ensuite, parce que gérer de la mutabilité dans des fonctions qui s’enchaine n’as pas vraiment de sens. Puisque l’on donne systématiquement un argument à notre fonction, elle n’as pas besoin de muter le résultat d’une ancienne fonction, elle récupère juste le résultat et en retourne un nouveau à partir de l’ancien, cela semble plus complexe mais en fait c’est bien plus simple, voyons cela tout de suite

function compute1(number1)
{
    return number1 + number1/3 - number1/4
}

function compute2(number2)
{
    number2+= number2/3;
    number2 -= number2/4;
    return number2;
}

Sincèrement, quelle fonction préférez vous ici ? Les deux font exactement la même chose, seulement la première utilise l’immutabilité et la seconde mute notre variable donnée.

Pour ma part je trouve la première plus simple et plus lisible.

Attaquons nous à un exemple plus complexe afin de comprendre pourquoi l’immutabilité est une bonne chose

Dans le premier exemple nous allons créer trois fonctions pures de computation qui vont s’enchainer en utilisant l’immutabilité

Dans le second exemple, nous utiliserons les mêmes fonctions mais sous leur forme mutable et impure

function first(number) {
    return (number + 13) **
}

function second(number) {
    return number + number / 34 - 9;
}

function third(number)
{
    return number / (2 + (number - 16));
}


const firstresult = first(12);
const secondresult = second(firstresult);
const third = third(secondresult);

Bon , les calculs mathématiques n’ont aucun sens, mais c’est plutôt simple à comprendre n’est ce pas ? Chaque fonction est pure et ne modifie pas d’autres choses contenue dans notre programme. De plus nous de modifions aucune variables. En somme notre code est fonctionnel.

Voyons maintenant la même chose mais avec des fonctions impurs et surtout avec de la mutabilité


let finalresult = 50;

function impurfirst()
{
    finalresult += 13;
    finalresult *= finalresult;
}

function impursecond()
{
    let numbers34 = finalresult / 34;
    numbers34 -= 9;
    finalresult += numbers34;

}

function impurthird()
{
    
    let temp = finalresult - 16;
    temp += 2;
    finalresult = finalresult / temp;
}

impurfirst();

Voila la version mutable, on crée d’abord une variable, puis on exécute nos fonctions qui vont au fur et à mesure modifier nos variables. C’est fastidieux et complexe pour un résultat plutôt basique…

On peux donc voir que la mutabilité permets de gagner du temps et d’économiser des lignes de code dans ce genre de situation.

Pourquoi utiliser la programmation fonctionnelle

Bon , nous avons vu que la programmation fonctionnelle reposait sur les piliers des fonctions pure et de l’immutabilité. En plus de cela il faut apprendre les fonctions pures natives à chaque langage de programmation. Par exemple en javascript on as les fonctions map ou reduce. A vous de chercher pour chaque langage de programmation.

On as vu que la programmation fonctionnelle permettait de simplifier pas mal de choses, mais est-ce vraiment adapté à votre style et à vos préférences.

D’abord il faut comprendre qu’il n’existe pas de meilleur paradigme entre la programmation orientée objet et la programmation fonctionnelle. Chaque style as ses avantages et ses défauts, il n’y a donc pas de solution miracle meilleure qu’une autre.

En sachant cela, pourquoi est ce que l’on utiliserait la programmation fonctionnelle plutôt qu’un paradigme installé depuis des décennies tel que la programmation orienté objet.

Programmation fonctionnelle vs orienté objet

C’est clairement le grand débat, à part lorsque l’on fait du C, on ne fait plus de programmation procédurale, alors nous devons choisir entre les deux grands paradigmes de programmation.

Si vous n’êtes pas familiers avec la programmation orienté objet, je vous invite à lire mon article sur le sujet afin de pouvoir comparer les deux paradigmes et en choisir un selon vos besoins et vos envies.

Les deux paradigmes sont diamétralement opposé, d’un cote la POO est un style très lourd et avec énormément d’abstraction. Nos classes peuvent faire des centaines de lignes et une fois crées, elles s’utilisent très facilement.

De l’autre côté nous avons la programmation fonctionnelle qui ne nécessite pas de créer des structures sur plusieurs centaines de lignes de code mais qui demande un peu plus de temps pour appréhender et utiliser les fonctions.

Je pense que la programmation fonctionnelle est beaucoup plus souple que l’OOP. Il est possible de créer des programmes très intéressants sans devoir créer des classes très lourdes pour stocker vos données et les modifier.

Néanmoins, l’OOP permets de s’organiser de manière bien plus efficace. Chaque type d’action est contenu dans une classe et c’est bien plus facile de comprendre quel code correspond à quel action.

Concernant les performances, les deux son équivalents, on pourraît penser que la POO est beaucoup plus rapide mais au final ce n’est guerre qu’un empilement de fonctions isolées de manière à créer des objets.

Les avantages de la programmation fonctionnelle

Maintenant qu’on sait différencier les deux grands paradigmes, on va voir plus spécifiquement pourquoi nous devrions choisir la programmation fonctionnelle plutôt que l’orienté objet.

La simplicité de développement

La programmation fonctionnelle as l’avantage d’être très simple à prendre en main. Contrairement à l’OOP, pas besoin de comprendre des principes tels que l’héritage ou l’encapsulation. Il suffit de créer des fonctions respectant certaines règles et le tour est joué.

C’est donc un style simple à prendre en main car il n’utilise que des fonctionnalités qui existent depuis le langage C. On peux donc dire que c’est un paradigme facilement accessible aux débutants.

L’unniversalité

L’orienté objet varie bien souvent d’un langage à l’autre. Par exemple on trouve les traits en PHP, des concepts qui n’existent pas en javascript ou en C++.

La programmation fonctionnelle elle, ne se base que sur des concepts qui dérivent du C, ils sont donc tous présents dans les langages de programmation modernes. Maîtriser la programmation fonctionnelle permets donc de passer aisément d’un langage à l’autre sans avoir à apprendre de nouveaux concepts inédits.

L’immutabilité

C’est un argument en soi, les fonctions pures mènent toujours à l’immutabilité, et nous avons vu que ce système simplifiait grandement la conception de fonctions.

Chaque fonction est isolée et est donc parfaitement prévisible , testable et déboggable.

La mise en production d’une application est donc facilitée puisque nous n’avons pas à rechercher des lien de causalité entre les classes de notre programme pour détecter un bug. Chaque code exécute est contenu dans une fonction et est donc facilement trouvable.

En conclusion

La programmation fonctionnelle est une réelle alternative à l’orienté objet et au procédural. Ce paradigme permets de créer des blocs de code léger, réutilisable , interchangeable et surtout prévisibles.

C’est un paradigme très simple à apprendre et qui permets pourtant d’obtenir de très bons résultats. Il as l’avantage d’être très accessible aux débutants et ne nécessite pas de créer des fichiers de plusieurs centaines de lignes.

Enfin, la programmation fonctionnelle permets de gérer facilement les bugs éventuels de votre programme puisque les fonctions sont isolées et n’interagissent pas les unes avec les autres.

Si cet article vous as plu, vous pouvez vous abonner à ma newsletter pour recevoir le guide GRATUIT Ultime pour bien débuter la programmation

Vous abonner à notre newsletter

* champ requis

Je vous remercie d’avoir lu cet article, au plaisir de vous revoir sur mon blog !

Laisser un commentaire

Fermer le menu
×
×

Panier