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

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

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

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

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

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

// показываем пользователю окончательную цену товара
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
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 2 мая
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 2 мая
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 2 мая
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 2 мая
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 2 мая
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 2 мая
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время