2010-04-07 3 views
12

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

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 

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

ответ

1

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

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

+3

@Thirler Хм, это будет поражение цели короткого замыкания оценка. Я думаю, что в среднем, предполагая равную вероятность и временную сложность x, y, z и q, это будет повышение производительности. Но что, если вероятность z равна 50% и занимает мало обработки, а вероятность q равна 1%, и она занимает 95% от мощности обработки? Посмотрите, как микро-оптимизация может привести к неприятностям без надлежащих показателей? –

+0

Да, нам нужно использовать не более одной переменной, чтобы сделать это. – Halo

+0

@Tim Вам нужны чрезвычайно длинные условия (или код, который выполняется миллионы раз), чтобы это было утечкой производительности.Я, конечно, не оптимизирую (вопрос об этом не говорит), я предлагаю улучшить ремонтопригодность. Если производительность важна, вам необходимо буферизовать результат вычисления прозрачно (скрыть его за функцией, которая сохраняет результат). Обратите внимание, что данный пример дважды выполняет некоторые условия. Но хорошим правилом является не оптимизация вообще, пока вы не увидите, что для выполнения требуется значительное количество времени. – Thirler

1

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

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. 
+2

Ваше последнее утверждение не такое же, как в вопросе, я думаю, вам нужно 'if! (X || y || z || q)' – Thirler

+0

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

+0

Я не вижу, как это «выполняет один дополнительный чек». У вас столько же операторов if :) –

4

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

+1 для использования фигурных скобок. Я хочу, чтобы Java, C++ и другие языки выполняли то, что делает «Go», и делают эти привязки обязательными ... это, безусловно, сделает код более читаемым. –

+0

Да, и я всегда использую фигурные скобки на самом деле, один выше - всего лишь прототип или что-то в этом роде. – Halo

0

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

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

Другой вариант, который позволяет избежать многократного проверки и 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 
} 
+1

спасибо, я думаю, нам нужно инициализировать условие обработано как false – Halo

+0

К сожалению! Спасибо, я исправил это. –

0

вы можете сделать некоторые предположения относительно х, у, г, д? e.G. только один из них может быть правдой. Чем вы могли видеть его в качестве государства

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

    } 
} 

и в вашем коде, где вы использовали, если заявления

можно присвоить состояние и просто делать правильные вещи

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

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

if(x) 
    do_the_next_thing_with_X(); 
... 

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

state.doTheNextThing();