Почему использование константы считается лучшим стилем программирования, чем использование литерала? - PullRequest
4 голосов
/ 04 декабря 2010

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

Ответы [ 6 ]

14 голосов
/ 04 декабря 2010

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

Вы получаете запрос на обработку новомодных дискет 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

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

2 голосов
/ 04 декабря 2010

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

Например:

x = 3.14 * 3 ^ 2;

против

x = PI * RADIUS ^ 2;

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

1 голос
/ 04 декабря 2010
  • Изменяются некоторые константы, такие как начальное значение некоторой переменной или максимальное число чего-либо.Использование идентификатора позволяет изменять константу везде, где она используется, просто путем изменения одного объявления.Часто константа сначала используется только в одном месте, но может повторяться во многих местах с течением времени.Кроме того, если вы используете идентификатор, у вас есть возможность изменить константу в переменную, если впоследствии вам понадобится выбрать значение во время выполнения.
  • Чтобы действовать в качестве документации.Например, если вы видите if (m > MONTHS_PER_YEAR) вместо if (m > 12), вы можете сделать вывод, что m представляет месяц.(Я обычно не называю все константы, которые установлены в камне, как MONTHS_PER_YEAR; вместо этого m следует назвать «month», чтобы значение 12 стало ясным).код и позволит вам изменить его точность позже (или подчеркнуть «концепцию» над числом, как сказал Уилл).
1 голос
/ 04 декабря 2010

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

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

0 голосов
/ 14 января 2011

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

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

x = y * 100 / 2;

или даже хуже

x = y * 50;

Как кто-то, читающий код, может узнать, в чем заключался замысел автора?

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

x = y * CENTS_IN_DOLLAR / NO_OF_PARKING_METERS;

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

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

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

0 голосов
/ 14 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...