2016-10-21 1 views
5

(Я искал «else if range», но не придумал никаких сообщений, которые отвечали на мой вопрос).Не вредно ли явно указывать диапазоны в операторах if-then-else?

При использовании если .. ElseIf .. еще, чтобы выбрать, что делать, основываясь на переменном в определенных (взаимоисключающими) находится в диапазоне, я хотел бы указать диапазоны явно:

int num = 55; 
String message; 

if (num >= 20) { 
    // update message variable 
    message = "Bigger or equal to than 20"; 
} 
else if (10 <= num && num < 20) { 
    // update message variable 
} 
else if (0 <= num && num < 10) { 
    // update message variable 
} 
else if (num < 0) { 
    // update message variable 
} 

System.out.println(message); 

Но все учебники и конспекты я вижу написать такой пример, как это:

int num = 55; 
String message; 

if (num >= 20) { 
    // update message variable 
    message = "Bigger or equal to than 20"; 
} 
else if (num >= 10) { 
    // update message variable 
} 
else if (num >= 0) { 
    // update message variable 
} 
else { 
    // update message variable 
} 

System.out.println(message); 

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

ответ

2

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

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

Я всегда заканчивал } else {, хотя в идеале с каким-то утверждением, если контроль над программой не должен доходить до этого.

+3

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

+1

Я думаю, что беспокойство, поднятое в [ответе Энди Томаса] (http://stackoverflow.com/a/40183548/5221149), является более реальной проблемой, чем кто-то, перестраивающий последовательность утверждений if-elseif-elseif. Все, что достаточно глупо, чтобы перестроить такую ​​конструкцию, не понимая, что 'else' зависит от' if', нужно уволить. – Andreas

7

Не повторяйте себя.

С вашим подходом вы повторяете одно и то же значение дважды в коде без необходимости. Это имеет несколько недостатков, в том числе:

  • Это облегчает введение ошибок во время обслуживания путем изменения одного из значений, но не другого.
  • Во время выполнения он выполняет избыточную проверку. Если вы находитесь в else if, вы уже знаете, что предыдущее условие было ложным.
  • Код длиннее без добавления дополнительной информации. Требуется больше времени для чтения и дольше проверять.

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

if (num >= 30) { 
    // update message variable 
} 
else if (10 <= num && num < 20) { // Whoops! 
    // update message variable 
} 
... 

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

final int HIGH = 20; 
final int MEDIUM = 10; 
final int LOW = 0; 

if (num >= HIGH) { 
    // update message variable 
} 
else if (MEDIUM <= num && num < HIGH) { // We already know num<HIGH 
    // update message variable 
} 
... 
+0

Как интересно; Я никогда не думал о заботе о «дальнейшем обслуживании». Так что кажется, что за каждым подходом есть плюсы и минусы. Интересно, есть ли отраслевой стандарт, который может дать мне некоторые авторитетные рекомендации? – silph

+1

@silph «последующее обслуживание» всегда вызывает беспокойство в реальной жизни. В школьном задании это может быть не так, но хорошо начать думать так, как есть. – Andreas

+0

@Andreas, но я видел, как чрезмерное производство производит неподъемный код. Размышление о дальнейшем обслуживании часто приводит к идеологии. Идеология приводит к слепому применению шаблонов. – HopefullyHelpful

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

  • Нет связанных вопросов^_^