Question

Prenez le code suivant dans C / C ++, par exemple:

int foo[] = {0, 0, 0, 0};

Aucun numéro de magie, non?
Maintenant, le « équivalent » Python de ce serait:

foo = [0, 0, 0, 0]

Toujours pas de nombres magiques.
Cependant, en Python, cette même chose peut être écrit comme ceci:

foo = [0] * 4

Et maintenant, nous avons un nombre magique. Ou avons-nous?
Je devine que cela et d'autres choses semblables sont présentes sur ces et d'autres langues.

Était-ce utile?

La solution

Non chaque numéro est une constante magique . La raison 4 et les quatre 0 sont des nombres magiques (dans toutes les langues) est qu'il est tout à fait clair pourquoi ce nombre est 4 et non un autre numéro.

Par exemple, dans le cadre d'un jeu qui se joue avec le dé à six faces bien connu

def roll_die():
    return random.randint(1,6)

ce code n'a pas de numéros de magie, car il est très facile de voir où les chiffres venaient.

D'autre part, il peut être difficile de deviner quel nombre d'autres programmeurs savent. Par exemple, tout le monde peut connaître le nombre de cartes dans un jeu, il est plus logique d'utiliser une constante nommée il.

Cela dépend entièrement du contexte si un nombre est « magique » ou non, cela n'a rien à voir avec la langue. En cas de doute, le nom de vos constantes juste pour être du bon côté.

Autres conseils

Comment est-ce différent de (en C ou C ++):

int foo[4] = {0};

La taille du tableau est un nombre magique dans tous ces cas.

Les nombres magiques, par la façon dont je les comprends, sont des valeurs de domaine (utilisées dans le calcul, les index dans les éléments cartographiques). L'idée d'eux est cohérente dans toutes les langues. Dans votre exemple, cela dépend de ce que ces tableaux sont pour.

Voir ci-dessous le code. Il est une caractéristique de la langue c.

  int arr[] = { [0 ... 4]=3,[7]=7,[8 ... 12]=12,[15]=0};

est le même que

int arr [] = {3, 3, 3, 3, 3, 0, 0, 7, 12, 12, 12, 12, 12, 0, 0, 0};

Toutes vos question montre que le concept de « nombres magiques » et les règles contre l'utilisation de « numéros magiques » dans votre programme sont complètement et totalement idiot. Règles contre les nombres magiques sont des approximations pauvres, par des gens qui ne comprennent pas ce qu'ils font, d'une règle beaucoup de Saner contre coder en dur en plusieurs endroits des valeurs qui doivent se mettre d'accord ou qui dépendent les uns des autres. ce code est tout à fait raisonnable, par exemple, tant que la longueur de la mémoire tampon n'a pas besoin de correspondre à quelque chose d'autre dans le programme ou dans le monde réel:

char buf[100];
snprintf(buf, sizeof buf, ...);

Mais ce code est très mauvais:

char buf[100];
snprintf(buf, 100, ...);

Bien sûr, dans le monde réel, il probablement est quelque chose que vous voulez que la taille du tampon pour correspondre, par exemple le nombre maximum de chiffres nécessaires pour imprimer un nombre entier d'une certaine taille particulière. Dans ce cas, vous voudrez peut-être quelque chose comme:

char buf[3*sizeof(int)+3];
snprintf(buf, sizeof buf, ...);

Et si l'on considère CHAR_BIT à être variable, alors vous pourriez vouloir remplacer par une formule 3 en termes de CHAR_BIT. Dans tous les cas, les constantes apparaissant dans l'expression ne sont pas « nombres magiques de mal ».

Dans votre exemple, si la dimension du tableau dépend d'une autre variable, les trois définitions de tableau sont mauvaises pratiques. Mais si la dimension 4 est indispensable pour ce que vous faites, je ne vois rien de mal avec elle.

Bien sûr, ce que vous faites peut parfois changer au cours de la durée de vie du code, mais est ce que la documentation est pour. Code ne peut pas être prévu pour gérer toujours possible futur changement d'objectif sans un certain niveau de modification, et aussi longtemps que vous documenté ce que son objectif initial et les contrats sont, il ne devrait pas être difficile pour quelqu'un de changer ceux pour trouver les parties du code qui ont besoin de changer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top