Je suis relativement nouveau en génie logiciel, et donc comme exercice d'apprentissage, j'ai écrit un jeu d'échecs. Mon ami y a jeté un œil et a fait remarquer que mon code ressemblait à
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
alors qu'il a insisté pour que ce soit plutôt
for (int i = 0; i < CHESS_CONST; i++){
for (int j = 0; j < CHESS_CONST; j++){
avec un meilleur nom de symbole auquel je ne peux pas penser à tout de suite.
Maintenant, bien sûr, je sais éviter généralement d'utiliser des nombres magiques, mais j'ai l'impression que depuis
il n'y a vraiment pas besoin d'une constante symbolique.
Alors qu'en pensez-vous? Est-ce exagéré, ou devrais-je simplement utiliser la convention et utiliser un symbole?
À mon humble avis, votre ami a raison d'utiliser un nom symbolique, bien que je pense que le nom devrait certainement être plus descriptif (comme BOARD_WIDTH
au lieu de CHESS_CONST
).
Même lorsque le nombre ne changera jamais pendant la durée de vie du programme, il peut y avoir d'autres endroits dans votre programme où le nombre 8 apparaîtra avec une signification différente. Remplacement de "8" par BOARD_WIDTH
partout où la largeur de la carte est voulue, et l'utilisation d'un autre nom symbolique quand une chose différente est signifiée rend ces différentes significations explicites, évidentes et votre programme global plus lisible et maintenable. Il vous permet également d'effectuer une recherche globale sur votre programme (ou une recherche de symboles inversés, si votre environnement le propose) au cas où vous auriez besoin d'identifier rapidement tous les endroits du code qui dépendent de la largeur de la carte.
Voir aussi ceci ancien poste SE.SE pour une discussion sur la façon (ou non) de choisir des noms pour les nombres.
En remarque, puisque cela a été discuté ici dans les commentaires: si, dans le code de votre programme réel, cela importe si la variable i
fait référence aux lignes et j
aux colonnes du tableau, ou vice versa, il est alors recommandé de choisir des noms de variables qui rendent la distinction claire, comme row
et col
. L'avantage de ces noms est qu'ils font que un code incorrect semble incorrect.
Ok, voici quelques commentaires que j'ai:
Se débarrasser des nombres magiques est une excellente idée. Il existe un concept connu sous le nom de SEC, qui est souvent mal représenté, mais l'idée est que vous ne reproduisez pas la connaissance des concepts dans votre projet. Donc, si vous avez une classe appelée ChessBoard, vous pouvez y attacher une constante appelée BOARD_SIZE ou ChessBoard.SIZE. De cette façon, il n'y a qu'une seule source pour ces informations. En outre, cela aide à la lisibilité plus tard:
for (int i = 0; i < ChessBoard.SIZE; i++){
for (int j = 0; j < ChessBoard.SIZE; j++){
Même si le nombre ne change jamais, votre programme est sans doute meilleur. Toute personne qui le lit connaît plus d'informations sur ce que fait le code.
Un mauvais nom est pire que pas de nom, mais cela ne signifie pas que quelque chose ne doit pas être nommé. Changez simplement le nom. Ne jetez pas le bébé avec l'eau du bain. : p Le nom peut être descriptif tant que vous comprenez bien ce qu'il décrit. Ensuite, ce concept peut être utilisé pour plusieurs choses différentes.