Что такое "магические числа" в компьютерном программировании?
когда люди говорят об использовании "магических чисел" в компьютерном программировании, что они имеют в виду?
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 в заголовке.
большинство ответов до сих пор описывали магическое число как константу, которая не является самоописанием. Будучи немного" старомодным " программистом, еще в те дни мы описывали магические числа как любую константу, которой назначается какая-то особая цель, которая влияет на поведение кода. Например, число 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