Adorons Jésus-Eucharistie! | Accueil >> Varia >> Génie logiciel
Les compagnies qui développent avec le langage de programmation "C" depuis plusieurs années ont tendance à précéder toutes leurs définitions de fonction avec des «barbelés»:
/************************************************************ * Function Name: fooBar * Input: * i : int : The number of channels * c : char : The channel type * 't' == aligned * 'v' == read-only * 'z' == phase-array * d : void* : The channels * Output: int : The skew angle for all the channels. * Global Effects: none * Modifications: * 01/04/96 Dwight D. Coder : removed bug #342 * 22/09/97 Gary Goto : added 'z' channel ************************************************************/ double fooBar( int i, char c, void* d ) { /* ... le code en tant que tel */ }
Ces «barbelés» (parfois appelés ainsi à cause des lignes d'astérisques qui y ressemblent) représentent une mine d'or pour un anthropologue:
Souvent dans les réunions, on se dispute férocement à propos de choses comme le format précis des barbelés, tout en oubliant le «petit reste», comme l'architecture du système, ou la bonne façon d'utiliser le langage de programmation, ou la performance, etc.
Chaque compagnie possède son «barbelé» tout à fait unique et distinctif. Et comme Cyrano de Bergerac, on est prêt à mourir pour préserver son barbelé de tout affront.
C'est du «ASCII Art». Les gens s'imaginent que les programmeurs sont dénués de sens esthétique. Mais ils n'ont jamais vu toutes les heures de travail que certaines compagnies imposent à leurs programmeurs pour que leurs «barbelés» soient beaux.
Mais nous ne sommes pas anthropologues. Le problème fondamental avec les «barbelés», c'est qu'ils se retrouvent souvent dans le code C++ de ces mêmes compagnies, lorsqu'elles font la transition vers la programmation orientée-objets. Les «barbelés» deviennent alors soit une relique inutile et coûteuse, soit un obstacle qui ralentit la transition au C++.
Pour commencer, voici de quoi pourrait avoir l'air en C++ la signature de la fonction décrite ci-haut dans le barbelé:
Angle Probe::GetSkewAngle(const vector<Channel*>& channels ) const throw( AngleError, ProbeError );
En plus d'améliorer la productivité des programmeurs (les barbelés sont fastidieux à entretenir) et de rendre le code source plus clair (moins de «bruit», c'est-à-dire de pseudo-information que le cerveau doit filtrer avant de pouvoir trouver ce qu'il cherche vraiment), les vraies signatures de fonction sont plus «parlantes». En effet, pour un programmeur C++, cette toute petite signature en dit autant et même beaucoup plus que l'immense barbelé ci-haut. Essayons d'en énumérer les raisons, en ordre d'importance croissante:
1) Une vraie fonction C++ n'a pas «d'effets globaux». Par définition ou presque, la programmation orientée-objets est incompatible avec les variables globales. Avoir une rubrique «Effets Globaux» dans un barbelé, c'est comme un hôpital qui aurait un formulaire de chirurgie avec une rubrique «Nombre de chirurgiens qui ne se laveront pas les mains avant d'opérer».
2) Si une fonction membre ne modifie pas l'état de l'objet, sa signature se termine par «const». Dans l'exemple ci-dessus, le programmeur sait que la fonction «GetSkewAngle» ne modifiera rien dans l'objet «CProbe».
3) Les arguments formels «input» sont identifiés par «const», les «output» par «&». Devant chaque argument formel de la fonction, s'il y a le mot réservé «const», c'est un argument «input», et s'il n'y a pas de «const» mais une esperluette (un «&») avant le nom de la variable, c'est un argument «output». Voilà, c'est tout. La règle dit: «Codez explicitement tout ce qui peut l'être, commentez explicitement le reste». On ne met pas dans un commentaire ce qui peut se dire explicitement dans le code.
4) Les «spécifications d'exceptions» nous disent ce qui se passe en cas d'erreur. Souvent les barbelés contiennent plusieurs lignes de texte pour expliquer ce que la fonction va retourner en cas d'erreur. En C++, on gère les situations exceptionnelles en lançant des exceptions, et on peut énumérer toutes les exceptions qu'une fonction a le droit de lancer dans la «spécification d'exception». Comme les exceptions se gèrent toutes de la même manière (avec «catch»), nul besoin de l'expliquer dans chaque barbelé. Pour ce qui est du contenu même de l'exception, voir le dernier point de cette énumération.
5) La "Bibliothèque Standard" remplace les pointeurs. Une des horreurs du C, c'est qu'en voyant un pointeur sur quelque chose passé en argument, on ne peut jamais savoir si c'est vraiment un pointeur sur un seul objet, ou un pointeur sur un tableau d'objets. Mais en C++, si on veut passer un vecteur ou une liste, on passe un «std::vector» ou un «std::list», etc. Pas besoin d'expliquer dans le barbelé que tel pointeur est en fait un vecteur.
6) Les fonctions virtuelles remplacent les «switch-on-type». On peut voir que la fonction reçoit des pointeurs vers des canaux. Sauf qu'il y a toutes sortes de canaux, comme on peut le voir dans le barbelé ci-haut. Mais en C++, on ne fait pas des «si le type du canal égal telle constante, alors faire tel traitement, sinon ...». On appelle une fonction virtuelle, qui elle fait le bon traitement selon le type. Il ne sert donc à rien de passer le type du canal en argument.
7) Le langage C est "orienté-fonctions", le C++ est "orienté-classes". Dans un langage où tout système est un assemblage de fonctions, l'unité fondamentale de la documentation est la fonction, d'où l'importance des "barbelés" en C. Mais dans les langages orienté-objets, l'unité de décomposition est la classe, alors on documente surtout la classe et non la fonction.
8) Le C++ sert à fabriquer et manipuler des types. C'est notre dernière raison dans cette énumération, elle est aussi la plus importante. En effet, une des différences fondamentales entre le C et le C++, c'est que en plus de manipuler des types comme «int», «char» et «double», le C++ vit et respire par la définition et la manipulation de nouveaux types, comme «Channel» ou «JetFighter» ou «SuspendedBridge». Comme ces types sont définis et documentés à quelque part, dès qu'on retrouve un de ces types dans une signature de fonction, on a immédiatement une foule de renseignements à la portée des doigts. Dans l'exemple de signature de fonction ci-haut, on voit que «GetSkewAngle» retourne clairement un «Angle», alors que dans le barbelé, la fonction retournait un mystérieux «double», ce qui ne nous disait rien. De plus, «GetSkewAngle» est un membre de «Probe», ce qui nous mène encore à d'autres informations.
Comme le héros Steve McQueen qui incarnait un prisonnier Allié dans un camp allemand nommé «Stalag Luft III», réussirons-nous à nous échapper des barbelés du C?
© Stefan Jetchick, 1er Septembre 1997.
Adorons Jésus-Eucharistie! | Accueil >> Varia >> Génie logiciel