Każda nienazwana liczba, która nie jest od razu oczywista z kontekstu, jest liczbą magiczną. Trochę głupio jest definiować liczby, które mają znaczenie, które jest natychmiast oczywiste z kontekstu.
W django (frameworku Python) mogę zdefiniować pole bazy danych o nieprzetworzonej liczbie, takie jak:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
co jest jaśniejsze (i zalecana praktyka ) niż powiedzieć
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)
ponieważ prawdopodobnie nigdy nie będę musiał zmieniać długości (i zawsze mogę to porównać do max_length
pola). Jeśli muszę zmienić długość pola po początkowym wdrożeniu aplikacji, muszę zmienić go dokładnie w jednym miejscu na pole w moim kodzie django, a następnie dodatkowo napisać migrację, aby zmienić schemat bazy danych. Jeśli kiedykolwiek będę potrzebować odwoływać się max_length
do zdefiniowanego pola typu obiektu, mogę to zrobić bezpośrednio - jeśli pola te definiują Person
klasę, mogę użyć, Person._meta.get_field('firstname').max_length
aby uzyskaćmax_length
w użyciu (który jest zdefiniowany w jednym miejscu). Fakt, że tych samych 40 użyto do wielu pól, nie ma znaczenia, ponieważ mogę chcieć je zmienić niezależnie. Długość imienia nigdy nie powinna zależeć od długości imienia i nazwiska; są to osobne wartości i mogą się zmieniać niezależnie.
Indeksy tablicowe często mogą używać liczb nienazwanych; na przykład, jeśli mam plik CSV danych, który chcę umieścić w słowniku Pythona, z pierwszym elementem w wierszu jako słownik key
, który napisałbym:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Pewnie, że mógłbym nazwać index_column = 0
i zrobić coś takiego:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
lub gorzej zdefiniować, after_index_col = index_col + 1
aby się go pozbyć index_col+1
, ale to nie sprawia, że kod jest jaśniejszy. Ponadto, jeśli podam index_col
nazwę, lepiej sprawię, aby kod działał, nawet jeśli kolumna nie jest równa 0 (stąd row[:index_col] +
część).