Il se trouve que je code en ce moment une GED d'environ 15 ksloc en OCaml, et je peux peut-être t'éclairer sur le fonctionnel en informatique de gestion.
Quand tu fais une appli qui interagit beaucoup avec le monde extérieur, il ne faut pas non plus être un ayatollah de la pureté (de toutes façon, si tu veux vraiment être un ayatollah, tu peux toujours coder en monades) : l'essentiel est que ta fonction prend des paramètres avec un typage fixe et renvoi des données ayant un typage fixe et ne travaille qu'avec ceux-ci (plus les variables locales).
L'intérêt du fonctionnel n'est pas là (en tout cas en ce qui me concerne), mais plutôt :
L'absence de boucles (qui personnellement m'insupporte) au profit de l'utilisation de map/filter/find/exists et fold (quand tu as acquis une certaine expérience pour le fold). Utiliser ces fonctions rend le code plus propre et plus court, parallélisable naturellement et beaucoup plus facile à coder
L'ordre supérieur, qui te permet de définir des fonctions de fonctions de … , ce qui te permet d'écrire des fonction ultra générique que tu vas pouvoir spécialiser en fonction de différents contextes. Par exemple, j'ai une fonction construitArbo qui va construire une arborescence de fichiers d'un espace utilisateur Alfresco. Je donne à construitArbo 2 paramètres, une fonction qui se charge de faire le "ls" (contrainte Alfresco, je suis obligé de faire comme ça), et une fonction qui va effectuer des traitements sur chaque noeud de l'arbre. Ainsi, je peux donner différentes fonctions en paramètre de construitArbo, ce qui peut être utile si j'utilise un FS Unix-lie pour faire un ls, ou si je dois appliquer un traitement différent sur mes noeuds.
Le fait de disposer d'un typage vraiment puissant, en particulier le type somme, qui te permet de mettre la complexité de ton appli dans la définition des types et ainsi de bénéficier des vérifications de type du compilateur, qui a tendance à accepter de compiler lorsqu'il ne reste plus beaucoup de bugs (depuis un an de dev 90% de mes bugs viennent d'erreur dans les requêtes SQL, la définition d'url, bref la communication avec l'exterieur)
L'interdiction ou l'absence de valeur nulle, ce qui t'évites des monceaux de bugs. Dans une SSII, sur un gros projet où j'ai essentiellement débugué du Java pendant 8 mois, j'ai calculé que j'ai couté 15 000 € à la SNCF à corriger des nullPointerException. Franchement, j'ai gagné des mois de code grâce à ça.
Complètement thread-safe et donc scalable, Carmack l'a très bien expliqué, inutile de revenir là dessus. Si, juste pour dire que dans mon appli, les rares infos qu'on mettrait habituellement en mémoire globale, je les ais mis dans un Memcache (un Couchbase maintenant), donc j'ai qu'à lui donner l'url du serveur memcache (dans son fichier de conf) et je peux démarrer autant d'instance serveur que je veux. En plus individuellement, elles scalent elles-même automatiquement.
Bref, ce que dit simplement Carmack, c'est : quand vous écrivez une fonction, faites en sorte qu'elle soit pure dans le sens où, à l'intérieur de celle-ci on n'interagit qu'avec les paramètres d'entrés et les variables locales.
Tu peux évidemment aller beaucoup plus loin, mais si tu respectes déjà cette hygiène simple dans l'écriture de tes fonctions/méthodes, c'est déjà beaucoup.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Avantages de la programmation fonctionnelle?
Posté par Ontologia (site web personnel) . En réponse au journal Adopter un style de programmation fonctionnel. Évalué à 10.
Il se trouve que je code en ce moment une GED d'environ 15 ksloc en OCaml, et je peux peut-être t'éclairer sur le fonctionnel en informatique de gestion.
Quand tu fais une appli qui interagit beaucoup avec le monde extérieur, il ne faut pas non plus être un ayatollah de la pureté (de toutes façon, si tu veux vraiment être un ayatollah, tu peux toujours coder en monades) : l'essentiel est que ta fonction prend des paramètres avec un typage fixe et renvoi des données ayant un typage fixe et ne travaille qu'avec ceux-ci (plus les variables locales).
L'intérêt du fonctionnel n'est pas là (en tout cas en ce qui me concerne), mais plutôt :
L'absence de boucles (qui personnellement m'insupporte) au profit de l'utilisation de map/filter/find/exists et fold (quand tu as acquis une certaine expérience pour le fold). Utiliser ces fonctions rend le code plus propre et plus court, parallélisable naturellement et beaucoup plus facile à coder
L'ordre supérieur, qui te permet de définir des fonctions de fonctions de … , ce qui te permet d'écrire des fonction ultra générique que tu vas pouvoir spécialiser en fonction de différents contextes. Par exemple, j'ai une fonction construitArbo qui va construire une arborescence de fichiers d'un espace utilisateur Alfresco. Je donne à construitArbo 2 paramètres, une fonction qui se charge de faire le "ls" (contrainte Alfresco, je suis obligé de faire comme ça), et une fonction qui va effectuer des traitements sur chaque noeud de l'arbre. Ainsi, je peux donner différentes fonctions en paramètre de construitArbo, ce qui peut être utile si j'utilise un FS Unix-lie pour faire un ls, ou si je dois appliquer un traitement différent sur mes noeuds.
Le fait de disposer d'un typage vraiment puissant, en particulier le type somme, qui te permet de mettre la complexité de ton appli dans la définition des types et ainsi de bénéficier des vérifications de type du compilateur, qui a tendance à accepter de compiler lorsqu'il ne reste plus beaucoup de bugs (depuis un an de dev 90% de mes bugs viennent d'erreur dans les requêtes SQL, la définition d'url, bref la communication avec l'exterieur)
L'interdiction ou l'absence de valeur nulle, ce qui t'évites des monceaux de bugs. Dans une SSII, sur un gros projet où j'ai essentiellement débugué du Java pendant 8 mois, j'ai calculé que j'ai couté 15 000 € à la SNCF à corriger des nullPointerException. Franchement, j'ai gagné des mois de code grâce à ça.
Complètement thread-safe et donc scalable, Carmack l'a très bien expliqué, inutile de revenir là dessus. Si, juste pour dire que dans mon appli, les rares infos qu'on mettrait habituellement en mémoire globale, je les ais mis dans un Memcache (un Couchbase maintenant), donc j'ai qu'à lui donner l'url du serveur memcache (dans son fichier de conf) et je peux démarrer autant d'instance serveur que je veux. En plus individuellement, elles scalent elles-même automatiquement.
Bref, ce que dit simplement Carmack, c'est : quand vous écrivez une fonction, faites en sorte qu'elle soit pure dans le sens où, à l'intérieur de celle-ci on n'interagit qu'avec les paramètres d'entrés et les variables locales.
Tu peux évidemment aller beaucoup plus loin, mais si tu respectes déjà cette hygiène simple dans l'écriture de tes fonctions/méthodes, c'est déjà beaucoup.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker