структура if-else - PullRequest
       16

структура if-else

12 голосов
/ 07 апреля 2010

У меня есть эти длинные утверждения, которые я буду называть здесь x, y и т. Д.Структура моих условных операторов выглядит следующим образом:

if(x || y || z || q){
    if(x)
       do someth
    else if (y)
       do something

    if(z)
       do something
    else if(q)
       do something
}
else
    do smthing

Есть ли лучший, более короткий способ написать эту вещь?Спасибо

Ответы [ 6 ]

4 голосов
/ 07 апреля 2010

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

boolean conditionhandled = false;
if (x) {
   do something
   conditionhandled = true;
} else if (y) {
   do something
   conditionhandled = true;
}

if (z) {
   do something
   conditionhandled = true;
} else if (q) {
   do something
   conditionhandled = true;
}

if (!conditionhandled) {
   do something
}
4 голосов
/ 07 апреля 2010

Я не вижу большой проблемы с тем, как вы пишете это сейчас. Я рекомендую использовать фигурные скобки даже для отдельных операторов if-блоков. Это поможет вам избежать ошибок в случае, если вам придется добавить больше строк кода позже (и тогда вы можете забыть добавить фигурные скобки). Я также нахожу это более читабельным. Код будет выглядеть так:

if (x || y || z || q) {
    if (x) {
       do something
    } else if (y) {
       do something
    }

    if (z) {
       do something
    } else if (q) {
       do something
    }
} else {
    do something
}
1 голос
/ 07 апреля 2010

Может быть, это немного легче читать. Но теперь вы выполните одну дополнительную проверку. Если это не критически важный код, возможно, вы можете использовать следующее:

if (x)
  do something;
else if (y)
  do something;

if (z)
  do something;
else if(q)
  do something;

if !(x || y || z || q)
  do something completely different.
1 голос
/ 07 апреля 2010

Мне это кажется довольно понятным (и ясно, что это хорошо).

Что вы можете сделать, это сначала оценить x, y, z и q и сохранить их как переменные, чтобы вам не приходилось делать это дважды.

0 голосов
/ 12 августа 2012

Можете ли вы сделать некоторые предположения о x, y, z, q? например. только один из них может быть правдой. Чем вы могли бы видеть это как государство

enum State {
X{
  void doSomething(){
    doItTheXWay();
  }  
},
Y{
  void doSomething(){
    doItTheYWay();
  }  
},
Z{
  void doSomething(){
    doItTheZWay();
  }  
},
Q{
  void doSomething(){
    doItTheQWay();
  }  
};
  void doSomething(){

  }
}

и в вашем коде, где вы использовали операторы if

Вы можете назначить состояние и просто сделать правильную вещь

State state = getAState();
state.doSomething();

В случае, если вам не нравятся перечисления, State может быть интерфейсом, а X to Q могут реализовывать классы. Преимущества в этом случае заключаются в многократном использовании одной и той же конструкции if else. Скажите несколько строк кода позже, вы начнете с

if(x)
  do_the_next_thing_with_X();
...

или вы можете просто расширить свое перечисление другой функцией и сделать один единственный вызов

state.doTheNextThing();
0 голосов
/ 07 апреля 2010

Я не рекомендую следующее, на самом деле, я думаю, что вы получили, это хорошо, но:

s = true;
if (x) {
    do something;
    s = false;
} else if (y) {
    do something;
    s = false;
}
if (z) {
    do something;
    s = false;
} else if (q) {
    do something;
    s = false;
}

if (s) {
    so something;
}
...