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

Читать в полной версии →

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

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

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

// показываем пользователю окончательную цену товара
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;
};

Резюме:

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