9
votes

Quels sont de meilleurs moyens d'éviter le do-tandis que (faux); pirater en Java?

Lorsque le flux de code est comme ceci:

do {
    if(!check()) break;
    ...
    ...
    if(!check()) break;
    ...
    ...
    if(!check()) break;
    ...
    ...
} while(false);


6 commentaires

Certaines des réponses sont toujours tenues - la déplaçant dans sa propre fonction et en utilisant le retour par exemple.


@Marounmaroun Parce que vous pouvez avoir ceci 20 fois dans une fonction pour passer 20 étapes en série. Si je le fais comme ceci, la finale si elle glisse déjà 20 onglets à droite, ce qui rend le code illisible.


Je ne suis pas une personne religieuse, mais je croyais vraiment que "goto" n'est pas la bonne réponse pour rien de ce qui concerne Java.


@Quirliom j'ai ajouté une phrase à la question, pourquoi ce n'est pas bon, malheureusement que vous étiez beaucoup trop vite :) quelles autres réponses sont toujours tenues? Je ne vois rien.


Le faire et tandis que (faux); les pièces sont inutiles - utilisez simplement un blocage simple. ( {if (! check ()) cassez;} )


@Kenyakornketsombut Il y avait un soutien de goto en Java une fois mais a été supprimé comme il y a de meilleures solutions (que je compterais c ++ à, aussi bien): Stackoverflow.com/a/4547764/180538 à côté du fait, que la réponse goto sur le poste lié a été noth" la meilleure réponse pour C ++ "(au moins si vous envisagez des upvotes)


4 Réponses :


6
votes

Pour réduire le Complexité cyclomatique , vous pouvez séparer les logiques en soumethodes:

public void go() {
    first();
}

public void first() {
    if(check()) {
        // #1
        second();
    }
}

public void second() {
    if(check()) {
        // #2
        third();
    }
}

public void third() {
    if(check()) {
        // #3
    }
}


1 commentaires

Merci pour votre réponse. Oui, vous avez raison de la complexité. Néanmoins, dans cette question, l'accent est davantage sur la lisibilité et la beauté de la Code. La vitesse n'est pas l'objectif principal. Je suppose quand même que les compilateurs modernes JIT géreront cette amende.



2
votes

Parce que vous pouvez avoir ceci 20 fois dans une fonction pour passer 20 étapes en série. Si je le fais comme ceci, la finale si elle glisse déjà 20 onglets à droite, ce qui rend le code illisible. P>

Ce commentaire de la vôtre montre le problème: vous imaginez la mauvaise structure de code. P>

Par exemple, votre code est comme celui-ci P>

public void method() {
    if (bool) {
        doSomeStuff();
    }
}

public void doSomeStuff() {
    if (anotherBoolean) {
        doThirdStuff();
    }
}

public void doThirdStuff() {
    if (thirdBoolean) {
        doEvenMore();
    }
}

public void doEvenMore() {
    // deeper structure
}

2 commentaires

Merci pour cette contribution. Dans mon cas, j'ai 4 méthodes dans ma classe et ils gèrent plus de 6 booléens. Je devrais donc ajouter 24 méthodes à la classe. Maintenant, essayez de trouver 24 noms différents pour les méthodes. D'accord, je suis agité, cela dépend de mon code actuel. Au lieu de trouver plus de noms, je pourrais ajouter des paramètres, etc. Pour que votre solution puisse fonctionner pour des cas spécifiques. Je pensais que quelqu'un pourrait avoir quelque chose de refroidisseur à l'esprit comme un commutateur, des captures d'exception ou des importations statiques. Autre chose que de créer de nouvelles méthodes.


Si vos 6 booléens représentent une sorte d'états, vous pouvez essayer énum et les utiliser dans une déclaration de cas de commutation. J'utilise cela pour la manipulation des entrées, par exemple. État.primé, libération, déplacement, aucune et etc. Méthodes d'appel en fonction de cet état.



1
votes

C'est une bonne question. La sémantique de toute solution doit impliquer une sorte de bloc excitable, littéral ou implicite par la mise en oeuvre pouvant être excitée.

Certaines des autres réponses sont si compliquées qu'ils obtiennent en évitant la boucle DO-While, perdent toute la clarté et la lisibilité, ce qui en fait un "mauvais" code.

Après une pensée, c'est comme ça que je voudrais le coder: xxx p> points principaux:

  • Une méthode est un bloc, qui est proprement édité par retour
  • Les trois parties fonctionnent clairement comme une unité de programmation, ainsi ensemble, ils sont un candidat à chaîne pour refactoring dans une méthode distincte
  • pas de "inventaire", tels que la construction de la construction de la tâche assure (FALSE), qui n'existe que pour fournir un bloc extatable et qui peut confondre les autres
  • En utilisant des tests négatifs, alors que vous sortez, deux choses sont obtenues:
    • le paradigme de codage "EXIT précoce"
    • Moins d'indentation / nichement, qui réduit le Complexité cyclique
    • aucun bloc supplémentaire / classes / objets / objets ne sont créés, de maintenir la lisibilité et les performances (bien qu'un cadre soit poussé sur la pile pour l'appel de méthode - un impact négligeable

1 commentaires

Hein? Downvote? Soin de partager pourquoi? L'approche me semble correcte (bien même).



6
votes

Qu'est-ce que c'est "alors que (false)" Nonsence? Utilisez une étiquette!

myLabel: {
    if(!check()) break myLabel;
    ...
    ...
    if(!check()) break myLabel;
    ...
    ...
    if(!check()) break myLabel;
    ...
}


1 commentaires

J'accepte cela, car il est significativement proche de la source d'origine. Bien sûr, les autres réponses sont également très bonnes. Celui-ci aborde exactement le problème que les utilisateurs C ++ (et Java) ont et évidemment, il existe une solution très facile en Java. Merci pour cette contribution.