What are “magic numbers” in computer programming?

When people talk about the use of "magic numbers" in computer programming, what do they mean?

23
задан einpoklum - reinstate Monica 11 March 2017 в 23:43
поделиться

9 ответов

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

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

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;

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

38
ответ дан 29 November 2019 в 01:10
поделиться

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

if (foo == 3) {
    // do something
} else if (foo == 4) {
    // delete all users
}
2
ответ дан 29 November 2019 в 01:10
поделиться

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

#define ZERO 0
#define ONE 1

Если вы сделаете это, Я выслежу тебя и не проявлю милосердия.

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

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

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

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

5
ответ дан 29 November 2019 в 01:10
поделиться

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

0
ответ дан 29 November 2019 в 01:10
поделиться

Википедия - ваш друг (статья Magic Number )

4
ответ дан 29 November 2019 в 01:10
поделиться

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

if days == 365

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

DAYS_IN_A_YEAR = 365

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

6
ответ дан 29 November 2019 в 01:10
поделиться

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

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

1
ответ дан 29 November 2019 в 01:10
поделиться

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

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

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

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

  if (escapeConditionReached)
  {
    i = 99999;
  }
}

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

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

3
ответ дан 29 November 2019 в 01:10
поделиться

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

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

2
ответ дан 29 November 2019 в 01:10
поделиться