2010-07-27 5 views
6

Dites si j'ai le code ci-dessous, il est fondamentalement de déterminer que certaines conditions correspondent, puis d'affecter la valeur booléenne, puis d'exécuter des codes. Puis jetez une exception si la valeur booleanValue est false. Que faire si je veux qu'il lève une exception immédiatement si le booleanValue est faux sans exécuter le reste des codes? Si je mets juste la deuxième déclaration conditionnelle dans la première, il y aura des codes dupliqués. S'il vous plaît montrez-moi une manière intelligente de faire ceci (j'ai modifié le code pour ressembler à mes codes réels).Réécriture d'une instruction conditionnelle en Java

boolean booleanValue = false; 
Permission value; 

if (someCondition) { 
    value = getPermission_1(); 
    booleanValue = someMethod(value); 
    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 
    booleanValue = anotherMethod(value); 

    useValue_2(value); 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

Répondre

7

Pourquoi ne pas supprimer la variable booléenne? Vous pouvez réécrire votre code comme ceci:

if (someCondition) { 
    if (!someMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 
else { 
    if (!anotherMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 

Cela semble plus facile à mes yeux, mais ces choses sont une question de goût ...

Avantage supplémentaire: Si l'exception se retrouve dans une pile trace vous savez quelle était la condition parce que vous avez deux déclarations de lancer différentes. Cela peut accélérer un peu le débogage.

+0

J'aime ça parce que ça a l'air simple et clair. – newguy

4

Au lieu de

booleanValue = anotherMethod(); 

vous suffit d'écrire

if(!someMethod()) 
    throw new SomeException(); 

En lançant une exception générique - ne pas. La raison pour laquelle vous lancez une exception est de dire à l'appelant que quelque chose d'exceptionnel s'est produit. Il est presque toujours utile de leur dire quoi, sinon ni l'appelant ni vous ne pouvez rien y faire.

+0

Vous avez raison, mais ce que j'ai demandé est une question différente, c'est pourquoi je n'ai pas mis un nom particulier d'excpetion. – newguy

+1

Juste pour signaler que ce serait if (! SomeMethod()) à conserver avec le code d'origine – MadMurf

+0

En fait, le problème est plus compliqué que cela s'il vous plaît jeter un oeil à mes codes modifiés. – newguy

2

En supposant que les deux some codes... sont différents, vous voudrez probablement faire:

boolean booleanValue = someCondition ? someMethod() : anotherMethod(); 
if(!booleanValue) { 
    throw new Exception(); 
} 

if(someCondition) { 
    // some code 
} else { 
    // some code 
} 

Si elles sont les mêmes le if(someCondition) n'est pas nécessaire


Si (hypothétiquement) vous avez un outil d'analyse statique qui ne permet pas les expressions ternaires, vous pouvez remplacer les premières lignes par:

boolean booleanValue; 
if(someCondition) { 
    booleanValue = someMethod(); 
} else { 
    booleanValue = anotherMethod(); 
} 
+0

C'est un mauvais style de code pour moi. Echouerait à l'étape checkStyle. – newguy

+2

@newguy Eh bien, vous allez devoir définir ce que votre style de code est bon; Je n'ai aucun problème avec ce code –

+0

Mon projet utilise un plugin check style qui n'autorise aucun code comme la première ligne donc je dois obéir à cette règle. – newguy

1

La solution évidente est:

boolean booleanValue = false; 

if (someCondition) { 
    booleanValue = someMethod(); 
    if(booleanValue){ 
     //some codes... 
    } 
} 
else { 
    booleanValue = anotherMethod(); 
    some codes... 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

... mais je ne me dérange pas répéter le bit if(!booleanValue) throw Exception();, car il est probable une raison différente sur le plan conceptuel que vous jetez l'exception. (Vous pourriez fournir une meilleure erreur msg dans votre exception, par exemple.)

+0

Ce n'est pas la solution. Ce que je veux, c'est jeter l'exception immédiatement après que booleanValue ait été assignée, car je ne veux pas que le reste des codes soit exécuté. – newguy

+0

@newguy: regarde encore, s'il te plait. C'est ce que ça fait. Un peu indistinctement à mon goût cependant. Je préfère la réponse donnée par Joel et Nils. –

+0

@newguy: Cette solution vous donne ce que vous avez demandé. Personnellement, je n'aime pas le style, mais c'est probablement la solution avec la différence la moins éditée. – Akusete

1

Tout cela est très subjectif, peut-être?

boolean booleanValue = aBoolean; 
if (someCondition) { 
    if (!someMethod()) { 
     throw new SomeException(); 
    } 
    some codes... 
} else { 
    if (!anotherMethod()) { 
    throw new AnotherException(); 
    } 
    some other codes... 
} 
1

Votre meilleure solution serait ...

if (someCondition) { 
    value = getPermission_1(); 

    if (!someMethod(value)) { 
    throw new SomeException(); 
    } 

    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 

    if (!anotherMethod(value)) { 
    throw new AnotherException(); 
    } 

    useValue_2(value); 
} 

Et vous ne devriez pas regarder comme la duplication de code parce que si vous voulez jeter une exception alors l'attente serait que la raison l'exception serait différente dans chaque cas et donc une exception différente, ou un message différent devrait être passé dans chaque cas.

Je suppose que vous voulez savoir quelle condition a été exécutée et a ensuite échoué, car tout ce que vous obtenez est un booléen de votre ... Méthode appelle la raison de l'échec ne sera probablement pas évident dans cette scénario.

0

Ce genre sent ... comme dans "odeur de code". Une valeur de retour est en cours de traduction en une exception. Il semble que si l'appelant a écrit someMethod et anotherMethod alors la solution est de réécrire ces méthodes et de jeter l'exception de ces méthodes au lieu d'utiliser une valeur de retour. Mais c'est seulement si le programmeur a accès au code. S'il s'agit d'un appel API tiers, je suppose que la traduction doit être effectuée.

Questions connexes