Ogni numero senza nome che non è immediatamente evidente dal contesto è un numero magico. È un po 'sciocco definire numeri che abbiano un significato che è immediatamente evidente dal contesto.
In django (python web framework), posso definire alcuni campi del database con un numero non elaborato come:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
che è più chiaro (e la pratica consigliata ) di 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)
poiché è improbabile che abbia mai bisogno di cambiare la lunghezza (e può sempre confrontare con max_lengthil campo). Se devo modificare la lunghezza del campo dopo aver inizialmente distribuito l'applicazione, devo cambiarlo esattamente in una posizione per campo nel mio codice django, quindi scrivere una migrazione per cambiare lo schema del DB. Se mai dovessi fare riferimento a max_lengthun campo definito di un tipo di oggetto, posso farlo direttamente - se quei campi stavano definendo una Personclasse, posso usare Person._meta.get_field('firstname').max_lengthper ottenere ilmax_lengthin uso (che è definito in un unico posto). Il fatto che lo stesso 40 sia stato utilizzato per più campi è irrilevante in quanto potrei volerli modificare in modo indipendente. La lunghezza del nome non dovrebbe mai dipendere dalla lunghezza del nome medio o del cognome; sono valori separati e possono cambiare indipendentemente.
Spesso gli indici di array possono usare numeri senza nome; come se avessi un file CSV di dati che volevo mettere in un dizionario Python, con il primo elemento nella riga come il dizionario keyche scriverei:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Sicuro che potrei nominare index_column = 0e fare qualcosa del tipo:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
o peggio definire after_index_col = index_col + 1per sbarazzarsi di index_col+1, ma ciò non rende il codice più chiaro a mio avviso. Inoltre, se do index_colun nome, farò meglio a far funzionare il codice anche se la colonna non è 0 (quindi la row[:index_col] +parte).