When people talk about the use of "magic numbers" in computer programming, what do they mean?
Магические числа - это любое число в вашем коде, которое не сразу очевидно для человека с очень небольшими знаниями.
Например, следующий фрагмент кода:
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;
Это добавляет абсолютно ноль лишняя информация к вашему коду, и это пустая трата времени.
Все, что не имеет очевидного значения для кого-либо, кроме самого приложения.
if (foo == 3) {
// do something
} else if (foo == 4) {
// delete all users
}
Есть несколько значений. Тот, который уже дан большинством ответов (произвольное безымянное число), очень распространен, и единственное, что я скажу по этому поводу, это то, что некоторые люди доходят до крайности определения ...
#define ZERO 0
#define ONE 1
Если вы сделаете это, Я выслежу тебя и не проявлю милосердия.
Однако в форматах файлов используется другой вид магического числа. Это просто значение, обычно включаемое в первую очередь в файл, которое помогает идентифицировать формат файла, версию формата файла и / или порядок байтов конкретного файла.
Например, у вас может быть магическое число 0x12345678. Если вы видите это магическое число, вполне вероятно, что вы видите файл правильного формата. Если вы видите, с другой стороны, 0x78563412, это справедливое предположение, что вы видите версию того же формата с обратным порядком байтов.
Термином «магическое число» немного злоупотребляют, имея в виду практически все, что идентифицирует формат файла, включая довольно длинные строки ASCII в заголовке.
Использование чисел в вычислениях, отличных от 0 или 1, которые не определены каким-либо идентификатором или переменной (что не только позволяет легко изменить число в нескольких местах, изменив его в одном место, но также дает понять читателю, для чего этот номер).
«магические числа» - это числа, которые появляются в таких утверждениях, как
if days == 365
Если вы не знаете, что в году 365 дней, вы сочтете это утверждение бессмысленным. Таким образом, рекомендуется назначать все «магические» числа (числа, которые имеют какое-то значение в вашей программе) константе,
DAYS_IN_A_YEAR = 365
И с этого момента вместо этого сравнивайте с этим. Его легче читать, и если земля когда-либо выйдет из строя, и мы получим дополнительный день ... вы можете легко изменить его (другие числа могут измениться с большей вероятностью).
Термин «магическое число» обычно используется для описания некоторой числовой константы в коде. Число появляется без какого-либо дальнейшего описания, поэтому его значение эзотерическое.
Использование магических чисел можно избежать, используя именованные константы.
Большинство ответов до сих пор описывали магическое число как константу, которая не является самоописывающейся. Будучи сам немного программистом "старой школы", в те времена мы описывали магические числа как любую константу, которой присваивается какое-то особое назначение, влияющее на поведение кода. Например, число 999999 или MAX_INT или что-то еще совершенно произвольное.
Большая проблема с магическими числами заключается в том, что их назначение может быть легко забыто, или значение может быть использовано в другом, совершенно разумном контексте.
В качестве грубого и ужасно надуманного примера:
while (int i != 99999)
{
DoSomeCleverCalculationBasedOnTheValueOf(i);
if (escapeConditionReached)
{
i = 99999;
}
}
Тот факт, что константа используется или не называется, на самом деле не является проблемой. В случае моего ужасного примера значение влияет на поведение, но что, если нам нужно изменить значение "i" во время цикла?
Очевидно, что в приведенном примере вам не нужно магическое число для выхода из цикла. Вы можете заменить его оператором break, и в этом и заключается настоящая проблема магических чисел, что они представляют собой ленивый подход к кодированию, и их всегда можно заменить чем-то менее подверженным либо сбоям, либо потере смысла со временем.
Магические числа - это специальные значения определенных переменных, которые заставляют программу вести себя особым образом.
Например, коммуникационная библиотека может принимать параметр Timeout и может определить магическое число "-1" для обозначения бесконечного тайм-аута.