27 mai 2007

Génération de code vs. Annotations

Le sujet est un peu plus général que le titre, mais bon.

Il apparaît que dans le processus de développement logiciel, la génération de code qui s'appuie sur un formalisme (par exemple UML, XML, YAML...) est supérieure aux techniques inline qui s'embarquent dans le code lui-même : annotations, Generics, syntaxes de conventions à la RoR, reflection, JSP...

En pratique, cela se comprend quand le framework sous-jacent n'est pas bien mûr, ou pas maîtrisé : autant pouvoir s'appuyer sur du code produit par génération plutôt que sur un comportement « magique ». Mais en gros c'est une question de goût.

Cependant, du point de vue théorique, la génération de code est un opérateur qui a un inverse, et pas l'inlining. Dans les cas qui m'intéressent (principalement de la génération par XSLT), le code produit par génération est équivalent à la formalisation initiale du composant. Tandis qu'en inlining, non seulement on peut enrichir la formalisation avec du code (JSP...), on peut ou pas utiliser certaines techniques (Generics...), mais différents développeurs pourront avoir des techniques différentes. Certes, par rapport à la génération l'inlining a une richesse sémantique (cela du reste lorsque des gens trouvent intéressant de lire ce code), mais on n'a plus d'inverse.

L'inverse assure l'équivalence entre le code produit et la notation formelle. Ainsi un point de contrôle sur le code est équivalent à un point de contrôle sur la notation formelle. Ce n'est pas du tout le cas avec l'inlining : il faut écrire des points de contrôle spécifiques.

Le mieux qu'on puisse tirer est une extraction formelle à partir de code inlined : liste des annotations, etc. On obtient moults points de contrôles, mais on est forcément en-deçà du code lui-même. Et on perd évidemment toute la sémantique.

En conclusion : il ne faudrait plus mettre la sémantique dans l'inlining, mais dans une description autonome et disjointe. Et malgré les apparences il ne faut pas imaginer pouvoir suivre ce principe quand on utilise les annotations : on est toujours tenté par elles d'enrichir le code ou par le code d'enrichir icelles.