Question

Quand les gens parlent de l'utilisation des « numéros magiques » dans la programmation informatique, que signifient-ils?

Était-ce utile?

La solution

Les nombres magiques sont tout numéro dans votre code qui est pas immédiatement évident à quelqu'un avec très peu de connaissances.

Par exemple, le morceau de code suivant:

sz = sz + 729;

a un numéro de magie et serait beaucoup mieux écrit:

sz = sz + CAPACITY_INCREMENT;

Certains extrême considère l'état que vous ne devriez jamais avoir des numéros dans votre code, sauf -1, 0 et 1, mais je préfère une vue un peu moins dogmatique que je reconnaîtrais instantanément 24, 1440, 86400, 3,1415, 2,71828 et 1,414 - il tout dépend de vos connaissances.

Cependant, même si je sais il y a 1440 minutes dans une journée, je serais probablement toujours utiliser un identifiant de MINS_PER_DAY car il rend leur recherche beaucoup plus facile. A qui pour dire que l'augmentation des capacités mentionnées ci-dessus ne serait pas aussi 1440 et vous finissez par changer la valeur erronée? Cela est particulièrement vrai pour les petits nombres. Le risque de double usage de 37197 est relativement faible, la possibilité d'utiliser 5 pour de multiples choses est assez élevé

L'utilisation d'un moyen d'identification que vous n'auriez pas à passer par tous vos 700 fichiers source et changement 729 à 730 lorsque l'augmentation de la capacité a changé. Vous pouvez simplement changer une ligne:

#define CAPACITY_INCREMENT 729

à:

#define CAPACITY_INCREMENT 730

et recompiler le lot.


contraste avec les constantes magiques qui sont le résultat des gens naïfs qui pensent que juste parce qu'ils retirent les chiffres réels de leur code, ils peuvent changer:

x = x + 4;

à:

#define FOUR 4
x = x + FOUR;

Cela ajoute absolument zéro des informations supplémentaires à votre code et est une perte de temps.

Autres conseils

« nombres magiques » sont des nombres qui apparaissent dans des déclarations comme

if days == 365

En supposant que vous ne saviez pas qu'il y avait 365 jours par an, vous pouvez trouver ce sens déclaration. Ainsi, il est une bonne pratique d'attribuer tous les nombres « magiques » (numéros qui ont une sorte d'importance dans votre programme) à une constante,

DAYS_IN_A_YEAR = 365

Et à partir de là, comparer qu'au lieu. Il est plus facile à lire, et si la terre obtient jamais frappé hors de l'alignement, et nous gagnons un jour de plus ... vous pouvez facilement le changer (d'autres chiffres pourraient être plus susceptibles de changement).

Il y a plus d'un sens. Celle donnée par la plupart des réponses déjà (un numéro sans nom arbitraire) est très commun, et la seule chose que je vais dire à ce sujet est que certaines personnes vont à l'extrême de la définition ...

#define ZERO 0
#define ONE 1

Si vous faites cela, je vais vous traquer et sans pitié.

Un autre type de nombre magique, cependant, est utilisé dans des formats de fichiers. Il est juste une valeur comprise comme généralement la première chose dans le fichier qui permet d'identifier le format de fichier, la version du format de fichier et / ou le endian-ness du fichier particulier.

Par exemple, vous pourriez avoir un numéro de magie de 0x12345678. Si vous voyez ce numéro magique, il est juste un pense que vous voyez un fichier de format correct. Si vous voyez, d'autre part, 0x78563412, il est une estimation de juste que vous voyez une version troqué endian du même format de fichier.

Le terme « nombre magique » obtient abusé un peu, cependant, se référant à presque tout ce qui identifie un format de fichier -. Y compris les chaînes ASCII assez longues dans l'en-tête

http://en.wikipedia.org/wiki/File_format#Magic_number

Wikipedia est votre ami ( article de Magic Number)

La plupart des réponses à ce jour ont décrit un nombre magique comme une constante qui n'est pas auto décris. Être un peu d'un programmeur « old-school » moi-même, dans la journée, nous avons décrit les nombres magiques comme étant une constante qui est assignée un but spécial qui influence le comportement du code. Par exemple, le numéro 999999 ou MAX_INT ou quelque chose d'autre tout à fait arbitraire.

Le gros problème avec les numéros de magie est que leur but peut facilement oublier, ou la valeur utilisée dans un autre contexte tout à fait raisonnable.

En brut et par exemple terriblement artificiel:

while (int i != 99999)
{
  DoSomeCleverCalculationBasedOnTheValueOf(i);      

  if (escapeConditionReached)
  {
    i = 99999;
  }
}

Le fait qu'une constante est utilisée ou non nommée est pas vraiment la question. Dans le cas de mon exemple terrible, le comportement influe sur la valeur, mais si nous devons changer la valeur de « i » en boucle?

Il est clair que dans l'exemple ci-dessus, vous n'avez pas besoin d'un numéro magique pour sortir de la boucle. Vous pouvez le remplacer par une déclaration de rupture, et qui est la vraie question avec des nombres magiques, qu'ils sont une approche paresseux pour le codage, et sans Fail peut toujours être remplacé par quelque chose de moins sujettes à une ou l'autre échec, ou de perdre un sens au fil du temps.

Tout ce qui n'a pas de sens évident à tout le monde, mais l'application elle-même.

if (foo == 3) {
    // do something
} else if (foo == 4) {
    // delete all users
}

Les nombres magiques sont une valeur particulière de certaines variables qui provoque le programme à se comporter d'une manière particulière.

Par exemple, une bibliothèque de communication peut prendre un paramètre Délai d'attente et il peut définir le nombre magique « -1 » pour indiquer délai infini.

Le terme de nombre magique est généralement utilisé pour décrire une constante numérique dans le code. Le numéro apparaît sans aucune description supplémentaire et donc son sens ésotérique.

L'utilisation des nombres magiques peut être évité en utilisant des constantes nommées.

Utilisation des nombres dans les calculs autres que 0 ou 1 qui ne sont pas définis par un identifiant ou variable (ce qui rend non seulement le nombre facile à changer dans plusieurs endroits en le changeant en un seul endroit, mais aussi clairement au lecteur ce que le nombre est pour).

simple et mots vrais, un chiffre magique est un nombre à trois chiffres, dont la somme des carrés des deux premiers chiffres est égale à la troisième. Ex-202, comme, 2 * 2 + 0 * 0 = 2 * 2. Maintenant, WAP en java pour accepter un entier et imprimer si est un nombre magique ou non.

Il peut sembler banal de peu, mais il y a au moins un vrai nombre magique dans toutes les langues de programmation.

0

je soutiens que c'est la baguette magique pour les gouverner tous dans pratiquement carquois de tous les programmeurs de baguettes magiques.

FALSE est inévitablement 0 TRUE n'est pas (FAUX), mais pas nécessairement 1! Peut-être -1 (0xFFFF)

NULL est inévitablement 0 (le curseur) Et la plupart des compilateurs lui permettent à moins que leur typage est tout à fait enragé.

0 est l'indice de base d'éléments de réseau, sauf dans les langues qui sont si archaïque que l'indice de base est « 1 ». On peut alors le code pratique pour (i = 0; i <32; i ++) et attendre à ce que 'i' commencera à la base (0) et l'incrément, et arrêt à 32-1 ... le 32e membre un tableau, ou autre.

0 est la fin de nombreuses chaînes de langage de programmation. La valeur « arrêt ici ».
0 est également construit dans les instructions X86 à «chaînes de se déplacer efficacement. Enregistre plusieurs microsecondes.

0 est souvent utilisé par les programmeurs pour indiquer que « rien a mal tourné » dans l'exécution d'une routine. Il est la valeur de code "non-an-exception". On peut l'utiliser pour indiquer l'absence d'exceptions lancées.

Zero est la réponse la plus souvent donnée par les programmeurs pour la quantité de travail qu'il faudrait faire quelque chose de complètement trivial, comme le changement de la couleur de la cellule active au violet au lieu de rose vif. "Zéro, l'homme, tout comme zéro!"

0 est le nombre de bugs dans un programme que nous aspirons à atteindre. 0 exceptions, 0 portés disparus boucles, 0 non terminées les voies de récursion qui ne peuvent être réellement prises. 0 est l'asymptote que nous essayons de réaliser dans la programmation du travail, la petite amie (ou petit ami) « questions », les expériences restaurant moche et idiosyncrasies général d'un de la voiture.

Oui, 0 est un nombre magique en effet. FAR plus magique que toute autre valeur. Rien ... ahem, est proche.

rlynch@datalyser.com

scroll top