Что такое "магические числа" в компьютерном программировании?

когда люди говорят об использовании "магических чисел" в компьютерном программировании, что они имеют в виду?

11 ответов


магические числа-это любое число в вашем коде, которое не сразу очевидно для кого-то с очень небольшим знанием.

например, следующий фрагмент кода:

sz = sz + 729;

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

sz = sz + CAPACITY_INCREMENT;

некоторые крайние взгляды утверждают, что вы никогда не должны иметь никаких чисел в своем коде, кроме -1, 0 и 1, но я предпочитаю несколько менее догматический взгляд, так как я бы сразу распознал 24, 1440, 86400, 3.1415, 2.71828 и 1.414 - все зависит от ваших знаний.

однако, хотя я знаю есть 1440 минут в день, я бы, наверное еще использовать MINS_PER_DAY идентификатор, так как это делает поиск их намного проще. Чей сказать, что приращение емкости, упомянутое выше, также не будет 1440, и вы в конечном итоге измените неправильное значение? Это особенно верно для низких чисел: шанс двойного использования 37197 относительно низок, шанс использование 5 для нескольких вещей довольно высоко.

использование идентификатора означает, что вам не придется проходить через все ваши исходные файлы 700 и изменять 729 to 730 когда увеличение емкости изменилось. Вы можете просто изменить одну строку:

#define CAPACITY_INCREMENT 729

в:

#define CAPACITY_INCREMENT 730

и перекомпилировать много.


сравните это с магическими константами, которые являются результатом наивных людей, думающих, что только потому, что они удаляют фактическое номера из их кода, они могут меняться:

x = x + 4;

в:

#define FOUR 4
x = x + FOUR;

это добавляет абсолютно ноль дополнительная информация к вашему коду и является полной тратой времени.


"магические числа" - это числа, которые появляются в операторах типа

if days == 365

предполагая, что вы не знали, что в году 365 дней, вы найдете это утверждение бессмысленным. Таким образом, хорошей практикой является присвоение всех "магических" чисел (чисел, которые имеют какое-то значение в вашей программе) константе,

DAYS_IN_A_YEAR = 365

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


есть несколько значений. Тот, который уже дан большинством ответов (произвольное неназванное число), очень распространен, и единственное, что я скажу об этом, - это то, что некоторые люди идут на крайность определения...

#define ZERO 0
#define ONE 1

другой вид магического числа, однако, используется в форматах файлов. Это просто значение, включенное, как правило, в первую очередь в файл, который помогает определить формат файла, версия формата файла и / или конечность конкретного файла.

например, у вас может быть магическое число 0x12345678. Если вы видите это магическое число, это справедливое предположение, что вы видите файл правильного формата. Если вы видите, с другой стороны, 0x78563412, это справедливое предположение, что вы видите эндианскую версию того же формата файла.

термин "магическое число" немного злоупотребляется, хотя, ссылаясь почти на все, что определяет формат файла - включая довольно длинные строки ASCII в заголовке.

http://en.wikipedia.org/wiki/File_format#Magic_number


Википедия - ваш друг (Магическое Число статьи)


большинство ответов до сих пор описывали магическое число как константу, которая не является самоописанием. Будучи немного" старомодным " программистом, еще в те дни мы описывали магические числа как любую константу, которой назначается какая-то особая цель, которая влияет на поведение кода. Например, число 999999 или MAX_INT или что-то еще совершенно произвольное.

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

в качестве грубого и ужасно надуманного примера:

while (int i != 99999)
{
  DoSomeCleverCalculationBasedOnTheValueOf(i);      

  if (escapeConditionReached)
  {
    i = 99999;
  }
}

тот факт, что константа используется или не называется, на самом деле не проблема. В случае моего ужасного примера ценность влияет на поведение, но что, если нам нужно изменить значение "я" во время цикла?

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


все, что не имеет очевидного значения для кого-либо, кроме самого приложения.

if (foo == 3) {
    // do something
} else if (foo == 4) {
    // delete all users
}

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

например, библиотека связи может принимать параметр тайм-аута, и он может определить магическое число "-1" для указания бесконечного тайм-аута.


термин магическое число обычно используется для описания некоторой числовой константы в коде. Число появляется без какого-либо дальнейшего описания, и поэтому его значение эзотерическое.

использование магических чисел можно избежать, используя именованные константы.


использование чисел в вычислениях, отличных от 0 или 1, которые не определены каким-либо идентификатором или переменной (что не только упрощает изменение числа в нескольких местах, изменяя его в одном месте, но и дает читателю понять, для чего это число).


в простых и истинных словах магическое число-это трехзначное число, сумма квадратов первых двух цифр которого равна третьей. Ex-202, как, 2*2 + 0*0 = 2*2. Теперь WAP в java принимает целое число и печатает, является ли это магическим числом или нет.


Это может показаться немного банальным, но в каждом языке программирования есть по крайней мере одно реальное магическое число.

0

Я утверждаю, что это волшебная палочка, чтобы управлять ими всеми практически в колчане каждого программиста волшебных палочек.

FALSE неизбежно равно 0 TRUE не является (ложным), но не обязательно 1! Может быть -1 (0xFFFF)

NULL неизбежно равно 0 (указатель) И большинство компиляторов позволяют это, если их проверка типов не является совершенно бешеной.

0-базовый индекс элементов массива, за исключением языков, которые настолько устарели, что базовый индекс '1'. Затем можно удобно кодировать для(i = 0; i

0-это конец многих языках программирования строки. Значение" stop here".
0 также встроен в инструкции X86 для "эффективного перемещения строк". Сохранить много микросекунд.

0 часто используется программистами, чтобы указать, что "ничего не случилось" в исполнении рутины. Это значение кода "не является исключением". Можно использовать его, чтобы указать на отсутствие исключений.

ноль-это ответ, который чаще всего дают программисты на объем работы, который потребуется, чтобы сделать что-то совершенно тривиальное, например, изменить цвет активной ячейки на фиолетовый вместо ярко-розового. - Ноль, чувак, как ноль!"

0 это количество ошибок в программе, которую мы стремимся достичь. 0 исключений неучтенных, 0 циклов unterminated, 0 путей рекурсии, которые фактически не могут быть приняты. 0-это асимптота, которую мы пытаемся достичь в программировании труда, подружки (или друга) "проблем", паршивых ресторанных впечатлений и общих особенностей своего автомобиля.

да, 0 действительно магическое число. Гораздо больше магии, чем любой другой ценности. Ничего... ГМ, идет. закрывать.

rlynch@datalyser.com