17. Избегайте магических чисел

17. Избегайте магических чисел

Резюме

Избегайте использования в коде литеральных констант наподобие 42 или 3.1415926. Такие константы не самоочевидны и усложняют сопровождение кода, поскольку вносят в него трудноопределимый вид дублирования. Используйте вместо них символьные имена и выражения наподобие width*aspectRatiо.

Обсуждение

Имена добавляют информацию и вводят единую точку сопровождения; в отличие от них дублированные по всей программе обычные числа анонимны и трудно сопровождаемы. Константы должны быть перечислениями или const-значениями, с соответствующими областями видимости и именами.

Одно число 42 может не быть тем же числом 42, что и другое. Что еще хуже, программист может выполнять какие-то вычисления "в уме" (например: "Вот это 84 — просто удвоенное 42, которое было пятью строками ранее"), что совершенно запутывает код и делает последующую замену 42 другой константой источником огромного количества ошибок.

Лучше заменять такие жестко кодированные величины символьными константами. Строки лучше хранить отдельно от кода (например, в отдельном .срр-файле или файле ресурса), что позволит непрограммистам просмотреть и обновить их, снижая количество дубликатов и помогая в интернационализации вашей программы.

Примеры

Пример 1. Важные константы из предметной области на уровне пространств имен.

const size_t PAGE_SIZE = 8192,

             WORDS_PER_PAGE = PAGE_SIZE / sizeof(int),

             INFO_BITS_PER_PAGE = 32 * CHAR_BIT;

Пример 2. Константы, специфичные для данного класса. Вы можете определить статические интегральные константы в определении класса; константы других типов требуют отдельного определения или применения коротких функций.

// Файл widget.h

class Widget {

 // Значение указано в объявлении

 static const int defaultWidth = 400;

 // Значение указано в определении

 static const double defaultPercent;

 static const char* Name() { return "widget"; }

};

// Файл widget.cpp

// Значение указано в определении

const double widget::defaultPercent = 66.67;

// Требуется объявление

const int widget::defaultWidth;

Ссылки

[Dewhurst03] §2 • [Kernighan99] §1.5 • [Stroustrup00] §4.8, §5.4

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Избегайте слов «продолжить», «назад» и «применить»

Из книги автора

Избегайте слов «продолжить», «назад» и «применить» Слова «продолжить», «назад», «применить» и другие являются неоднозначными и могут запутать потенциального клиента.При виде них часто возникают вопросы:• Что продолжить – делать покупки или процесс оплаты?• Куда


Избегайте повторного ввода данных

Из книги автора

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


16. Избегайте макросов

Из книги автора

16. Избегайте макросов РезюмеМакрос — самый неприятный инструмент С и С++, оборотень, скрывающийся под личиной функции, кот, гуляющий сам по себе и не обращающий никакого внимания на границы ваших областей видимости. Берегитесь его!ОбсуждениеТрудно найти язык, достаточно


20. Избегайте длинных функций и глубокой вложенности

Из книги автора

20. Избегайте длинных функций и глубокой вложенности РезюмеКраткость — сестра таланта. Чересчур длинные функции и чрезмерно вложенные блоки кода зачастую препятствуют реализации принципа "одна функция — одна задача" (см. рекомендацию 5), и обычно эта проблема решается


30. Избегайте перегрузки && , || и , (запятой)

Из книги автора

30. Избегайте перегрузки &&, || и , (запятой) РезюмеМудрость — это знание того, когда надо воздержаться. Встроенные операторы &&, || и , (запятая) трактуются компилятором специальным образом. После перегрузки они становятся обычными функциями с весьма отличной


75. Избегайте спецификаций исключений

Из книги автора

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


92. Избегайте reinterpret_cast

Из книги автора

92. Избегайте reinterpret_cast РезюмеКак гласит римская пословица, у лжи короткие ноги. Не пытайтесь использовать reinterpret_cast, чтобы заставить компилятор рассматривать биты объекта одного типа как биты объекта другого типа. Такое действие противоречит безопасности


93. Избегайте применения static_cast к указателям

Из книги автора

93. Избегайте применения static_cast к указателям РезюмеК указателям на динамические объекты не следует применять преобразование static_cast. Используйте безопасные альтернативы — от dynamic_cast до перепроектирования.ОбсуждениеПодумайте о замене static_cast более мощным оператором


94. Избегайте преобразований, отменяющих const

Из книги автора

94. Избегайте преобразований, отменяющих const РезюмеПреобразование типов, отменяющее const, может привести к неопределенному поведению, а кроме того, это свидетельство плохого стиля программирования даже в том случае, когда применение такого преобразования вполне


Совет 18. Избегайте vector

Из книги автора

Совет 18. Избегайте vector<bool> Vector<bool> как контейнер STL обладает лишь двумя недостатками. Во-первых, это вообще не контейнер STL. Во-вторых, он не содержит bool.Объект не становится контейнером STL только потому, что кто-то назвал его таковым — он становится контейнером STL лишь


Совет 47. Избегайте «нечитаемого» кода

Из книги автора

Совет 47. Избегайте «нечитаемого» кода Допустим, имеется вектор vector<int>. Из этого вектора требуется удалить все элементы, значение которых меньше х, но оставить элементы, предшествующие последнему вхождению значения, не меньшего у. В голову мгновенно приходит следующее


Избегайте использовать goto  

Из книги автора

Избегайте использовать goto    В принципе вы никогда не обязаны пользоваться оператором goto при программировании на Си. Но если ваш предыдущий опыт связан с работой на Фортране или Бейсике, в каждом из которых требуется его использовать, то у вас могли выработаться навыки


Избегайте настроек

Из книги автора

Избегайте настроек Примите решение о деталяхВы сталкиваетесь с ограничением: сколько сообщений должно быть на странице? Ваша первая мысль сделать выбор 25, 50 или 100. Это легкий выход. Просто примите решение, как сделать лучше. И выберите одно число.Настройки — уход от пути