Chaque nombre sans nom qui n'est pas immédiatement évident du contexte est un nombre magique. C'est un peu idiot de définir des nombres qui ont une signification immédiatement évidente du contexte.
Dans django (framework web python), je peux définir un champ de base de données avec un nombre brut comme:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
qui est plus clair (et le pratique recommandée ) que de dire
MAX_LENGTH_NAME = 40
...
firstname = models.CharField(max_length=MAX_LENGTH_NAME)
middlename = models.CharField(max_length=MAX_LENGTH_NAME)
lastname = models.CharField(max_length=MAX_LENGTH_NAME)
car je ne vais probablement jamais avoir besoin de changer la longueur (et je peux toujours la comparer à celle max_length
du champ). Si j'ai besoin de modifier la longueur du champ après avoir déployé l'application initialement, je dois le changer à exactement un emplacement par champ dans mon code django, puis écrire en outre une migration pour modifier le schéma de la base de données. Si j'ai besoin de référencer max_length
un champ défini d'un type d'objet, je peux le faire directement - si ces champs définissaient une Person
classe, je peux l'utiliser Person._meta.get_field('firstname').max_length
pour obtenir lemax_length
utilisé (qui est défini en un seul endroit). Le fait que le même 40 ait été utilisé pour plusieurs champs n'est pas pertinent car je peux vouloir les changer indépendamment. La longueur du prénom ne doit jamais dépendre de la longueur du prénom ou du nom de famille; ce sont des valeurs distinctes et peuvent changer indépendamment.
Souvent, les indices matriciels peuvent utiliser des nombres sans nom; comme si j'avais un fichier CSV de données que je voulais mettre dans un dictionnaire python, avec le premier élément de la ligne comme dictionnaire key
j'écrirais:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Bien sûr, je pourrais nommer index_column = 0
et faire quelque chose comme:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
ou pire définir after_index_col = index_col + 1
pour se débarrasser de index_col+1
, mais cela ne rend pas le code plus clair à mon avis. De plus, si je donne index_col
un nom, je ferais mieux de faire fonctionner le code même si la colonne n'est pas 0 (d'où la row[:index_col] +
partie).