2010-04-07 9 views
12

J'ai ces longues instructions que je désignerai par x, y, etc. ici. Ma condition la structure de déclarations se présente comme suit: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 

Y at-il une meilleure, plus courte façon d'écrire cette chose? Merci

Répondre

1

Cela semble assez clair pour moi (et clair est bon).

Ce que vous pouvez faire est d'abord d'évaluer x, y, z et q et de les stocker en tant que variables afin que vous n'ayez pas à le faire deux fois.

+3

@Thirler Hmm, qui vaincra le but de court-circuit évaluation. Je pense qu'en supposant une probabilité et une complexité temporelle égales de x, y, z et q, cela représenterait une amélioration des performances. Mais que faire si la probabilité de z est de 50% et prend peu de traitement alors que la probabilité de q est de 1% et qu'il faut 95% de la puissance de traitement? Voyez comment la micro-optimisation peut vous causer des problèmes sans paramètres appropriés? –

+0

Oui, nous devons utiliser au plus une variable pour faire cette vérification – Halo

+0

@Tim Vous avez besoin de conditions extrêmement longues (ou du code qui est exécuté des millions de fois) pour que cela soit un drain de performance.Je n'optimise certainement pas (la question n'en parle pas), je suggère d'améliorer la maintenabilité. Si les performances sont importantes, vous devrez tamponner le résultat du calcul de façon transparente (le cacher derrière une fonction qui stocke le résultat). Notez que l'exemple donné exécute deux fois certaines conditions. Mais une bonne règle n'est pas d'optimiser du tout jusqu'à ce que vous voyiez qu'il faut beaucoup de temps pour s'exécuter. – Thirler

1

Peut-être que c'est un peu plus facile à lire. Mais maintenant vous allez effectuer un contrôle supplémentaire. Si ce n'est pas la mission de code critique alors peut-être vous pouvez utiliser les éléments suivants:

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

Votre dernière déclaration n'est pas la même que dans la question, je pense que vous avez besoin de 'si! (X || y || z || q)' – Thirler

+0

et en utilisant else est mieux je suppose, pour la lecture. Vous savez, en vous assurant que nous n'avons pas laissé de trous – Halo

+0

Je ne vois pas comment cela 'fait un contrôle supplémentaire'. Vous avez le même nombre de déclarations si après tout :) –

4

Je ne vois pas un gros problème avec la façon dont vous écrivez maintenant. Je recommande d'utiliser des accolades même pour des blocs if-statement simples. Cela vous aidera à éviter les erreurs si vous devez ajouter plus de lignes de code plus tard (et oublier d'ajouter les accolades alors). Je le trouve plus lisible aussi. Le code ressemblerait à ceci alors:

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 pour utiliser les accolades. Je souhaite que Java, C++, et d'autres langues feraient ce que "Go" fait et rendent ces accolades obligatoires ... cela rendrait certainement le code beaucoup plus lisible. –

+0

oui et j'utilise toujours des accolades en réalité, celle ci-dessus est juste un prototype ou quelque chose. – Halo

0

Je ne recommande pas ce qui suit, en fait, je pense que ce que tu as est bien, mais:

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

Une autre variante qui évite les multiples vérifications et les expressions logiques complexes errorprone pourraient être:

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

merci, je pense que nous devons initialiser conditionhandled comme faux – Halo

+0

Oups! Merci, j'ai réparé ça. –

0

Pouvez-vous faire des hypothèses sur x, y, z, q? e.G. juste l'un d'eux peut être vrai. Que vous pouvez le voir en tant qu'Etat

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

    } 
} 

et dans votre code où vous avez utilisé l'instruction if

vous pouvez attribuer un état et faire juste la bonne chose

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

Si vous n'aime pas les enums L'état pourrait être une interface et X à Q pourrait être l'implémentation de classes. Les avantages dans ce cas sont dans l'utilisation multiple de la même construction sinon. Dites quelques lignes de code vous plus tard commencer par

if(x) 
    do_the_next_thing_with_X(); 
... 

ou vous pouvez simplement prolonger votre ENUM avec une autre fonction et faire un seul appel

state.doTheNextThing(); 
Questions connexes