«Числовая линия» стиль сравнений - PullRequest
1 голос
/ 18 ноября 2009

Я недавно прочитал в Code Complete, что рекомендуемый способ обработки выражений, которые включают числа, состоит в том, чтобы упорядочить их как числовую строку.

В книге есть 2 примера:

if ( (MIN_ELEMENTS <= i) && (i <= MAX_ELEMENTS) )

if ( (i < MIN_ELEMENTS) || (MAX_ELEMENTS < i ) )

В первом примере показано, что i находится между элементами min и max, а во втором примере i находится за пределами диапазона между элементами.

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

Пример:

 if (m_Health > BOSS_HALF_HEALTH) // The way it was

 if (BOSS_HALF_HEALTH <= m_Health) // The "number line" method

Это только я или метод числовых линий кажется менее понятным? Что вы думаете об этой практике?

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

Ответы [ 5 ]

1 голос
/ 18 ноября 2009

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

Таким образом, я бы сделал:

if (i > MIN_ELEMENTS &&
    i <= MAX_ELEMENTS)

вместо:

if ( (MIN_ELEMENTS <= i) && (i <= MAX_ELEMENTS) )

Потому что я читаю по-английски, как

если я меньше мин и больше макс

вместо

если min меньше чем есть и меньше чем max

потому что я забочусь о себе, а не мин.

1 голос
/ 18 ноября 2009

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

Однако я не думаю, что это обязательно применимо, если вы тестируете одиночное условие, такое как m_Health > BOSS_HALF_HEALTH. В этом случае вы сравниваете, является ли что-то (переменная) больше, чем что-то еще. Это совершенно логично, и не нужно заказывать каким-либо определенным образом.

Если бы вы всегда заказывали свои сравнения "числовой линией", вам даже не понадобились бы операторы сравнения > или >=. Они существуют по уважительным причинам.

0 голосов
/ 07 августа 2010

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

Язык - это просто знакомое расположение слов. Как только это становится привычкой, Вы привыкли к этому.

Если вы можете тренировать свой мозг, чтобы читать:

if ( CONST == i )   //[1]

таким же образом, как:

if ( i == CONST)    //[2]

вы никогда не станете жертвой ошибки:

if ( i = CONST)     //[3]

Однако следует отметить, что большинство современных компиляторов сегодня выдают предупреждение о конструкции [3]

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

0 голосов
/ 18 ноября 2009

Работа Стива Макконнелла великолепна, но есть некоторые вещи, с которыми я не согласен. Это может быть одной из тех вещей с вами.

Если вы чувствуете, что он делает ваш код менее понятным, не делайте этого только потому, что Стив Макконнелл считает, что это правильный путь.

0 голосов
/ 18 ноября 2009

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

...