Variations sur une constante imposée

Publié le par Peck

Vivez la suite en dierect http://linux-attitude.fr/post/Variations-sur-une-constante-imposee

Niveau
:
Résumé : const int UN=1

Qui n'a jamais entendu de son chef de projet : pas de constante sans nom dans le code c'est une règle !
Oui,  mais comme toute règle, elle a ses exceptions. Plutôt que de l'appliquer bêtement, réfléchissons au pourquoi du comment.

Les constantes constantes

Si vous utilisez le code suivant :
l = 6.2832 * r;
Alors vous êtes dans l'erreur. 6.2832 c'est 2*pi (environ). Vous utilisez une constante connue de tous, vous devez donc l'appeler par son nom. C'est une règle élémentaire de lisibilité.
Bon, celle-là vous la connaissiez. En plus n'oubliez pas que définir PI en constante dans votre code vous permettra le jour venu d'en changer la précision facilement.


Les constantes variables

Si vous utilisez quelque chose comme
char buffer[4096];
Alors là aussi vous êtes dans l'erreur. Non pas parce que définir la constante BUFFER_SIZE aidera à la lecture , mais parce que votre constante n'en est pas vraiment une. Même si vous êtes persuadés que structurellement dans votre algorithme cela représente quelque chose, rien ne dit que sur une autre planète, ou dans 1000 ans tout ceci aura changé (et 1000 ans se réduisent parfois à quelques jours).

D'autre part, si votre constante est calculée, alors cela peut éventuellement servir à la lisibilité :
char buffer[2 * PACKET_SIZE];

Les constantes structurelles

Si vous utilisez le code suivant :
dichotomy_width /= 2;
Alors vous êtes dans le droit chemin. Qui irait définir TWO=2 ? En effet vous êtes dans un cas où la structure même de l'algorithme impose ce 2. Il n'a de sens que par l'algorithme et imaginer un jour la trichotomie nécessiterait de repenser l'algorithme.


En résumé

  • Si la constante a déja un nom utilisez-le
  • Si la constante est une mesure trouvez-lui un nom
  • Si la constante est calculée, définissez les éléments du calcul
  • Si la constante n'a pas de nom évident et structure l'algorithme, laissez la tranquile.

En pratique, il reste rarement autre chose que les valeur -1,0,1,2 dans votre code.




Et enfin puisqu'on parle de la variabilité des constantes, en C, évitez les define pour celles-ci.
/* bof */
#define BUFFER_SIZE 4069

/* cool */
const int BUFFER_SIZE=4096;

Et ce pour plusieurs raisons :
  • Un define peut interagir salement avec votre code car ce n'est qu'une chaîne de caractères
  • Le type d'une variable est vérifié
  • Votre code est prêt pour le jour ou votre constante deviendra une vraie variable.
  • La perte en mémoire est vraiment minime (sauf si vous avez des millions de constantes) et pour ce qui est de la vitesse, votre compilateur est probablement meilleur que vous à l'optimisation.


Et n'oubliez pas, une constante n'est jamais qu'une variable qui n'a pas encore croisé votre boss.

Publié dans développement

Commenter cet article