Qu'est-ce qu'un nombre magique?
Pourquoi devrait-il être évité?
Y a-t-il des cas où c'est approprié?
Qu'est-ce qu'un nombre magique?
Pourquoi devrait-il être évité?
Y a-t-il des cas où c'est approprié?
Un nombre magique est une conséquence directe de l'utilisation d'un nombre dans le code.
public class Foo {
public void setPassword(String password) {
// don't do this
if (password.length() > 7) {
throw new InvalidArgumentException("password");
}
}
}
Cela devrait être refait:
public class Foo {
public static final int MAX_PASSWORD_SIZE = 7;
public void setPassword(String password) {
if (password.length() > MAX_PASSWORD_SIZE) {
throw new InvalidArgumentException("password");
}
}
}
Il améliore la lisibilité du code, et il est plus facile à maintenir. Imaginez le cas où j'ai mis la taille du champ de mot de passe dans l'interface graphique. Si j'utilise un nombre magique, à chaque fois que la taille max des modifications, j'ai du modifier dans le code deux endroits. Si j'en oublie un, cela va conduire à des incohérences.
Le JDK est plein d'exemples comme en Entier, le Caractère et les classes de Mathématiques.
PS.: Les outils d'analyse statique comme FindBugs et PMD détecte l'utilisation de numéros de magie dans votre code et suggère que le refactoring.
Un Nombre Magique est une valeur codée en dur qui peut changer à un stade ultérieur, mais qui peut être, par conséquent, difficile à mettre à jour.
Par exemple, disons que vous avez une Page qui affiche les 50 dernières Commandes "Vos Commandes" Page d'Aperçu. 50 est le Nombre Magique ici, parce que ce n'est pas définie par la norme ou de la convention, c'est un numéro que vous avez composé pour des raisons décrites dans la spécification.
Maintenant, ce que vous faites est que vous avez le 50 en différents endroits de votre script SQL (SELECT TOP 50 * FROM orders
), votre Site web (les 50 Dernières Commandes), votre commande de connexion (for (i = 0; i < 50; i++)
) et, éventuellement, de nombreux autres endroits.
Maintenant, ce qui se passe lorsque quelqu'un décide de changer de 50 à 25? ou 75? ou 153? Vous avez maintenant à remplacer le 50 dans tous les lieux, et vous êtes très nombreux à ne pas manquer. Rechercher/Remplacer peut ne pas fonctionner, parce que 50 peut être utilisé pour d'autres choses, et aveuglément remplacement de 50 à 25 peuvent avoir d'autres effets secondaires néfastes ( Session.Timeout = 50
appel, qui est également fixé à 25 ans et aux utilisateurs de démarrer les rapports trop fréquents délais d'attente).
En outre, le code peut être difficile à comprendre, c'est à dire "if a < 50 then bla
" - si vous rencontrez que dans le milieu d'une fonction compliquée, d'autres développeurs qui ne sont pas familiers avec le code peut se demander "WTF est de 50???"
C'est pourquoi il est préférable d'avoir de tels ambigu et un nombre arbitraire dans exactement 1 place - "const int NumOrdersToDisplay = 50
", parce que cela rend le code plus lisible ("if a < NumOrdersToDisplay
", cela signifie aussi que vous avez seulement besoin de le changer dans 1 bien définie.
Les endroits où des Numéros de Magie sont approprié est tout ce qui est défini par une norme, c'est à dire SmtpClient.DefaultPort = 25
ou TCPPacketSize = whatever
(pas sûr si c'est normalisée). Aussi, tout ce que définis dans 1 fonction peut être acceptable, mais qui dépend du Contexte.
Il semble que personne n'a mentionné une très BONNE utilisation de numéros de magie...
J'ai trouvé qu'il y est de 1 cas où je PRÉFÈRE des numéros de magie... et c'est des tests unitaires. Dans les tests unitaires, vous souhaitez souvent de construire et d'utiliser vos objets avec des données, et d'affirmer la façon dont les données a été utilisé et abusé.
Lorsque vous écrivez vos tests avec des "nombres magiques" plutôt que de compte constantes, je pense qu'il améliore réellement la qualité des tests... il fait souvent les tests un peu plus claire de ce qu'ils font, mais plus important encore fait les tests de plus en plus isolés.
Avec les tests unitaires, vous voulez à chacun d'être isolé et indépendant de tous les autres. Il doit échouer pour exactement 1 de la raison qui ne dépend pas de l'utilisation ou les résultats d'autres tests. Ainsi, si vous avez des numéros de magie, vous êtes implicitement lier toutes vos tests à ceux des numéros de magie... à moins que vous définissez les constantes comme ZÉRO et UN, et DEUX, ce qui est moins lisible que seulement 0, 1 et 2.
Dans un test, je veux être en mesure de voir tout ce qui concerne le test dans le test lui-même, des numéros de magie et tous.
Cela peut être un critère subjectif style du mien par le chemin. Toutefois, en général, des numéros de magie tendance à être mauvais pour toutes les raisons que d'autres ont décrit.
Avez-vous pris un coup d'oeil à l'entrée de wikipedia pour le nombre magique?
Il va dans un peu de détail, à propos de toutes les façons le nombre magique il est fait référence. Voici une citation sur le nombre magique comme une mauvaise programmation de la pratique
Le terme de nombre magique se réfère également à la mauvaise programmation de la pratique de l'utilisation des numéros directement dans le code source, sans donner d'explication. Dans la plupart des cas, cela rend les programmes plus difficile à lire, à comprendre et à maintenir. Bien que la plupart des guides de faire une exception pour les nombres de zéro et de un, c'est une bonne idée de définir tous les autres numéros de code nommé constantes.
Un nombre magique est une séquence de caractères au début d'un format de fichier ou un protocole d'échange. Ce numéro sert d'un test de cohérence.
Exemple: Ouvrez n'importe quel fichier GIF, vous verrez dès le début: GIF89. "GIF89" être le nombre magique.
D'autres programmes peuvent lire les premiers caractères d'un fichier et de les identifier correctement les fichiers Gif.
Le danger est que l'aléatoire des données binaires peuvent contenir ces mêmes personnages. Mais il est très peu probable.
Comme pour le protocole d'échange, vous pouvez l'utiliser pour identifier rapidement l'actuelle "message" qui est passé pour vous est endommagé ou n'est pas valide.
Des numéros de magie sont encore utiles.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.