Кожне неназване число, яке не відразу очевидно з контексту, - це магічне число. Це трохи нерозумно визначити числа, які мають значення, що відразу очевидно з контексту.
У django (python web Framework) я можу визначити деяке поле бази даних із необробленим числом, наприклад:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
що зрозуміліше (і рекомендована практика ), ніж сказати
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)
тому що я навряд чи коли-небудь знадобиться змінювати довжину (і завжди можна порівняти max_length
з польовою). Якщо мені потрібно змінити довжину поля після первинного розгортання програми, мені потрібно змінити його в точно одному місці на поле в моєму коді django, а потім додатково написати міграцію, щоб змінити схему БД. Якщо мені колись знадобиться посилання max_length
на певне поле типу об’єкта, я можу це зробити безпосередньо - якщо ці поля визначали Person
клас, я можу використовувати Person._meta.get_field('firstname').max_length
для отриманняmax_length
використовується (що визначено в одному місці). Те, що ті самі 40 були використані для кількох полів, не має значення, оскільки я можу захотіти їх змінити самостійно. Довжина імені ніколи не повинна залежати від довжини прізвища чи прізвища; вони є окремими значеннями і можуть змінюватися незалежно.
Часто в індексах масиву можна використовувати неназвані числа; наприклад, якщо у мене є файл CSV даних, який я хочу вкласти в словник python, з першим елементом у рядку як словником, який key
я б написав:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Впевнений, що я міг назвати index_column = 0
і зробити щось на кшталт:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
або гірше визначити, after_index_col = index_col + 1
щоб позбутися від цього index_col+1
, але це не робить код яснішим на мій погляд. Крім того, якщо я даю index_col
ім’я, я краще змушу код працювати, навіть якщо стовпець не 0 (звідси row[:index_col] +
частина).