Магическое число (программирование)
Понятие «Магическое число» в программировании имеет два значения:
Сигнатура данных
Магическое число, или сигнатура файла — целочисленная константа, используемая для однозначной идентификации ресурса или данных. Такое число само по себе не несёт никакого смысла, и может вызвать недоумение, встретившись в коде программы без соответствующего контекста или комментария. По этой причине подобные числа были иронично названы магическими. В настоящее время это название прочно закрепилось как термин. Например, любой откомпилированный класс языка Java начинается с шестнадцатеричного «магического числа» 0xCAFEBABE. Второй широко известный пример — любой исполняемый файл ОС Microsoft Windows с расширением .exe начинается с последовательности байт 0x4D5A. Менее известным примером является неинициализированный указатель в Microsoft Visual С++ (начиная с 2005 версии Microsoft Visual Studio), который в режиме отладки имеет адрес 0xDEADBEEF.
Плохая практика программирования
Также «магическими числами» называют плохую практику программирования, когда в исходном тексте встречается числовое значение и неочевидно, что оно означает. Например, такой фрагмент будет плохим:
<source lang="java">drawSprite(53, 320, 240);</source>
Человеку, который не является автором программы, трудно сказать, что такое 53, 320 или 240. Но если этот код переписать, всё становится на свои места.
<source lang="java">final int SCR_WIDTH = 640; final int SCR_HEIGHT = 480; final int SCR_X_CENTER = SCR_WIDTH/2; final int SCR_Y_CENTER = SCR_HEIGHT/2; final int SPRITE_CROSSHAIR = 53; drawSprite(SPRITE_CROSSHAIR, SCR_X_CENTER, SCR_Y_CENTER);</source>
Теперь понятно: данная строка выводит в центр экрана спрайт — перекрестие прицела. В большинстве языков программирования все значения, используемые для таких констант, будут вычислены ещё на этапе компиляции и подставлены в места использования значений. Поэтому такое изменение исходного текста не ухудшает быстродействие программы.
Магические числа и кроссплатформенность
Иногда магические числа вредят кроссплатформенности кода[1]. Дело в том, что в Си в 32- и 64-битных ОС гарантируется размер типов char, short и long long, в то время как размер int, long, size_t и ptrdiff_t может меняться (у первых двух — в зависимости от предпочтений разработчиков компилятора, в последних двух — в зависимости от разрядности целевой системы). В старом или неквалифицированно написанном коде могут встречаться «магические числа», означающие размер какого-либо типа — при переходе на машины с другой разрядностью они могут привести к трудноуловимым ошибкам.
Например:
<source lang="cpp"> size_t a[n]; memset(a, n*4, 0); // неправильно - подразумевается, что size_t равен 32 битам memset(a, n*sizeof(size_t), 0); // правильно! </source>
Числа, которые не являются магическими
Не все числа требуется переносить в константы. Например, код на Delphi:
<source lang="delphi">for i:=0 to Count-1 do ...</source>
Смысл чисел 0 и 1 понятен, и дальнейшего объяснения не требуется.
Также можно не делать константами:
- 0 в качестве false и 1 в качестве true (если, конечно, в языке нет собственных констант
falseиtrue); - Основания систем счисления — 10 (основание десятичной системы), 60 (секунд в минуте), 1000 (миллисекунд в секунде).
Примечания
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....