Il est possible de créer ou modifier des GUID pour qu'ils soient facilement mémorisables bien que cela puisse affecter leur efficacité et leur unicité. Les règles pour générer des GUID et des UUID sont complexes mais assurent d'avoir des numéros uniques si elles sont suivies scrupuleusement.
Plusieurs GUID java commencent par « CAFEEFAC
».
Le terme de magic number peut également correspondre à l'utilisation de constantes numériques non-nommées dans le code source d'un programme. L'utilisation de ces constantes viole les anciennes règles de programmation issues de COBOL, de FORTRAN et de PL/1, ne rend pas plus claire le choix de cette valeur et provoque généralement des erreurs de programmation. Le nommage de tous les constantes rend le code plus lisible, plus compréhensible et plus facilement maintenable.
Le nom des constantes doit avoir un sens selon le contexte ; par exemple, il vaut mieux éviter les codes du genre SEIZE = 32
alors que NOMBRE_DE_BITS
aurait été plus clair.
Les problèmes avec ces magic number ne se limitent pas au constantes numériques ; le terme est également utilisé pour d'autres types de données, la déclaration des constantes étant plus flexible et porteuse de sens. Ainsi, déclarer const string testNomUtilisateur = "Jean"
est meilleur que d'utiliser le mot-clé "Jean
" de manière disséminée dans le programme ; de plus, cela simplifie la phase de tests.
Par exemple, le pseudo-code suivant permet de mélanger aléatoirement les valeurs d'un tableau représentant un jeu de 52 cartes :
for i from 1 to 52 j:= i + randomInt(53 - i) - 1 jeu.swapEntries(i, j)
où jeu
est un objet de type tableau, la fonction randomInt(x)
choisit un chiffre au hasard entre 1 et x compris et swapEntries(i, j)
échange la position des données placées en i et j dans le tableau. Dans cet exemple, 52
est un magic number. Il est plutôt conseillé d'écrire :
constant int nombreDeCarte:= 52 for i from 1 to nombreDeCarte j:= i + randomInt(nombreDeCarte + 1 - i) - 1 jeu.swapEntries(i, j)
Et ce pour plusieurs raisons :
nombreDeCarte
dans le second exemple est une opération très simple et ne nécessite la modification que d'une seule ligne.nombreDeCarte
en paramètre de la procédure :function melange(int nombreDeCarte ) for i from 1 to nombreDeCarte j:= i + randomInt(nombreDeCarte + 1 - i) - 1 jeu.swapEntries(i, j)
Il y a tout de même quelques défauts :
nombreDeCarte + 1
prend plus de temps que l'expression 53
. Néanmoins, la plupart des compilateurs et des l'interpréteurs modernes sont capables de comprendre que la variable nombreDeCarte
a été déclarée comme constante et de pré-calculer la valeur 53 dans le code compilé.Dans certains cas – dépendant des habitudes de codage –, l'utilisation de constantes numériques non-nommées est acceptée :
for (int i=0;i (en supposant que l'incrémentation i++
n'est pas supportée).
périmètre = rayon * Math.PI * 2
.bool estPair = (x%2==0)
, où %
est l' opérateur modulo.Les constantes 1 et 0 sont parfois utilisées pour représenter les valeurs booléennes « Vraie » et « Faux » dans les langages de programmation qui n'ont pas ce type (comme les anciennes versions de C).
En C/C++, 0 est parfois utilisé pour représenter un pointer ou référence null. Comme pour les valeurs booléens, les librairies de C standards contiennent des macro-définition de NULL
dont l'utilisation est fortement conseillée. D'autres langages proposent des valeurs null
ou nil
spécifiques.