La programmation fonctionnelle est un paradigme de programmation peu répandu, bien qu’ancien, qui tire ses racines du lambda calculus. Ce paradigme a gagné en popularité lors de la dernière décennie, avec l’avènement du Big Data.
Un paradigme de programmation est une approche, une méthode pour écrire des programmes informatiques indépendamment du langage utilisé. Un paradigme fonctionnel est constitué entre autres de règles et de principes.
Les paradigmes les plus connus : programmation procédurale, programmation orientée objet et programmation fonctionnelle
La programmation procédurale et la programmation orientée objet sont les deux paradigmes les plus répandus.
Programmation procédurale
La programmation procédurale est généralement le premier paradigme que l’on apprend. Il s’agit d’une séquence d’instructions s’exécutant les unes après les autres. On liste des variables et on leur applique une séquence d’instructions qui peuvent être regroupées par blocs dans des fonctions ayant des paramètres et des arguments.
Cette approche montre rapidement ses limites au fur et à mesure qu’un programme grandit. Elle est donc cantonnée à des programmes relativement courts (mais potentiellement complexes).
Programmation orientée objet
La programmation orientée objet est probablement le paradigme le plus répandu dans l’industrie, qui comporte des données complexes. Le code de la programmation orientée objet se compose d’objets auxquels sont associés des attributs et des méthodes.
Par exemple, dans un logiciel de comptabilité, un compte sera un objet. Les variables attributs de cet objet seront :
- le solde de ce compte de type int
- l’identifiant du compte de type const int
- le nom du propriétaire de type char
L’action de réaliser une transaction sera une méthode avec un argument qui peut être appelée pour modifier le compte du montant de l’argument.
Cette forme d’abstraction est très intéressante pour écrire des programmes de taille importante, car elle permet un découpage par blocs logiques proches du réel.
Programmation fonctionnelle
Moins répandue, mais tout de même considérée comme un paradigme majeur, la programmation fonctionnelle s’inspire des fonctions mathématiques.
Ce paradigme est beaucoup plus abstrait. L’entité centrale est la fonction, au sens mathématique du terme, donc définie par une expression donnée telle que :
f(x, y) = x + y
(à ne pas confondre avec la fonction en programmation procédurale, qui est un outil pratique pour regrouper des instructions).
Plusieurs concepts régissent la programmation fonctionnelle, tels que les fonctions pures, l’immuabilité…
Pour plus d’éléments sur la programmation fonctionnelle, ce post relativement court représente des données complémentaires.
Un exemple concret pour comprendre la programmation fonctionnelle en langage Python
Pour mieux comprendre, prenons un exemple et comparons une approche procédurale avec une approche fonctionnelle.
Notre problème : faire le solde d’une liste de transactions
Pour comprendre l’approche fonctionnelle, prenons de l’exemple de Riri, Fifi et Loulou qui s’échangent souvent des valeurs. Nous cherchons ici à faire le solde d’une liste de transactions.
Voici dans ce tableau, la liste de leurs transactions :
Nous allons écrire le code en langage de programmation Python pour calculer le solde des comptes en fonction de la date et de la séquence des transactions.
Approche procédurale
Voici ci-dessous le code en langage Python :
On définit la date comme une variable objet de type « datetime » et la valeur des variables de soldes à 0.
Pour chaque élément du tableau des transactions, on vérifie la date ; si elle est trop récente, on l’ignore, puis on met à jour les variables soldes en fonction du montant, de l’émetteur et du destinataire.
Le résultat est la variable de soldes qui contient le solde des trois personnes à la date donnée en fonction du tableau des valeurs échangées.
Cette approche est probablement la plus directe et la plus simple pour cet exemple volontairement simpliste.
Approche fonctionnelle
Nous allons maintenant écrire le code en langage de programmation Python pour une approche fonctionnelle :
En langage Python, la définition d’une fonction se fait par les mots-clés « déf » pour la définition et « return » pour le résultat retourné. Nous définissons plusieurs fonctions :
- La première séquence du code consiste à écrire les fonctions nécessaires à l’obtention de données :
- Les premières fonctions servent à filtrer les transactions pour ne garder que celles qui nous intéressent : les transactions antérieures à une date donnée, celle d’un émetteur ou d’un destinataire.
- La fonction « prendre_montant » exécute une extraction du montant de chaque élément du paramètre Transactions dans l’ordre, avec le mot-clé « map ».
- La fonction Somme exécute une réduction (reduce). Une réduction permet d’agréger les éléments d’une liste. Dans ce cas, les éléments sont les montants du paramètre Transactions dans l’ordre et l’opération réalisée est la somme de ces montants.
- La deuxième séquence du code est « calculer_solde », une fonction combinant les fonctions précédentes que l’on exécute pour pouvoir déterminer le solde de l’une des trois personnes à une date donnée.
Quels avantages pour la programmation fonctionnelle ?
Dans le code de l’approche fonctionnelle : on remarque qu’il n’y a aucune assignation de variable (à l’inverse du code procédural, où l’on assigne plusieurs fois la variable Soldes).
De fait, le code en programmation fonctionnelle n’a aucun état (à part l’état lié aux données initiales).
C’est l’un des arguments de la programmation fonctionnelle, car cela a pour effets :
- d’éviter les effets de bord, ainsi, une fonction renvoie toujours le même résultat pour une entrée donnée, indépendamment de l’état du système – ce qui permet de mettre le résultat en cache et simplifie le débogage – ;
- de rendre facile la parallélisation de ce code. Avec les fonctions Map, Reduce et Filter, le résultat sera le même quel que soit l’ordre de la liste en entrée.
Ces arguments font que la programmation fonctionnelle est particulièrement appréciée en Big Data, la parallélisation est en effet nécessaire pour traiter de tels volumes de données et bien allouer la mémoire. Ce paradigme fonctionnel est justement à la base de certains outils et langages de programmation pour le Big Data, tel Spark, dont nous parlions déjà dans cet article.
Saagie offre une plateforme puissante pour la gestion et l’analyse de données, et elle est compatible avec la programmation fonctionnelle. En utilisant Saagie avec la programmation fonctionnelle, les utilisateurs peuvent bénéficier d’une approche déclarative, de transformations de données efficaces et de meilleures possibilités de parallélisation. Cette combinaison permet de développer des solutions agiles et performantes pour la manipulation et l’analyse des données.