Почему использование константы считается лучшим стилем программирования, чем использование литерала?

Почему использование константы считается лучшим стилем программирования, чем использование литерала? Каково точное преимущество предыдущего по сравнению с последним?

6 ответов

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

Вы получаете запрос на работу с новыми флеш-дисками 2.8M, и вы думаете о себе: "Ха, мне просто нужно найти код, ищущий 1440, и заменить его на 2880. Простой, а?".

К сожалению, будучи графической программой, 1440 также представляет собой количество твипов в дюйме, поэтому вы обнаружите, что после массового глобального поиска и замены вы можете обрабатывать не только большие диски, но и все ваши изображения - неправильный размер на экране. D'Oh!

Теперь вам нужно вернуться и выяснить, какая из этих строк 1440 была для размера диска и которые были для размера изображения.

Если вы только что разработали свой код:

#define TWIPS_PER_INCH 1440
#define DISK_SZ 1440

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

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

Некоторые экстремисты будут настаивать на том, что единственные жестко запрограммированные константы, которые у вас должны быть в вашей программе, - это -1, 0 и 1 - некоторые из них пойдут еще дальше, но мы можем отбросить сумасшествия:-) Я не совсем к этому но я думаю, что это хорошая идея, чтобы избежать их как можно больше.

Одна вещь, которую я нахожу забавной, это люди, которые делают такие вещи, как:

#define SEVENTY_TWO 72

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

Другая причина - сделать код более читаемым. Если у вас нет математического фона, вы будете в растерянности, когда увидите в своем коде константу типа 1.414. Однако символ SQR_ROOT_OF_2, скорее всего, будет гораздо более понятным. Это то же самое с большинством других констант, например:

SECS_PER_DAY 86400
CUST_ADDR_LINES 7
INVALID_ID -1
DAYS_PER_CENTURY 36524
PASS_LEVEL 63
MIN_REPUTATION 10000
MAX_LOAN_AMT 200000

Скорее всего, у вас есть код с этими цифрами справа, разбросанный по всему, или вы скорее прочитаете код, где лучше всего представлено намерение?


Поскольку константа представляет некоторое понятие, а не значение понятия.

Например:

x = 3.14 * 3 ^ 2;

против

x = PI * RADIUS ^ 2;

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


  • Некоторые константы изменяются, например, начальное значение некоторой переменной или максимальное число. Использование идентификатора позволяет вам изменять константу везде, где она используется, просто изменяя единую декларацию. Часто константа используется только в одном месте сначала, но может повторяться в большем количестве мест с течением времени. Кроме того, если вы используете идентификатор, вы можете изменить константу в переменной, если позже вам нужно будет выбрать значение во время выполнения.
  • Действовать как документация. Например, если вы видите if (m > MONTHS_PER_YEAR), а не if (m > 12), вы можете сделать вывод, что m представляет месяц. (Я обычно не называю все константы, которые установлены на камне, как MONTHS_PER_YEAR, вместо этого m следует называть "месяц", чтобы значение 12 стало понятным).
  • В случае PI, чтобы сократить код и позволить вам позже изменить его точность (или подчеркнуть "концепцию" над числом, как сказал Уилл).


Это просто - вы можете назначить константу один раз и повторно использовать ее много раз. Когда вам нужно изменить его, вы меняете значение один раз. Если вы используете литералы, вы должны поддерживать их все - потенциально сотни давно забытых номеров или строк.

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


Использование констант тесно связано с понятием "магические числа". Не те, которые идентифицируют файлы, а те, которые, по-видимому, определяются магией.

Рассмотрим следующий пример кода:

x = y * 100 / 2;

или даже хуже

x = y * 50;

Как кто-нибудь, читающий код, знает, что было целью автора?

Но если вы сделаете это так:

x = y * CENTS_IN_DOLLAR / NO_OF_PARKING_METERS;

он становится довольно пологим, что y означает сумму денег в долларах, и мы пытаемся разделить их равномерно между двумя парковочными метрами (простите меня за крайне глупый пример).

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

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


Я думаю, что константы лучше, потому что их ценности могут измениться, поэтому изменение должно быть только в одном месте. Но чрезмерное использование констант, как в примере #define SEVENTY_TWO 72, является признаком того, что у человека есть винт.

licensed under cc by-sa 3.0 with attribution.