2009-12-18 3 views
3

мне было интересно, другие считают ли это излишним сделать что-то вроде этого ...Определение константы 0 и 1

const double RESET_TIME = 0.0; 
timeSinceWhatever = RESET_TIME; 

, а не просто делать

timeSinceWhatever = 0.0; 

ли вы первый пример помощь в удобочитаемости? Аргумент сводится к использованию магических чисел, и хотя 0 и 1 считаются «исключениями» для правила, я всегда думал, что эти исключения применяются только к инициализации переменных или к доступу к индексу. Когда число имеет смысл, оно должно иметь переменную, связанную с ее значением.

Мне интересно, действительно ли это предположение, или если оно просто избыточно, чтобы дать 0 именованной константе.

ответ

3

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

С вашего собственного примера, что, если REST_TIME должно быть -1,5 из-за какого-то неясного нового бизнес-правила? Вы можете изменить его на одно место, определение константы, или вы можете изменить его везде, где вы в последний раз использовали 0.0, как плавающий литерал.

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

1

Я бы определил его только в том случае, если бы был когда-либо шанс, что RESET_TIME может быть чем-то иным, чем 0.0, таким образом вы можете внести одно изменение и обновить все ссылки. В противном случае 0.0 - лучший выбор для моего глаза, так что вам не нужно отскакивать назад и видеть, что было определено для RESET_TIME.

+0

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

0

Ну, предположим, что RESET_TIME часто используется в вашем коде и вы хотите изменить значение, лучше сделать это один раз, а не в каждом утверждении.

-1

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

7

Ну, в вашем конкретном примере не имеет смысла использовать константу.

Но, например, если бы был небольшой шанс, что RESET_TIME изменится в будущем (и станет, допустим, 1), то вы обязательно должны использовать константу.

Вы также должны использовать константу, если ваше намерение не является очевидным из числа. Но в вашем конкретном примере я думаю, что timeSinceWhatever = 0; более ясно, чем timeSinceWhatever = RESET_TIME.

+0

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

2

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

timeSinceWhenever = ResetStopWatch(); 

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

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

0

лучше, чем константа, сделать ее конфигурационной переменной и установить ее значение по умолчанию. Но да, RESET_TIME более читабельна, если ее использовать несколько раз, иначе просто используйте комментарий к коду.

1

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

Смежные вопросы