Определение констант для 0 и 1 - PullRequest
3 голосов
/ 18 декабря 2009

Мне было интересно, считают ли другие ненужным делать что-то подобное ...

const double RESET_TIME = 0.0;
timeSinceWhatever = RESET_TIME;

, а не просто

timeSinceWhatever = 0.0;

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

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

Ответы [ 8 ]

7 голосов
/ 18 декабря 2009

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

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

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

3 голосов
/ 18 декабря 2009

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

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

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

2 голосов
/ 18 декабря 2009

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

timeSinceWhenever = ResetStopWatch();

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

Temperature groundTemp = Temperature.AbsoluteZero();

Это хороший способ показать, что происходит.

1 голос
/ 18 декабря 2009

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

1 голос
/ 18 декабря 2009

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

0 голосов
/ 18 декабря 2009

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

0 голосов
/ 18 декабря 2009

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

0 голосов
/ 18 декабря 2009

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

...