les données qu'elle va devoir persister).
Une opération typique du logiciel se décompose alors de la façon suivante :
1. La couches présentation accepte une commande de l'utilisateur.
2. Elle s'adresse alors dans un premier temps à la couche données pour obtenir, sous forme d'entités métier, les
informations nécessaires à l'opération demandée.
3. Dans un second temps elle appelle les méthodes métier qui correspondent à l'opération demandée en ne manquant
pas de leur transmettre les informations récupérées à l'étape précédente.
4. La couche métier applique alors ses règles de gestion et retourne le résultat à la couche présentation de manière
totalement autonome, les informations qui lui sont nécessaires lui ayant été fournies sans qu'elle ait à se préoccuper
de leur provenance.
5. Enfin la couche présentation effectue le rendu du résultat obtenu pour l'utilisateur.
J'ai donc toujours trouvé cette approche préférable à celle qu'enseignaient les manuels, mais pour autant je la trouvait pas
totalement satisfaisante, et ce pour deux raisons.
La première est qu'elle manifeste un paradoxe : si la couche présentation doit demander les bonnes informations à la
couche données pour les fournir ensuite à la couche métier, cela présuppose qu'elle connait la nature des informations
nécessaires à la couche métier et qu'elle détient donc elle-même une fraction de la connaissance métier.
Mais en fait ce paradoxe est déjà présent dans le trois tiers classique, car le simple fait de savoir quels méthodes
métier appeler en fonction des demandes de l'utilisateur relève déjà d'une connaissance partielle du métier. Cette
impureté conceptuelle est juste un peu plus manifeste dans ma version que dans le trois tiers classique, passons.
Surtout, il n'est pas toujours si aisé de distinguer parfaitement ce qui relève de l'organique et ce qui relève du
fonctionnel.
Dans un composant métier traitant de comptabilité, on pourra utiliser une bibliothèque de fonctions purement
mathématiques. On peut tout aussi bien considérer cette bibliothèque mathématique, éventuellement fournie par l'API
standard du langage de programmation, comme un service purement technique et donc enfreindre la loi interdisant des
dépendances du fonctionnel vers le technique, ou bien considérer que les mathématiques sont un métier en soi.
Le même genre de question se pose quant à l'utilisation des structures de données classiques : listes, arbres, graphes
et autres tableaux associatifs. Il serait un peu audacieux de les considérer comme une brique métier plutôt
qu'organique et il serait pourtant impensable de s'en passer dans la partie fonctionnelle du programme.
J'ai donc longtemps eu ces considérations dans un coin de ma tête avec cette petite insatisfaction que procure à un
informaticien consciencieux tout concept imparfaitement ordonné. Jusqu'à ce que récemment un éclairage nouveau vienne
métaphoriquement m'illuminer sur ce sujet.
L'informatique étant pour moi plus qu'un métier une passion, j'étudie à mes heures perdues des techniques de
programmation que je n'ai pas l'occasion de pratiquer dans mon travail professionnel, même si j'ai parfois du mal à trouver
du temps à y consacrer. Je me suis ainsi mis en tête d'étudier la programmation fonctionnelle et un langage apparemment
phare dans ce domaine : Haskell. (On veillera à ne pas confondre le sens du qualificatif « fonctionnelle » de la
programmation fonctionnelle, c'est à dire à base de fonctions au sens mathématique du terme, avec celui de la notion de
composant « fonctionnel » utilisé plus haut désignant un composant qui sert directement à remplir la fonction métier du
logicel).
L'une des caractéristiques du langage Haskell et des bonnes pratiques dont il fait la promotion est la séparation claire entre
le code « pure » et le code « impure ».
En Haskell la notion de pureté va très loin : elle interdit tout effet de bord. Une fonction pure fournira toujours le même
résultat en sortie pour des valeurs en entrée données. Par exemple l'addition est une fonction pure, et il en découle 2 + 1
vaudra toujours 3.
Il est possible d'écrire du code impure en Haskell, c'est à dire du code qui produit des effets de bord ; cela est même
nécessaire si l'on veut que le logiciel écrit soit utile à quelque chose. Ce sont en effet nécessairement des effets de bord qui
permettront au programme d'interagir avec le monde extérieur, comme les périphériques d'entrée et de sortie de l'ordinateur.
Il faut donc des effets de bord à un moment ou à un autre si l'on veut que les résultats calculés par le logiciel se manifestent
d'une façon perceptible par l"utilisateur.
Mais il est de bon ton d'isoler ce code impure le plus possible du code pure. En effet un code n'est pure que tant qu'il ne
dépend de rien du tout ou seulement de code lui-même pure (cette règle s'appliquant récursivement). Qu'un morceau de
code dépende d'un code impure, et tous les morceaux de code qui dépendent directement ou indirecetment de lui