Les nombres magiques

Julien on avr 10th 2008

Le code suivant est familier? rien de vous choque?

  1. persistAtIteration = 25000/iterationDurationInMilliseconds;

Si oui, vous êtes en flagrant délit d'utilisation d'un "nombre magique" :), c'est à dire un nombre sorti de nulle part sans aucune explication. Dans le cas ci-dessus, le but de la ligne de code est apparemment de savoir à quelle itération le programme doit réaliser une opération de persistance. Le code est simple et les 2 variables ont des noms plutôt expressifs. Mais la ligne contient aussi le nombre "25000" qui:
- Ne véhicule aucun sens.
- Ne peut pas être réutilisé à travers la classe
- Ne peux pas être modifié simplement (il est "masqué" au milieu du code et à moins de connaitre la valeur exacte, on ne peut pas la chercher simplement)

Modifions légèrement le code par le suivant:

  1. persistAtIteration = persistEachMilliseconds/iterationDurationInMilliseconds;

Désormais, la signification de la ligne est devenu évidente. persistEachMilliseconds indique que l'on veut faire l'opération de persistance toutes les X millisecondes. On le divise par la durée de l'itération pour savoir a quelle itération l'opération doit être réalisée. Le code est devenu bien plus clair!

A noter également que l'utilisation des nombres 0, 1 et -1 est toléré sans qu'il y ait besoin de passer par une variable intermédiaire. C'est notamment vrai pour les boucles for par exemple. Cela peut aussi être le cas d'autres nombres comme dans l'expression suivante qui test si i est un nombre pair: if(i % 2 == 0). C'est donc au programmeur de faire la part des choses.

La littérature sur les nombres magique est très vaste et le sujet a été couvert des centaines de fois. Il n'y clairement a rien de nouveau! Pourtant, chaque projet contient sont lot de nombres magiques, d'où l'écriture de ce billet!

Remarque:
Lorsque vous exprimez des durées, je vous conseille de systématiquement ajouter l'unité au nom de la variable. Soit xxxInSeconds, xxxInMinutes, xxxInDays, etc. Sans cela, il sera nécessaire de vérifier où la variable est utilisé pour savoir quelle est l'unité requise.

Filed in Qualité du code | No responses yet

Trackback URI | Comments RSS

Leave a reply