Информация о Магическое число (программирование) - Поиск

Информация о Магическое число (программирование) - Поиск


Результат поиска для Магическое_число_(программирование)
Вы можете получить подробную информацию обо всем, что вы ищете

Вы можете воспользоваться различными полезными ссылками, связанными со словом Магическое число (программирование)


Найти и скачать песни, соответствующие слову Магическое число (программирование)


Для слова Магическое число (программирование) см. полезные ссылки


Просмотреть и загрузить изображения, соответствующие слову Магическое число (программирование)


Ищите и читайте статьи, которые соответствуют слову Магическое число (программирование)


Читать статью о слове Магическое число (программирование) в Википедии


Магическое число (программирование) Ищите и читайте новости


Смотреть и скачать фильмы, которые соответствуют слову Магическое число (программирование)


Смотрите и скачивайте дорамы, соответствующие слову Магическое число (программирование)



Мы стараемся помочь вам найти все, что соответствует слову Магическое число (программирование). Если вы не можете найти здесь то, что ищете, перейдите на главную страницу. Наш сайт обновляется каждый день, каждый день появляются новые песни, видео, картинки, фильмы, сериалы, интересные новости и т.д. добавлен. Самое главное, вы можете скачать самую безопасную программу Whatsapp Plus с нашего сайта. Если мы не нашли ничего, соответствующего вашему запросу Магическое число (программирование), мы скоро опубликуем это для вас.
Спасибо, что выбрали нас!

Кроме того, вы можете воспользоваться полезными ссылками, которыми поделились

Магическое число (программирование)

Понятие «Магическое число» в программировании имеет три значения:

  • Сигнатура данных
  • Выделенные уникальные значения, которые не должны совпадать с другими значениями (например, UUID)[источник не указан 832 дня]
  • Плохая практика программирования.

Сигнатура данных править

Магическое число, или сигнатура, — целочисленная или текстовая константа, используемая для однозначной идентификации ресурса или данных. Такое число само по себе не несёт никакого смысла и может вызвать недоумение, встретившись в коде программы без соответствующего контекста или комментария, при этом попытка изменить его на другое, даже близкое по значению, может привести к абсолютно непредсказуемым последствиям. По этой причине подобные числа были иронично названы магическими. В настоящее время это название прочно закрепилось как термин. Например, любой откомпилированный класс языка Java начинается с шестнадцатеричного «магического числа» 0xCAFEBABE. Второй широко известный пример — любой исполняемый файл ОС Microsoft Windows с расширением .exe начинается с последовательности байт 0x4D5A (что соответствует ASCII-символам MZ — инициалы Марка Збиковски, одного из создателей MS-DOS). Менее известным примером является неинициализированный указатель в Microsoft Visual C++ (начиная с 2005 версии Microsoft Visual Studio), который в режиме отладки имеет адрес 0xDEADBEEF.

В UNIX-подобных операционных системах тип файла обычно определяется по сигнатуре файла, вне зависимости от расширения его названия. Для интерпретации сигнатуры файла в них предусматривается стандартная утилита file.

Плохая практика программирования править

Также «магическими числами» называют плохую практику программирования, когда в исходном тексте встречается числовое значение и неочевиден его смысл. Например, такой фрагмент, написанный на Java, будет плохим:

drawSprite(53, 320, 240);

Тому, кто не писал программу, трудно понять, что такое 53, 320 или 240. Но если этот код переписать, всё становится на свои места.

final int SCREEN_WIDTH = 640;
final int SCREEN_HEIGHT = 480;
final int SCREEN_X_CENTER = SCREEN_WIDTH / 2;
final int SCREEN_Y_CENTER = SCREEN_HEIGHT / 2;
final int SPRITE_CROSSHAIR = 53;

...

drawSprite(SPRITE_CROSSHAIR, SCREEN_X_CENTER, SCREEN_Y_CENTER);

Теперь понятно: этот код выводит в центр экрана спрайт — перекрестие прицела. В большинстве языков программирования все значения, используемые для таких констант, будут вычислены ещё на этапе компиляции и подставлены в места использования значений (свёртка констант). Поэтому такое изменение исходного текста не ухудшает быстродействие программы.

Кроме того, магические числа — потенциальный источник ошибок в программе:

  • Если одно и то же магическое число используется в программе более одного раза (или потенциально может использоваться), то его изменение потребует правок каждого вхождения (вместо одной правки значения именованной константы). Если будут исправлены не все вхождения, возникнет как минимум одна ошибка.
  • Как минимум в одном из вхождений магическое число может быть написано с ошибкой изначально, и это довольно сложно обнаружить.
  • Магическое число может зависеть от неявного параметра или другого магического числа. Если эти зависимости, не выделенные явно, не будут удовлетворены, возникнет как минимум одна ошибка.
  • При модификации вхождений одного магического числа можно ошибочно изменить другое магическое число, независимое, но имеющее то же числовое значение.

Магические числа и кроссплатформенность править

Иногда магические числа вредят кроссплатформенности кода[1]. Дело в том, что в Си в 32- и 64-битных ОС гарантируется размер типов char, short и long long, в то время как размер int, long, size_t и ptrdiff_t может меняться (у первых двух — в зависимости от предпочтений разработчиков компилятора, у последних двух — в зависимости от разрядности целевой системы). В старом или неумело написанном коде могут встречаться «магические числа», означающие размер какого-либо типа — при переходе на машины с другой разрядностью они могут привести к трудноуловимым ошибкам.

Например:

const size_t NUMBER_OF_ELEMENTS = 10;

long a[NUMBER_OF_ELEMENTS];

memset(a, 0, 10 * 4);                            // неправильно — подразумевается, что long равен 4 байтам, используется магическое число элементов
memset(a, 0, NUMBER_OF_ELEMENTS * 4);            // неправильно — подразумевается, что long равен 4 байтам
memset(a, 0, NUMBER_OF_ELEMENTS * sizeof(long)); // не совсем правильно — дублирование имени типа (если изменится тип, то придется менять и здесь)
memset(a, 0, NUMBER_OF_ELEMENTS * sizeof(a[0])); // правильно, оптимально для динамических массивов ненулевого размера
memset(a, 0, sizeof(a));                         // правильно, оптимально для статических массивов

Числа, которые не являются магическими править

Не все числа требуется переносить в константы. Например, код на Delphi:

for i:=0 to Count-1 do ...

Смысл чисел 0 и 1 понятен, и дальнейшего объяснения не требуется.

См. также править

Примечания править

  1. 20 ловушек переноса кода на C++ на 64-битную платформу. Дата обращения: 31 октября 2008. Архивировано 15 августа 2010 года.

На сайте 41 человек
Top.Mail.Ru
©Tatli.Biz 2010-2024