До 30 ноября

Скидки до 81 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
Рекомендуемые программы
профессия
Осваивайте разработку веб-страниц, оживляйте дизайн макетов, публикуйте сайты и приложения. Отслеживайте ошибки в интерфейсе и устраняйте их
10 месяцев
с нуля
Старт 21 ноября
профессия
Обучитесь разработке бэкенда сайтов и веб-приложений — серверной части, которая отвечает за логику и базы данных
10 месяцев
с нуля
Старт 21 ноября
профессия
Выполняйте ручное тестирование веб-приложений, находите ошибки в продукте. Узнайте все о тест-дизайне.
4 месяца
с нуля
Старт 21 ноября
профессия
Научитесь разработке веб-приложений, сайтов и программного обеспечения на языке Java, программируйте и используйте структуры данных
10 месяцев
с нуля
Старт 21 ноября
профессия
новый
Собирайте, анализируйте и интерпретируйте данные, улучшайте бизнес-процессы и продукт компании. Обучитесь работе с библиотеками Python
9 месяцев
с нуля
Старт 21 ноября
профессия
Занимайтесь созданием сайтов, веб-приложений, сервисов и их интеграцией с внутренними бизнес-системами на бекенд-языке PHP
10 месяцев
с нуля
Старт 21 ноября
профессия
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 21 ноября
профессия
Обучитесь разработке визуальной части сайта — фронтенда, а также реализации серверной — бэкенда. Освойте HTML, CSS, JavaScript
16 месяцев
с нуля
Старт 21 ноября
профессия
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 21 ноября
профессия
новый
Организовывайте процесс автоматизации тестирования на проекте, обучитесь языку программирования JavaScript, начните управлять процессом тестирования
8 месяцев
c опытом
Старт 21 ноября