Что такое "магические числа" в компьютерном программировании? - PullRequest
23 голосов
/ 19 августа 2010

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

Ответы [ 11 ]

38 голосов
/ 19 августа 2010

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

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

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 на 730, когда приращение емкости изменилось.Вы можете просто изменить одну строку:

#define CAPACITY_INCREMENT 729

на:

#define CAPACITY_INCREMENT 730

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


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

x = x + 4;

на:

#define FOUR 4
x = x + FOUR;

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

6 голосов
/ 19 августа 2010

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

if days == 365

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

DAYS_IN_A_YEAR = 365

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

5 голосов
/ 19 августа 2010

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

#define ZERO 0
#define ONE 1

Если ты сделаешь это, я поймаю тебя и не прощу.

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

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

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

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

4 голосов
/ 19 августа 2010

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

3 голосов
/ 19 августа 2010

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

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

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

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

  if (escapeConditionReached)
  {
    i = 99999;
  }
}

Тот факт, что константа используется или не названа, на самом деле не является проблемой.В моем ужасном примере это значение влияет на поведение, но что если нам нужно изменить значение «i» во время цикла?

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

2 голосов
/ 19 августа 2010

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

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

2 голосов
/ 19 августа 2010

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

if (foo == 3) {
    // do something
} else if (foo == 4) {
    // delete all users
}
1 голос
/ 19 августа 2010

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

Использование магических чисел можно избежать с помощью именованных констант.

0 голосов
/ 23 февраля 2011

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

0

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

ЛОЖЬ неизбежно 0 ИСТИНА не (ЛОЖЬ), но не обязательно 1!Может быть -1 (0xFFFF)

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

0 - это базовый индекс элементов массива, за исключением языков, которые настолько устарели, что базовый индекс равен «1».Затем можно удобно кодировать для (i = 0; i <32; i ++) и ожидать, что 'i' начнется с основания (0), будет увеличиваться до 32-1 ... и останавливаться на 32-1 ... 32-м членемассив или что-то еще. </p>

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

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

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

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

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

rlynch@datalyser.com

0 голосов
/ 23 февраля 2011

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

...