Accueil🇫🇷Chercher

Nombre magique (programmation)

En programmation informatique, le terme magic number (en français « nombre magique ») peut désigner :

  • une constante numĂ©rique ou un ensemble de caractères utilisĂ© pour dĂ©signer un format de fichier ou un protocole[1] ;
  • une constante numĂ©rique non nommĂ©e ou mal documentĂ©e ;
  • un ensemble de valeurs ayant un sens particulier (par exemple, les GUID).

Indicateur de format

Origine

Ce type de magic number est apparu dans les premières versions du code source de la version 7 d'Unix. Bien qu'il ait perdu son sens originel, le terme a subsisté dans le lexique de l'informatique.

Quand Unix fut porté sur le premier DEC PDP-11/20s, celui-ci n'avait pas de mécanisme de protection de la mémoire et utilisait des références mémoires re-allouables (en)[2]. Ainsi, les versions avant la version 6 d'Unix lisent un fichier exécutable dans la mémoire en sautant à l'offset 0. Avec le développement de la pagination, les versions suivantes d'Unix ont vu le développement des headers précisant les composants d'un fichier exécutable. Une instruction de saut placée au début du header a été développée pour permettre d'exécuter le programme directement (sans lire le header) ; ce qui permet de choisir entre exécuter le programme en utilisant l'ancien mode utilisant des références mémoires réallouables (regular mode) ou en passant par la pagination. Avec le développement des formats d'exécutables, de nouvelles constantes de saut ont été ajoutées en incrémentant l'offset[3].

Dans le Lions' Commentary on UNIX 6th Edition, with Source Code (en) de la version 6 d'Unix, la fonction exec() lit l'image binaire d'un exĂ©cutable Ă  partir du système de fichiers. Les huit premiers octets forment le header qui contient la taille du programme (segment text) et les variables initialisĂ©es (segment global). Le premier mot de seize bits de ce header est comparĂ© Ă  deux constantes pour dĂ©terminer si l'exĂ©cutable utilise des rĂ©fĂ©rences mĂ©moires rĂ©allouables, le système de page en lecture seule rĂ©cemment dĂ©veloppĂ© ou des pages sĂ©parĂ©es pour les instructions et les donnĂ©es[4]. Dans les sixième et septième versions d'Unix, le double rĂ´le de cette constante du dĂ©but du header n'Ă©tait pas prĂ©cisĂ© mais le bit de poids fort de cette constant Ă©tait l'opcode de l'instruction de saut sur un PDP-11 (octal 000407 ou hex 0107). Si on ajoute sept au compteur de programme d'un programme exĂ©cutĂ©, celui-ci va utiliser le service exec() pour se lancer.

Le service exec() lit le header du fichier exécutable (méta) depuis un buffer de l'espace noyau mais l'image exécutable est lue dans l'espace utilisateur et donc sans pouvoir utiliser la constante de saut. Les magic number ont alors été implémentés dans l'éditeur de liens et le chargeur d'Unix ; ils ont dû être utilisés par la suite dans les programmes de test livrés avec les versions 6 et 7 d'Unix.

Dans la version 7, la constante n'est pas lue directement ; elle est d'abord assignĂ©e Ă  la variable ux_mag[5] et fut par la suite dĂ©signĂ©e par l'expression magic number. Sachant qu'il y avait alors dans cet Unix environ 10 000 lignes de code et beaucoup de constantes utilisĂ©es, ce nom est plutĂ´t curieux pour une constante, au moins autant que le commentaire[2] laissĂ© dans la partie concernant le changement de contexte de la version 6 du gestionnaire d'applications d'Unix. C'est probablement pour cela que le terme a ensuite dĂ©signĂ© le type d'exĂ©cutable, puis Ă©tendu aux systèmes de fichiers et Ă©tendu encore pour dĂ©signer un exĂ©cutable utilisant un typage fort.

Dans les données

Plusieurs de ces nombres sont issus d'un typage fort des données ou de leur multiplexage. Ils permettent aux programmes traitant l'information d'identifier les données qui suivent et notamment de distinguer le format de données utilisé.

Exemples

  • Les fichiers et flux Unicode peuvent commencer par un indicateur d'ordre des octets (BOM) pour indiquer que commence un texte, en prĂ©cisant le type d'UTF utilisĂ© et l'ordre Ă©ventuel des octets.
  • Les fichiers binaires .class de Java commencent toujours par CAFEBABE. DĂ©compressĂ© avec Pack200 (en), le code se transforme en CAFED00D. Note: Babe est une expression familière en anglais pour dĂ©signĂ©e une fille (PoupĂ©e) et D00D en Leet speak correspond au mot anglais Dude qui peut se traduire par Mec.
  • Les images gif utilisent le code ASCII GIF89a (47 49 46 38 39 61) ou GIF87a (47 49 46 38 37 61).
  • Les images JPEG commencent par FF D8 et finissent par FF D9. Les images JPEG/JFIF contiennent le code ASCII pour JFIF (4A 46 49 46) et se terminent par une chaĂ®ne de caractères vide. Les images JPEG/Exif contiennent le code ASCII pour Exif (45 78 69 66) et se terminent aussi par une chaĂ®ne nulle suivie d'autres mĂ©tadonnĂ©es.
  • Les images png commencent par une signature de huit octets : \211 P N G \r \n \032 \n(89 50 4E 47 0D 0A 1A 0A). Cette signature permet la dĂ©tection de problèmes de transmission : vu qu'elle contient des sauts de ligne (« \n »), cela permet de dĂ©tecter par exemple les sauts de fin de ligne ajoutĂ©s automatiquement lors d'un transfert en mode ASCII par ftp (au lieu d'utiliser le mode binaire).
  • Les fichiers MIDI standards commencent par MThd (4D 54 68 64) suivi d'autres mĂ©tadonnĂ©es.
  • Les scripts Unix commencent toujours par un shebang « #! » (23 21) suivi par l'adresse de l'interprĂ©teur de commandes Ă  exĂ©cuter.
  • Les fichiers et le programme PostScript commencent par « %! » (25 21).
  • Les anciens exĂ©cutables .exe de DOS et les nouveaux portable executable de Microsoft Windows commencent par la chaĂ®ne MZ (4D 5A) ; ce sont les initiales du concepteur de ces formats, Mark Zbikowski (en). Le code ZM (5A 4D) est aussi possible mais il est plus rare.
  • Dans le système de fichiers UFS, les donnĂ©es des superblocks (en) sont repĂ©rĂ©es par les codes 19 54 01 19 ou 01 19 54 selon la version utilisĂ©e. Tous deux correspondent Ă  la date de naissance de leur concepteur, Marshall Kirk McKusick.
  • Le Master boot record des pĂ©riphĂ©riques amorçables de toutes les machines IA-32 Compatible PC finit par AA 55.
  • Les exĂ©cutables pour consoles portables Game Boy et Game Boy Advance commencent par une sĂ©quence de 48 et respectivement 156 octets qui correspond Ă  l'encodage bitmap du logo de Nintendo.
  • Les archives zip commencent par « PK » (50 4B), les initiales de Phil Katz qui est l'auteur de l'utilitaire de compression DOS PKZIP.
  • Les exĂ©cutables pour Amiga (les Amiga Hunk (en)) exĂ©cutables sur Amiga classic 68000 commencent par la chaĂ®ne hexadĂ©cimale « $000003f3 » surnommĂ©e « Magic cookie ».
  • Les premières versions de l'Ă©cran noir de la mort des Amiga – appelĂ©s aussi Guru Meditation qui surviennent lors d'une erreur non identifiable – affichent le code 48454C50 qui correspond en ASCII Ă  « HELP » (48=H, 45=E, 4C=L, 50=P).
  • La seule adresse absolue d'un système Amiga est $0000 0004 (emplacement adresse 4) qui contient le système d'amorçage « Sysbase », un pointeur vers exec.library, le noyau du système.
  • Les exĂ©cutables PowerPC PEF (en) utilisĂ©s sur Mac OS et BeOS commencent par la chaĂ®ne ASCII de « Joy! » : 4A 6F 79 21.
  • Les images TIFF commencent par II ou MM suivi par « 42 » (2A en hexadĂ©cimale) – en rĂ©fĂ©rence au livre de Douglas Adams La grande question sur la vie, l'univers et le reste – comme entier encodĂ© sur deux octets en petit ou en gros-boutiste selon le type de processeur. « II » est utilisĂ© sur Intel (petit-boutiste) ce qui donne le code 49 49 2A 00. « MM » est utilisĂ© sur Motorola (gros-boutiste) : 4D 4D 00 2A.
  • Les fichiers textes Unicode encodĂ©s en UTF-16 commencent gĂ©nĂ©ralement par un indicateur d'ordre des octets pour dĂ©tecter l'endianness (FE FF pour les big-endian et FF FE pour les little-endian). Les fichiers UTF-8 commencent le plus souvent par EF BB BF.
  • Les bytecodes pour LLVM commencent par BC (42 43).
  • Les fichiers wad, utilisĂ©s par les jeux basĂ©s sur le moteur id Tech 2, commencent par WAD2 (Quake et dĂ©rivĂ©s) ou WAD3 (Quake II et dĂ©rivĂ©s).

DĂ©tection

Sous unix, la commande file permet de repérer le format d'un fichier à partir d'une signature[6]. Il existe plusieurs projets tentant de les énumérer[7] - [8].

Dans les protocoles

  • Le protocole OSCAR utilisĂ© par AIM/ICQ prĂ©fixe les requĂŞtes par 2A.
  • Dans le protocole RFB utilisĂ© par VNC, le programme client commence par envoyer RFB (52 46 42) suivi par le numĂ©ro de version du protocole utilisĂ© par le client.
  • Dans le protocole SMB utilisĂ© par Windows, chaque requĂŞte et chaque rĂ©ponse du serveur commencent par FF 53 4D 42, c'est-Ă -dire en convertissant l'hexadĂ©cimal en ASCII : \xFFSMB.
  • Dans le protocole MSRPC (en) de Windows, chaque requĂŞte TCP commence par 05 pour « Microsoft DCE/RPC Version 5 », suivi par 00 ou 01 pour le numĂ©ro de version mineur. Les requĂŞtes UDP commencent toujours par 04.
  • Les interfaces COM et DCOM sĂ©rialisĂ©es comme OBJREF (en) commencent toujours par « MEOW » (4D 45 4F 57). Les extensions de dĂ©bogage utilisĂ©es par DCOM commencent par « MARB » (4D 41 52 42).
  • Une requĂŞte non chiffrĂ©e d'un tracker BitTorrent commence par 13 (qui reprĂ©sente la longueur de l'entĂŞte), suivi par la phrase « BitTorrent protocol ».
  • Les paquets eDonkey2000 et eMule ne faisant qu'un octet contiennent la version du client utilisĂ©e : Ă  l'heure actuelle E3 reprĂ©sente un client eDonkey, C5 un client eMule et D4 un client eMule utilisant la compression.
  • Les transactions SSL commencent toujours par le message « client hello ». Le schĂ©ma d'encapsulation des paquets SSL rĂ©serve deux ou trois octets pour l'entĂŞte. GĂ©nĂ©ralement, un « client hello » d'un client SSL version 2 commence par 80 et la rĂ©ponse d'un serveur version 3 Ă  un client commence par 16 (mais cela peut varier).
  • Les paquets DHCP utilisent un magic cookie 63 82 53 63 au dĂ©but de la section option de tous les paquets. Ce nombre magique correspond Ă  la sĂ©quence ASCII « ?R5? » (en traitant les valeurs hexadĂ©cimales comme des valeurs dĂ©cimales), est dĂ©fini dans la rĂ©vision 5 du protocole BOOTP prĂ©curseur du DHCP.

Constantes numériques non nommées

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/I[9], ne rend pas plus clair le choix de cette valeur[10] et provoque généralement des erreurs de programmation. Selon certains, le nommage de toutes les constantes rend le code plus lisible, plus compréhensible et plus facilement maintenable[11].

Le nom des constantes doit avoir un sens selon le contexte ; par exemple, il vaut mieux éviter les codes du genre SEIZE = 16 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[9]. 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 nombre 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 nombreDeCartes := 52
  for i from 1 to nombreDeCartes
     j := i + randomInt(nombreDeCartes + 1 - i) - 1
     jeu.swapEntries(i, j)

Et ce pour plusieurs raisons :

  • Le second exemple est plus facile Ă  lire et Ă  comprendre. Un dĂ©veloppeur lisant pour le premier exemple va se demander « Pourquoi 52 ? » bien qu'il serait certainement capable de comprendre en lisant attentivement l'ensemble du code. Les magic number deviennent dĂ©routants lorsque la mĂŞme valeur est utilisĂ©e pour dĂ©signer des choses complètement diffĂ©rentes dans une mĂŞme partie de code.
  • Il est plus simple de modifier la valeur de la constante car celle-ci n'est pas dupliquĂ©e. Changer la valeur d'un magic number est source d'erreur car la mĂŞme valeur est très souvent utilisĂ©e Ă  plusieurs endroits dans le programme. Il se peut Ă©galement que deux variables aux significations diffĂ©rentes aient la mĂŞme valeur ; cela pose un problème pour les diffĂ©rencier. Pour adapter le premier exemple Ă  un jeu de tarot de 78 cartes, le dĂ©veloppeur pourrait naĂŻvement remplacer toutes les occurrences de 52 par 78. Cela pourrait causer deux problèmes : premièrement, la valeur 53 de la seconde ligne de l'exemple ne sera pas modifiĂ©e et amènerait le programme Ă  ne traiter qu'une partie du jeu de cartes ; deuxièmement, il se peut qu'il remplace la chaĂ®ne "52" dans tout le programme sans prĂŞter attention Ă  ce qu'elle signifie ce qui introduirait très certainement des bugs. Par comparaison, changer la valeur de nombreDeCartes dans le second exemple est une opĂ©ration très simple et ne nĂ©cessite la modification que d'une seule ligne.
  • La dĂ©claration des variables remplaçant les magic number sont placĂ©es au dĂ©but des fonctions ou fichiers pour faciliter leur recherche et leur modification.
  • L'introduction de paramètres est plus facile. Par exemple, pour gĂ©nĂ©raliser l'exemple et faire qu'il puisse mĂ©langer n'importe quel tas de cartes, il faudrait passer nombreDeCartes en paramètre de la procĂ©dure :
  function melange(int nombreDeCartes )
     for i from 1 to nombreDeCartes 
        j := i + randomInt(nombreDeCartes + 1 - i) - 1
        jeu.swapEntries(i, j)
  • Il est plus facile de dĂ©tecter les coquilles car une variable dĂ©clarĂ©e est vĂ©rifiĂ©e par le compilateur. Par exemple, saisir "62" au lieu de "52" ne sera pas dĂ©tectĂ© alors que « nombreDeCates » au lieu de « nombreDeCartes » lèvera un warning (ou une erreur) du compilateur informant que « nombreDeCates » n'est pas dĂ©fini.
  • Cela permet Ă©galement de minimiser les saisies au clavier dans les IDE permettant le complètement automatique : il suffit de saisir les premières lettres de la variable pour que l'IDE le complète automatiquement.

Il y a tout de même quelques défauts :

  • L'exĂ©cution de l'expression nombreDeCartes + 1 prend plus de temps que l'expression 53. NĂ©anmoins, la plupart des compilateurs et des interprĂ©teurs modernes sont capables de comprendre que la variable nombreDeCartes a Ă©tĂ© dĂ©clarĂ©e comme constante et de prĂ©-calculer la valeur 53 dans le code compilĂ©.
  • L'utilisation de grands noms de variables allonge les lignes de code, obligeant certaines lignes de code Ă  s'Ă©taler sur plusieurs lignes.
  • Le dĂ©bogage peut ĂŞtre plus difficile si le dĂ©bogueur ne fait pas la correspondance entre les noms de variable et leur valeur.

Usages acceptés comme constantes numériques non nommées

Dans certains cas – dépendant des habitudes de codage –, l'utilisation de constantes numériques non nommées est acceptée :

  • l'utilisation du 0 ou du 1 comme valeur initiale ou valeur d'incrĂ©mentation dans les boucle for : for (int i=0;i<max;i=i+1) (en supposant que l'incrĂ©mentation i++ n'est pas supportĂ©e) ;
  • l'utilisation de 2 dans les expressions mathĂ©matiques : pĂ©rimètre = rayon * Math.PI * 2 ;
  • l'utilisation de 2 pour vĂ©rifier qu'un nombre est pair ou impair : 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 « Vrai » 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 pointeur ou référence null. Comme pour les valeurs booléens, les bibliothèques 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.

Magics GUIDs

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é[12]. 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 ».

Nombre magique de débogage

Certains « nombres magiques » consistent en une valeur particulière qui est inscrite dans la mémoire vive pendant l'allocation de mémoire pour faciliter le débogage en cas de plantage. Pendant le débogage, le contenu de la mémoire est généralement affiché en hexadécimal. Des valeurs judicieusement choisies pour former des séquences répétitives de lettres hexadécimales, ou des mots en Hexspeak, sont plus facilement identifiables par un opérateur humain.

L'utilisation de valeurs impaires est particulièrement utile sur des processeurs incapables d'adresser la mémoire au niveau de l'octet, car ceux-ci planteront s'ils essaient s'en servir comme pointeur. De même, on préférera les valeurs qui ne font pas partie du jeu d'instructions.

Vu qu'il est rare qu'un entier codé sur 32 bit prenne une valeur aussi particulière, l'apparition d'un de ces nombres dans un débogueur ou dans un core dump indique généralement un dépassement de tampon ou une variable non initialisée.

Valeurs classiques
CodeDescription
..FACADEUtilisé par beaucoup de systèmes d'exploitation temps réel
8BADF00DUtilisé par Apple comme code d'exception dans l'iPhone quand une application a pris trop de temps pour se lancer ou se terminer
A5A5A5A5Utilisé sur les systèmes embarqués car la séquence binaire correspondante (10100101) est facilement reconnaissable sur un oscilloscope ou un analyseur logique
ABABABABUtilisé par la fonction HeapAlloc() de Microsoft pour marquer le « no man's land » d'un Guard byte (en) après l'allocation de la mémoire heap
ABADBABEUtilisé par Apple comme « Boot Zero Block »
ABADCAFEValeur d'initialisation utilisée pour démasquer les pointeurs brisés
BAADF00DUtilisé par la fonction LocalAlloc(LMEM_FIXED) de Microsoft pour marquer la mémoire heap allouée mais non initialisée
BADBADBADBADUtilisé sur les calculateurs de Burroughs Corporation pour repérer la mémoire non initialisée (mot de 48-bit)
BADC0FFEE0DDF00DUtilisé sur le système 64 bits RS/6000 pour indiquer les registres processeurs non initialisés
BADCAB1ECode d'erreur retourné par le débogueur eVC quand la connexion avec le débogueur est coupée
BADDCAFESous Solaris, marque la mémoire du noyau qui n'est pas initialisée (KMEM_UNINITIALIZED_PATTERN)
BEEFCACEUtilisé sur le framework .NET comme nombre magique pour les fichiers de ressources.
C0DEDBADUtilisé pour le débogage des tables MMU.
CAFEBABEDans les exécutables Mach-O (Fat binary (en) dans les processeurs 68k et les PowerPC) pour identifier les fichiers objet et les .class java
CAFEFEEDSous Solaris, marque la mémoire allouée par la fonction kmemfree() pour le débogage
CCCCCCCCUtilisé par la libraire de débogage du C++ de Microsoft pour repérer la mémoire stack non initialisée
CDCDCDCDUtilisé par la libraire de débogage du C++ de Microsoft pour repérer la mémoire heap non initialisée
CEFAEDFEPeut-ĂŞtre vu dans les binaires Mach-O de Mac OS X (voir FEEDFACE)
DDDDDDDDUtilisé par MicroQuill's SmartHeap et le débogueur mémoire C++ de Microsoft pour marquer la mémoire heap libérée
DEADBABEMarque le début des fichiers arena d'IRIX
DEADBEEFConnu pour être utilisé sur les systèmes IBM (notamment sur RS/6000), le premier Mac OS (OPENSTEP) et sur le Commodore Amiga. Sous Solaris, marque la mémoire du noyau libérée (KMEM_FREE_PATTERN)
DEADDEADLe code d'erreur STOP de Windows utilisé quand l'utilisateur crash volontairement la machine
DEADF00DMarque toutes les nouvelles zones mémoires allouées quand elles n'ont pas été explicitement nettoyées après une corruption
DEADFA11Utilisé par Apple comme code d'exception dans l'iPhone quand l'utilisateur a forcé une application à s'éteindre
EBEBEBEBPour MicroQuill's SmartHeap
FADEDEADMarque la fin des scripts AppleScript
FDFDFDFDUtilisé par le débogueur mémoire C++ de Microsoft pour marquer le « no man's land » d'un Guard byte (en) avant et après la mémoire heap allouée
FEE1DEADUtilisé par l'appel système reboot() de Linux
FEEDFACEPeut ĂŞtre vu sur le binaire PowerPC Mach-O de Mac OS X. Sous Solaris, marque la zone rouge (KMEM_REDZONE_PATTERN)
FEEEFEEEUtilisé par la fonction HeapFree() de Microsoft pour marquer la mémoire heap libérée

La plupart de ces valeurs ont une taille de 32 bits : la taille d'un mot sur les processeurs 32 bits.

L'usage répandu de telles valeurs dans les technologies de Microsoft n'est pas qu'une simple coïncidence, car ces dernières sont largement commentées dans le livre de Steve Maguire (en) Writing Solid Code (en), chez Microsoft Press (en). Il donne plusieurs critères pour les choisir :

Comme elles sont souvent utilisées pour identifier des zones mémoires censées être vides, elles tendent parfois à être utilisées dans le langage courant dans le sens « perdu, abandonné, vidé de la mémoire » : par exemple, « Ton programme est DEADBEEF »[13].

Le langage de programmation ZUG de Pietr Brandehörst initialisait la mémoire avec les valeurs 0000, DEAD ou FFFF en phase de développement, et à 0000 en phase de production, pour que les variables non initialisées restent détectables par les développeurs mais compromettent le moins possible la stabilité du programme en production.

Notes et références

  1. (en) The Linux Information Project, « Magic Number Definition », (consulté le )
  2. Odd Comments and Strange Doings in Unix (en) « http://cm.bell-labs.com/cm/cs/who/dmr/odd.html »(Archive.org • Wikiwix • Archive.is • Google • Que faire ?) (consulté le ).
  3. Personal communication with Dennis M. Ritchie
  4. Version six system1 source file
  5. Version seven system1 source file
  6. (en) Gary C. Kessler, « Linux Magic Numbers » (consulté le )
  7. (en) Richard Ogley, « File magic numbers », (consulté le )
  8. Gary C. Kessler, « File signatures Table », (consulté le )
  9. (en) Robert C Martin, Clean Code : A handbook of agile software craftsmanship, Boston, Prentice Hall, , 300 p. (ISBN 978-0-13-235088-4 et 0-13-235088-2, OCLC 223933035), Chapitre 17 : Smells and Heuristics - G25 Replace Magic Numbers with Named Constants
  10. (en) Robert C Martin, Clean Code : A handbook of agile software craftsmanship, Boston, Prentice Hall, , 300 p. (ISBN 978-0-13-235088-4 et 0-13-235088-2, OCLC 223933035), Chapitre 17 : Smells and Heuristics - G16 Obscured Intent
  11. (en) Jeff Vogel, « Six ways to write more comprehensible code », (consulté le )
  12. (en) Joseph M. Newcomer, « Message Management - Guaranteeing uniqueness », (consulté le )
  13. NdT : notamment en anglais ; ici, si la constante AVARIE (avarié) existait en hexadécimal, l'exemple donnerait : « Ton programme est AVARIE ».

Annexes

Articles connexes

  • NaN (Not a Number), une catĂ©gorie de nombres magiques
  • Hexspeak

Lien externe

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.