Jede unbenannte Zahl, die aus dem Kontext nicht sofort ersichtlich ist, ist eine magische Zahl. Es ist ein bisschen albern, Zahlen zu definieren, die eine Bedeutung haben, die sich unmittelbar aus dem Kontext ergibt.
In Django (Python Web Framework) kann ich ein Datenbankfeld mit einer unformatierten Zahl wie der folgenden definieren:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
Was ist klarer (und die empfohlene Praxis ) als sagen
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)
da ich wohl nie die länge ändern muss (und immer mit der max_lengthdes feldes vergleichen kann ). Wenn ich die Länge des Felds nach der ersten Bereitstellung der Anwendung ändern muss, muss ich es in meinem Django-Code an genau einem Ort pro Feld ändern und dann zusätzlich eine Migration schreiben, um das Schema der Datenbank zu ändern. Wenn ich jemals zu Referenz muß max_lengtheine definierten Feld einer Art von Objekt, kann es es direkt tun - wenn diese Felder einen wurden die Definition der PersonKlasse, kann ich Person._meta.get_field('firstname').max_lengthdas erhaltenmax_lengthverwendet werden (die an einer Stelle definiert ist). Die Tatsache, dass dieselbe 40 für mehrere Felder verwendet wurde, ist irrelevant, da ich sie möglicherweise unabhängig voneinander ändern möchte. Die Länge des Vornamens sollte niemals von der Länge des Zwischennamens oder des Nachnamens abhängen. Sie sind separate Werte und können sich unabhängig voneinander ändern.
Häufig können Array-Indizes unbenannte Zahlen verwenden. Zum Beispiel, wenn ich eine CSV-Datei mit Daten habe, die ich in ein Python-Wörterbuch einfügen möchte, mit dem ersten Element in der Zeile als dem Wörterbuch, das keyich schreiben würde:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Klar, ich könnte index_column = 0etwas benennen und tun wie:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
oder schlimmer definieren after_index_col = index_col + 1, um das loszuwerden index_col+1, aber das macht den Code aus meiner Sicht nicht klarer. Auch wenn ich index_coleinen Namen gebe , lasse ich den Code besser funktionieren, auch wenn die Spalte nicht 0 ist (daher der row[:index_col] +Teil).