Подтвердить что ты не робот

If-else

У меня есть эти длинные утверждения, которые я буду называть 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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я не вижу большой проблемы с тем, как вы сейчас пишете. Я рекомендую использовать фигурные скобки даже для одиночных операторов 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
}

Ответ 3

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

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

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

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.

Ответ 5

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

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;
}

Ответ 6

Можете ли вы сделать некоторые предположения относительно 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();

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

if(x)
  do_the_next_thing_with_X();
...

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

state.doTheNextThing();