2010-04-07 12 views
12

ho questi lunghi affermazioni che identificheremo come x, y ecc qui. struttura mie istruzioni condizionali va in questo modo:if-else struttura

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 

C'è un modo migliore e più breve di scrivere questa cosa? Grazie

risposta

1

Questo sembra abbastanza chiaro per me (e chiaro è buono).

Che cosa si può fare è prima di valutare x, y, z e q e memorizzare quelli come variabili in modo da non dovete fare che per due volte.

+3

@Thirler Hmm, che sconfiggerà lo scopo del cortocircuito valutazione. Penso che in media assumendo uguale probabilità e complessità temporale di x, y, z e q questo sarebbe un aumento delle prestazioni. Ma cosa succede se la probabilità di z è del 50% e richiede poca elaborazione mentre la probabilità di q è dell'1% e richiede il 95% della potenza di elaborazione? Scopri come la micro-ottimizzazione può metterti nei guai senza un'adeguata metrica? –

+0

sì, abbiamo bisogno di utilizzare al massimo una variabile per fare ciò controllo – Halo

+0

@Tim Hai bisogno di condizioni estremamente lunghe (o codice che viene eseguito milioni di volte) per questo è un drenaggio delle prestazioni.Non sto certamente ottimizzando (la domanda non ne parla), sto suggerendo di migliorare la manutenibilità. Se le prestazioni sono importanti, è necessario memorizzare in modo trasparente il risultato del calcolo (nasconderlo dietro una funzione che memorizza il risultato). Si noti che l'esempio fornito esegue alcune condizioni due volte. Ma una buona regola non è quella di ottimizzare affatto finché non si vede che ci vuole molto tempo per l'esecuzione. – Thirler

1

forse questo è un po 'più facile da leggere. Ma ora eseguirai un controllo extra. Se non è mission critical codice allora forse è possibile utilizzare il seguente:

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

La tua ultima affermazione non è la stessa della domanda, penso che tu abbia bisogno di 'if! (X || y || z || q)' – Thirler

+0

e usare else è meglio, credo, per la lettura. Sai, assicurandoci che non abbiamo lasciato i buchi – Halo

+0

Non vedo come questo 'esegue un controllo extra'. Hai lo stesso numero di istruzioni if ​​dopo tutto :) –

4

Non vedo un grosso problema con come si scrive ora. Io raccomando l'uso di parentesi graffe anche per i blocchi if di singola istruzione. Questo ti aiuterà a evitare errori nel caso tu debba aggiungere più righe di codice in seguito (e potrebbe quindi dimenticare di aggiungere le parentesi graffe). Lo trovo più leggibile pure. Il codice sarebbe simile a questa, allora:

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 per usare parentesi graffe. Vorrei che Java, C++ e altri linguaggi facessero ciò che fa "Go" e rendessero obbligatorie quelle parentesi .... renderebbe sicuramente il codice molto più leggibile. –

+0

sì e io uso sempre le parentesi graffe in realtà, quello sopra è solo un prototipo o qualcosa del genere. – Halo

0

non sto raccomandando i seguenti, in realtà, penso che quello che hai va bene, ma:

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

Un'altra variante che evita il multiplo controlli e le complesse errorprone espressioni logiche potrebbero essere:

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

grazie, penso che abbiamo bisogno di inizializzare conditionhandled come falso – Halo

+0

Oops! Grazie, ho risolto questo. –

0

si può fare alcune ipotesi circa x, y, z, q? e.G. solo uno di loro può essere vero. Di quanto si potrebbe vederlo come uno Stato

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

    } 
} 

e nel codice in cui è stato utilizzato l'istruzioni if ​​

è possibile assegnare uno stato e basta fare la cosa giusta

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

Nel caso in cui non mi piace lo stato enumerazione potrebbe essere un'interfaccia e X a Q potrebbe essere l'implementazione di classi. I vantaggi in questo caso sono nell'uso multiplo dello stesso se altro costrutto. Dicono alcuni codeline tardi si sarebbe cominciare con

if(x) 
    do_the_next_thing_with_X(); 
... 

o si può solo estendere la vostra enum con un'altra funzione ed effettuare una singola chiamata

state.doTheNextThing(); 
Problemi correlati