Магическое число

Магическое число

@Stasoz

В разработке существует множество грехов, которые, так или иначе, допускают разработчики. И магическое число (magic number) — это, пожалуй, самый распространённый антипаттерн. И конечно, это не самый страшный проступок при написании кода т.к., в целом, данный изъян можно найти и исправить.


Как правило, волшебные числа встречаются в виде параметров при вызове функций или процедур или же при присвоении каких-либо свойств числу. Обязательно — без поясняющих комментариев, чтобы любой человек мог сказать: "не понимаю". Но важно учесть, что при попытке исправить такие числа порой бывает сложно предсказать как поведет себя программа. И именно поэтому данный антипаттерн называется магическим числом — творит невиданные чудеса.


Например вызов следующей функции поймет только тот программист который писал этот код недавно. А вот через пару недель он и сам его забудет:

drawShape(600, 400, 2)


По названию команды можем понять что мы рисуем круг. Также первые две цифры интуитивно понятные, и можно догадаться, что они означают размер. Магическим числом тут остается 2. Что оно означает? Это может быть номер рисуемых фигур, заданное количество отступа, ширина линий, настройки кистей, диаметр или абсолютно что-либо другое (не обязательно даже связанное с рисованием действие).


Возьму еще пример с просторов интернета:

Upload(1, 6);

Что такое 1? Что будет если туда записать 2 или 3? Что такое 6?

Шаг вправо, шаг влево и программа может повести совершенно иначе и даже забраковать весь код. Любые попытки исправлять магические числа вслепую в этом примере, делаются на страх и риск. Ведь, опять же, эти магические числа могут означать что угодно от номера сервера, прокси, до номера файла. Эти значение как-то участвуют в бизнес-логике приложения, но разобраться без автора сложно, если не сказать невозможно.


Для борьбы с магическими числами лучше объявить константу с именем которое будет понятно другим разработчикам.

Например:

const int Height = 600;

const int Weight = 400;

const int Padding = 2;

drawShape(Height, Weight, Padding);

Согласись, читается намного лучше и приятней, и ни у кого не будет вопросов что означают эти цифры. Помимо читабельности, константу намного легче заменить и найти, чем искать нужное число по коду.


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

По-меньше вам магических чисел, ребят, и побольше ясности в коде:)

Report Page