Todo número sem nome que não é imediatamente óbvio no contexto é um número mágico. É um pouco tolo definir números que tenham significado imediatamente óbvio no contexto.
No django (python web framework), posso definir algum campo do banco de dados com um número bruto, como:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
que é mais claro (e a prática recomendada ) do que dizer
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)
como é improvável que eu precise alterar o comprimento (e sempre posso comparar com o max_length
do campo). Se eu precisar alterar o comprimento do campo depois de implantar o aplicativo inicialmente, preciso alterá-lo exatamente em um local por campo no meu código django e depois escrever adicionalmente uma migração para alterar o esquema do banco de dados. Se eu precisar fazer referência a max_length
um campo definido de um tipo de objeto, posso fazê-lo diretamente - se esses campos estavam definindo uma Person
classe, posso usar Person._meta.get_field('firstname').max_length
para obter omax_length
sendo usado (definido em um único local). O fato de os mesmos 40 terem sido usados para vários campos é irrelevante, pois posso alterá-los independentemente. O comprimento do nome próprio nunca deve depender do tamanho do nome do meio ou do sobrenome; eles são valores separados e podem mudar independentemente.
Frequentemente, os índices de matriz podem usar números sem nome; como se eu tivesse um arquivo CSV de dados que desejo colocar em um dicionário python, com o primeiro elemento na linha como o dicionário que key
eu escreveria:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Claro que eu poderia nomear index_column = 0
e fazer algo como:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
ou pior, defina after_index_col = index_col + 1
se livrar do index_col+1
, mas isso não torna o código mais claro na minha opinião. Além disso, se eu der o index_col
nome a, é melhor fazer o código funcionar, mesmo que a coluna não seja 0 (daí a row[:index_col] +
parte).