Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Замена магического числа символьной константой.

Проблема

В коде используется число, которое несёт какой-то определённый смысл.

Решение

Замените это число константой с человеко-читаемым названием, объясняющим смысл этого числа.

##Пример

До
double potentialEnergy(double mass, double height) {
  return mass * height * 9.81;
}
После
static final double GRAVITATIONAL_ACCELERATION = 9.81;

double potentialEnergy(double mass, double height) {
  return mass * height * GRAVITATIONAL_ACCELERATION;
}

##Зачем делать рефакторинг

Магические числа — это числовые значения, встречающиеся в коде, но при этом неочевидно, что они означают. Данный антипаттерн затрудняет понимание программы и усложняет её рефакторинг.

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

##Преимущества

  • Символьная константа может служить живой документацией смысла значения, которое в ней хранится.

  • Значение константы намного проще заменить, чем искать нужное число по всему коду, при этом рискуя заменить такое же число, которое в данном конкретном случае использовалось для других целей.

  • Убирает дублирование использования числа или строки по всему коду. Это особенно актуально, если значение является сложным и длинным (например, -14159, 0xCAFEBABE).

##Как делать рефакторинг

  1. Объявите константу и присвойте ей значение магического числа.

  2. Найдите все упоминания магического числа.

  3. Для всех найденных чисел проверьте, согласуется ли это магическое число с предназначением константы. Если да, замените его вашей константой. Эта проверка важна, так как одно и тоже число может означать совершенно разные вещи (в этом случае, они должны быть заменены разными константами).