Programmation fonctionnelle #1: Les 3 grands principes

Alexandre DUARTE
4 min readOct 31, 2018

#Programmation #Fonctionnelle

Problème

Toutes les situations de ton quotidien peuvent être abordées d’une manière différente. Tu peux choisir de les aborder positivement ou négativement. En programmation, c’est pareil. Il existe plusieurs façons d’approcher la programmation informatique et de traiter les solutions aux problèmes. Ce sont les paradigmes de programmation.

Un paradigme bien connu des développeurs, c’est l’orienté objet. C’est une approche de la programmation informatique qui représente le monde extérieur sous forme d’objets. Par exemple, si tu veux représenter une voiture, tu créeras un objet de type voiture qui aura quatre roues, un moteur, un kilométrage. Ce sont des attributs. La voiture pourra également accélérer, ralentir. Ce sont des fonctions. En général, un objet sera représenté par une classe qui regroupera les données (=attributs) et le traitement de ses données (=fonctions).

De l’autre côté, il existe un autre paradigme un peu moins connu mais qui grandit de plus en plus, c’est la programmation fonctionnelle. Au début, réservé pour les plus matheux d’entre nous, ce paradigme commence à connaître un grand succès auprès des développeurs car il résout de nombreux problèmes liés à l’orienté objet. Mais, qu’est-ce que la programmation fonctionnelle ? Plutôt que de donner une définition du type Wikipédia :

La programmation fonctionnelle est un paradigme de programmation de type déclaratif qui considère le calcul en tant qu’évaluation de fonctions mathématiques.

Je vais donner les 3 grands principes qui régissent le paradigme de la programmation fonctionnelle.

1) La programmation fonctionnelle évite les états d’âmes

En orienté objet, lorsqu’on modélise une classe représentant un objet, cette classe possède un état. Un état courant représenté par ses attributs. Par exemple, une voiture en début de programme peut afficher un kilométrage de 10 000 km à son compteur. Puis, en fin de programme, elle peut afficher 10 200km. L’état de l’objet voiture a changé car son attribut kilométrage a changé en passant de 10 000 à 12 000 km.

Dès que l’on place de la logique à l’intérieur des classes représentant les objets, cette même logique modifie l’état global et courant de cet objet.

Mais, en quoi est-ce un problème de modifier l’état d’un objet ? Tout simplement parce qu’un objet variable dans le temps est difficile à déterminer et à prédire dans le futur ce qui peut causer des effets de bords dans le programme. Qui dit effet de bord, dit premiers bugs.

En programmation fonctionnelle, on s’efforce de coder des fonctions qui ne modifient pas l’état courant de l’objet. On crée ce qu’on appelle des fonctions pures. Une fonction pure est une fonction qui ne dépend QUE de ses arguments. Peu importe les arguments, les résultats des fonctions pures seront toujours les mêmes.

Les fonctions pures fournissent des résultats prédictibles car elles ne dépendent pas de l’extérieur mais uniquement de ses arguments passés en interne. Cela permet d‘éviter les effets de bords de son programme.

2) La programmation fonctionnelle sépare les données et la logique

En orienté objet, on crée des classes pour représenter des données mais également pour introduire une logique de traitement de ces données. C’est une approche gênante car comme on l’a vu précédemment, cette approche modifie l’état courant de l’objet causant des effets de bord.

En programmation fonctionnelle, il y a une séparation entre la donnée et les fonctions de traitement de cette donnée.

En programmation fonctionnelle, cette séparation entre la donnée et le traitement de cette donnée se traduit notamment par la responsabilité des classes. Les classes sont uniquement responsables de représenter les données. Les traitements de ces données sont uniquement réservés aux fonctions pures. C’est pourquoi, en programmation fonctionnelle, les classes se rapprochent plutôt des structures comme on peut le voir en C ou en Swift.

3) La programmation fonctionnelle pratique l’invariabilité

On sait que les fonctions pures dépendant uniquement des arguments passés et fournissent toujours les mêmes résultats peu importe les arguments. C’est ce caractère prédictible et déterministe qui garantit la fiabilité du programme.

Les fonctions pures ne sont possibles que si l’on manipule des objets dont l’état est invariable dans le temps.

Si l’on manipule des objets dont l’état est variable, on replonge dans l’incertitude de l’orienté objet ce qui causera des effets de bord et des bugs.

Conclusion

En résumé ce que l’on a abordé durant cet article :

  1. Il existe plusieurs approches dans le développement d’un programme informatique. Ce sont les paradigmes de programmation.
  2. Il existe deux grands paradigmes : la programmation orientée objet et la programmation fonctionnelle.
  3. L’orienté objet est un grand classique bien connu des développeurs. Il représente les concepts à l’aide d’objets ayant des attributs et des fonctions. L’orienté objet se soucie de l’état courant de ses objets.
  4. La programmation fonctionnelle sépare clairement les données et le traitement de ses données à l’aide des fonctions pures. La programmation fonctionnelle ne se soucie pas de l’état courant de ses objets ce qui la rend prédictible et déterministe.

Pour aller plus loin

120: Functional Programming with Kotlin Arrow team

P.S : En attendant, je compte sur toi pour aimer, recommander, commenter et partager l’article. Merci.

--

--