Ответ 1
Это кажется мне совершенно понятным (и ясно, что это хорошо).
Что вы можете сделать, сначала оцените x, y, z и q и сохраните их как переменные, поэтому вам не нужно делать это дважды.
У меня есть эти длинные утверждения, которые я буду называть 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
Есть ли лучший, более короткий способ написать эту вещь? Благодаря
Это кажется мне совершенно понятным (и ясно, что это хорошо).
Что вы можете сделать, сначала оцените x, y, z и q и сохраните их как переменные, поэтому вам не нужно делать это дважды.
Я не вижу большой проблемы с тем, как вы сейчас пишете. Я рекомендую использовать фигурные скобки даже для одиночных операторов 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
}
Другой вариант, который позволяет избежать множественных проверок и сложных логических выражений 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
}
Возможно, это немного легче читать. Но теперь вы выполните один дополнительный чек. Если это не критически важный код, возможно, вы можете использовать следующее:
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.
Я не рекомендую следующее, на самом деле, я думаю, что у вас все хорошо, но:
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;
}
Можете ли вы сделать некоторые предположения относительно 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();