Когда люди говорят об использовании "магических чисел" в компьютерном программировании, что они означают?
Что такое "магические числа" в компьютерном программировании?
Ответ 1
Магические числа - это любое число в вашем коде, которое не сразу становится очевидным для тех, у кого мало знаний.
Например, следующий фрагмент кода:
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;
Это добавляет абсолютно нулевую дополнительную информацию в ваш код и является пустой тратой времени.
Ответ 2
"магические числа" - это числа, которые появляются в таких выражениях, как
if days == 365
Предполагая, что вы не знали, что было 365 дней в году, вы найдете это выражение бессмысленным. Таким образом, хорошей практикой является присвоение всех "магических" чисел (чисел, имеющих какое-то значение в вашей программе) константе,
DAYS_IN_A_YEAR = 365
И с этого момента сравните с этим. Это легче читать, и если земля когда-либо выбивается из равновесия, и мы получаем дополнительный день... вы можете легко ее изменить (другие цифры могут с большей вероятностью измениться).
Ответ 3
Википедия - ваш друг (Magic Number)
Ответ 4
Там более одного значения. Тот, который дал большинство ответов уже (произвольное неназванное число), является очень распространенным, и единственное, что я скажу об этом, это то, что некоторые люди доходят до крайности определения...
#define ZERO 0
#define ONE 1
Если вы сделаете это, я буду охотиться на вас и не проявлять милосердия.
Другой тип магического числа, однако, используется в форматах файлов. Это просто значение, как обычно, первое в файле, которое помогает идентифицировать формат файла, версию формата файла и/или конечную версию конкретного файла.
Например, у вас может быть магическое число 0x12345678. Если вы видите это магическое число, справедливо предположить, что вы видите файл с правильным форматом. Если вы видите, с другой стороны, 0x78563412, это справедливое предположение, что вы видите версию с одним и тем же файлом с индексированной версией.
Термин "магическое число" немного злоупотребляет, хотя и относится ко всему, что идентифицирует формат файла, включая довольно длинные строки ASCII в заголовке.
Ответ 5
Большинство ответов до сих пор описывали магическое число как константу, которая не описывается самостоятельно. Будучи немного программистом "старой школы", еще в тот же день мы описали магические числа как любую константу, которой назначается какая-то особая цель, которая влияет на поведение кода. Например, число 999999 или MAX_INT или что-то еще полностью произвольное.
Большая проблема с магическими числами заключается в том, что их цель может быть легко забыта или значение, используемое в другом совершенно разумном контексте.
Как грубый и ужасно надуманный пример:
while (int i != 99999)
{
DoSomeCleverCalculationBasedOnTheValueOf(i);
if (escapeConditionReached)
{
i = 99999;
}
}
Тот факт, что константа используется или не называется, не является проблемой. В случае моего ужасного примера значение влияет на поведение, но что, если нам нужно изменить значение "i" во время цикла?
Очевидно, что в приведенном выше примере вам не нужно вводить магическое число для выхода из цикла. Вы можете заменить его с выражением перерыва, и это реальная проблема с магическими числами, что они ленивый подход к кодированию, и в обязательном порядке всегда можно заменить на что-то менее склонном либо отказ, либо потерять значение с течением времени.
Ответ 6
Все, что не имеет очевидного смысла никому, кроме самого приложения.
if (foo == 3) {
// do something
} else if (foo == 4) {
// delete all users
}
Ответ 7
Магические числа - это особое значение определенных переменных, которые заставляют программу вести себя особым образом.
Например, библиотека связи может принимать параметр Timeout и может определять магическое число "-1" для указания бесконечного таймаута.
Ответ 8
Термин "магическое число" обычно используется для описания некоторой числовой константы в коде. Номер появляется без какого-либо дальнейшего описания, и, следовательно, его значение является эзотерическим.
Использование магических чисел можно избежать, используя именованные константы.
Ответ 9
Использование чисел в вычислениях, отличных от 0 или 1, которые не определены каким-либо идентификатором или переменной (что не только упрощает изменение номера в нескольких местах, изменяя его в одном месте, но также дает понять читателю для чего это число).
Ответ 10
В простых и истинных словах магическое число представляет собой трехзначное число, сумма квадратов первых двух цифр равна третьему. Пр-202, as, 2 * 2 + 0 * 0 = 2 * 2. Теперь WAP в java принимает целое число и печатает, является ли это магическим числом или нет.
Ответ 11
Это может показаться немного банальным, но на каждом языке программирования есть хотя бы одно реальное магическое число.
0
Я утверждаю, что это волшебная палочка, чтобы править ими всеми в каждом программистом, дрожащем волшебными палочками.
ЛОЖЬ неизбежно 0 TRUE не (FALSE), но не обязательно 1! Может быть -1 (0xFFFF)
NULL неизбежно 0 (указатель) И большинство компиляторов разрешают это, если их проверка типов не является абсолютно бешенной.
0 является базовым индексом элементов массива, за исключением языков, которые настолько устарели, что базовый индекс равен "1". Затем можно удобно скопировать (i = 0; я < 32; я ++) и ожидать, что "i" начнется с базы (0) и увеличится до и остановится на 32-1... 32-й член массива или что-то еще.
0 - конец многих строк языка программирования. Значение "остановить здесь".
0 также встроен в инструкции X86 для "эффективного перемещения строк". Экономит много микросекунд.
0 часто используется программистами, чтобы указать, что "ничего не случилось" в обычном выполнении. Это значение кода "не-исключение". Его можно использовать, чтобы указать на отсутствие исключений.
Zero - это ответ, который чаще всего задают программисты на объем работы, которую нужно предпринять, чтобы сделать что-то совершенно тривиальное, например изменить цвет активной ячейки до фиолетового, а не ярко-розового. "Нуль, человек, точно так же, как ноль!"
0 - количество ошибок в программе, к которой мы стремимся. 0 исключений, неучтенных, 0 циклов, неработающих, 0 путей рекурсии, которые фактически не могут быть приняты. 0 - это асимптота, которую мы пытаемся достичь в программировании труда, подруг (или бойфренда) "проблемы", паршивый опыт в ресторане и общие особенности одного автомобиля.
Да, 0 действительно волшебное число. FAR больше магии, чем любая другая ценность. Ничего... гм, приближается.