Скидки до 20% + 2-ая профессия бесплатно и подарки на 50 000₽

Главная | Все статьи | Код

Что такое магические числа в программировании и как снять это заклятие

Время чтения статьи ~2 минуты 17
Что такое магические числа в программировании и как снять это заклятие главное изображение

Магические числа — пример плохих практик в программировании. Из этой статьи вы узнаете, почему от них надо избавляться и как это делать.

Что такое магические числа

В программировании магическими называют числа в коде, смысл которых сложно понять. Взгляните на пример.

// показываем пользователю окончательную цену товара
const showBruttoPrice = (nettoPrice) => {
  const bruttoPrice = nettoPrice * 1.20;
  return bruttoPrice;
};

Это пример магического числа, потому что невозможно однозначно ответить на вопрос, почему для вычисления bruttoPrice нужно умножить nettoPrice на 1.20. Смысл числа 1.20 приходится восстанавливать по контексту. Но при работе с большими приложениями в реальной разработке это не всегда возможно.

Магические числа не ломают код. В примере выше пользователь увидит окончательную цену, то есть программа отработает. В чём же проблема?

Код с магическими числами сложно понять без контекста. Это может стать проблемой для разработчиков, которые впервые видят приложение. Да и автор кода может забыть, почему использовал именно это число.

Как избавиться от магических чисел

Это можно сделать с помощью константы с понятным названием. То есть название константы должно передавать смысл числа.

// указываем ставку НДС
const vatRate = 1.20;

const showBruttoPrice = (nettoPrice) => {
  const bruttoPrice = nettoPrice * vatRate;
  return bruttoPrice;
};

Очевидное указание ставки НДС делает код более понятным.

Код с магическими числами сложно поддерживать и расширять. Например, если магазин продаёт товары людям из разных стран, магические числа приводят к дублированию:

// в разных странах разные ставки НДС
const showBruttoPrice = (nettoPrice, country) => {
  let bruttoPrice;
  if (country === 'Russia') {
    bruttoPrice = nettoPrice * 1.20;
  }
  if (country === 'Germany') {
    bruttoPrice = nettoPrice * 1.19;
  }
  // стран может быть 5, 20 или 50
  // для каждой придётся использовать
  // своё магическое число
  // ...

  return bruttoPrice;
};

Проблему решает избавление от магических чисел:

const getVatRate = (country) => {
  // получаем ставку НДС для конкретной страны из
  // базы данных или из внешнего источника
};

const showBruttoPrice = (nettoPrice, country) => {
  // определяем ставку НДС вместо того, 
  // чтобы указывать её с помощью магических чисел
  const vatRate = getVatRate(country);
  // определяем окончательную цену
  const bruttoPrice = nettoPrice * vatRate;
  return bruttoPrice;
};

Резюме:

  • Магические числа — плохая практика в программировании
  • Обычно магические числа не ломают код, а делают его менее понятным
  • Чтобы избавиться от магических чисел, достаточно использовать константы или переменные с понятными названиями

Дополнительные материалы

Аватар пользователя Дмитрий Дементий
Дмитрий Дементий 24 сентября 2020
17
Похожие статьи
Рекомендуемые программы
профессия
Верстка на HTML5 и CSS3, Программирование на JavaScript в браузере, разработка клиентских приложений используя React
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Тестирование веб-приложений, чек-листы и тест-кейсы, этапы тестирования, DevTools, Postman, SQL, Git, HTTP/HTTPS, API
4 месяца
с нуля
Старт 26 декабря
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Ruby, Разработка веб-приложений и сервисов используя Rails, проектирование и реализация REST API
5 месяцев
c опытом
Старт 26 декабря
профессия
Программирование на JavaScript в браузере и на сервере (Node.js), разработка бекендов на Fastify и фронтенда на React
16 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript, разработка веб-приложений, bff и сервисов используя Fastify, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Git, JavaScript, Playwright, бэкенд-тесты, юнит-тесты, API-тесты, UI-тесты, Github Actions, HTTP/HTTPS, API, Docker, SQL
8 месяцев
c опытом
Старт 26 декабря