Примеры на Яваскрипте, но совет актуален для всех языков программирования
В программировании «магические числа» — это числа в коде, смысл которых сложно понять сходу.
Примеры на Яваскрипте, но совет актуален для всех языков программирования
Например, что в этом коде значит число 50? Почему 50, а не 60? Откуда вообще это число взялось?
for (let i = 1; i <= 50; i++) {
renderProduct()
}
Или вот. Тут контекст помогает примерно понять, что происходит, но точный смысл числа всё равно сходу неясен. Повидавший жизнь программист сориентируется довольно быстро, но почему он должен тратить на это своё время и внимание?
if (timePassed > 43200000) notifyAdmin()
Без комментариев.
if (this.id === 1632) return
Почему плохо
Магические числа усложняют работу с кодом для автора кода и для других людей. Потому что смысл чисел со временем забывается и для его восстановления придётся тратить самый ценный ресурс программиста — внимание и концентрацию.
Магические числа и другие плохие практики в коде воруют внимание, нужное программисту для решения своих основных задач.
Что делать
Избавляться от магических чисел проще простого. Выносите числа в переменные с наглядными именами, чтобы избавить себя и других от лишних вопросов в будущем:
const PRODUCTS_PER_PAGE = 50
for (let i = 1; i <= PRODUCTS_PER_PAGE; i++) {
renderProduct()
}
const HALF_DAY_IN_MS = 1000 * 60 * 60 * 24 / 2
if (timePassed > HALF_DAY_IN_MS) notifyAdmin()
const LEGACY_API_ID = 1632
if (this.id === LEGACY_API_ID) return
Вынесение числа в переменную упростит работу с любым кодом. Не стоит разве что выносить числа в переменные в тестах, там это ухудшит наглядность проверок.
Знаете другие случаи, когда не стоит выносить числа в переменные? Поделитесь в коментах.
Кстати, магические числа можно встретить не только в языках программирования. Они встречаются и в ХТМЛ и ЦСС, хоть и под немного другими личинами. Но об этом уже как‑нибудь в другой раз.
P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.