2010-07-10 28 views
18

Il y a quelques jours j'ai démarré un projet open source et quand certains compagnons ont regardé le code sur svn, l'un d'entre eux m'a dit que l'utilisation de break dans une boucle est considérée comme nuisible et ne devrait pas être faite.Briser une boucle "for" en utilisant "break" considéré comme nuisible?

Il a ajouté, cependant, que je trouverais plusieurs cas de break instructions à l'intérieur for boucles sur Linux le code source du noyau, mais c'était juste parce que Linus Torvalds et Chuck Norris ont été autorisés à l'utiliser et personne d'autre.

Qu'en pensez-vous? Je ne vois aucun problème à utiliser break dans une boucle for. À mon avis, émuler le comportement de break en utilisant des variables booléennes ou quelque chose de ce genre ajoute beaucoup de frais généraux et rend le code moins simple.

De plus, il n'y a pas de comparaison possible avec goto, car break ne peut pas changer arbitrairement le flux de programme d'un point à l'autre mensonge goto fait.

+2

Dupliquer la question: http://stackoverflow.com/questions/216359/break-statements-in-the-real-world Et un autre, fermé comme doublon: http://stackoverflow.com/questions/616339/ is-break-evil –

+0

Je pense que «continuer» est considéré comme «nuisible» bien que, dans la même ligue que «goto» (les deux peuvent être utiles, mais les deux peuvent obscurcir le code). 'break' me semble bien, personnellement. –

+2

J'utilise 'break' très souvent, et' continue' assez souvent aussi. Je pense que - et les mêmes choses s'appliquent au multiple existe, Delphi 'while' déclarations, etc., etc. - que dans la plupart des cas quand quelqu'un dit" ne pas utiliser la construction X ", alors il/elle est pas très habitué à écrire des algorithmes complexes et/ou qu'il/elle n'a pas beaucoup d'expérience dans la langue en question. Parce que, si l'on a une grande expérience de la langue en question, alors on sait utiliser cette construction, et si l'on écrit souvent des algorithmes complexes, alors on aimera toutes ces constructions. –

Répondre

42

Je ne vois aucun problème à utiliser des pauses. Il y aura toujours des cas où vous voulez arrêter de traiter une boucle, et utiliser un break; est bien plus logique (et le rend plus lisible!) Que de placer votre compteur de boucle à une valeur qui ferait s'arrêter votre boucle à l'itération suivante.

+7

Je ne vois pas de problème avec l'utilisation de goto. Il y aura toujours des circonstances où vous voulez arrêter de traiter une boucle très imbriquée, et en utilisant goto; a plus de sens (et le rend plus lisible!) que d'avoir des valeurs booléennes pour vous dire quand sortir des boucles. –

39

obligatoire:

XKCD Goto

Le point est que vous ne devriez pas l'éviter purement pour des raisons de mauvaise pratique (ou vélociraptors), mais envisager au cas par cas.

Tout est question de clarté. Comme vous l'avez dit, vous n'avez jamais à l'utiliser, mais dans certains cas, il favorise la lisibilité. C'est utile quand la boucle se termine normalement, mais dans de rares cas, vous devez renflouer. Les boucles qui habituellement (ou toujours) se cassent sont plus d'une odeur de code (mais pourraient toujours être appropriées).

+11

+1 pour fournir une bonne réponse avec cette bande dessinée. Je me souviens avoir vu une réponse fortement mise à jour qui était cette bande dessinée et rien d'autre, pouah. – Maulrus

1

Je pense que cela dépend du contexte. Bien que ce soit un mauvais style de codage dans certaines situations, je ne peux pas penser à un cas où ce serait nuisible.

En fait, dans certains cas, je le recommande. Par exemple, si vous utilisiez une recherche linéaire, dans tous les cas (sauf dans le cas le plus défavorable), un break améliorerait votre vitesse. Je pense que sortir de la boucle quand vous avez trouvé votre aiguille serait parfaitement acceptable, et ce serait plus lisible que de jouer avec la variable de boucle (qui pourrait ne pas être utilisée uniquement pour la boucle, selon votre programme) ou enveloppant le corps de la boucle dans un bloc if. (Et l'autre option, un if qui contient continue, combine le pire des deux mondes. Logique de boucle d'emballage dans un bloc if, et le style pauvre de codage fulminé contre par des gens comme vos amis qui n'aiment pas break)

+0

Vous ne devriez pas recommander une pause sur les terrains de performance. Les compilateurs peuvent généralement optimiser les variables d'état. – Artelius

+0

Fair point. Le point que j'essayais de faire était de savoir si, par exemple, je fais une recherche linéaire sur un grand nombre d'éléments et que je trouve ce que je recherche à l'index 2, je préférerais de loin cesser de regarder plutôt que de continuer à boucler les éléments restants dont je sais que je ne veux pas. Par contre, si je sais que j'aurai un grand nombre d'éléments, je ne ferais probablement pas de recherche linéaire, de toute façon. –

20

Non seulement il n'y a aucun problème à utiliser break, je dirais que quiconque dit que c'est "considéré comme dangereux" est carrément faux. Est une fonctionnalité de langue utilisée pour annuler une boucle - vous pouvez utiliser goto, mais vous encourrez la colère (appropriée) de la bande dessinée XKCD ci-dessous. Vous pouvez utiliser un drapeau dans la condition, mais cela entrave la lisibilité. break est non seulement le moyen le plus simple, mais aussi le plus simple à plusieurs reprises de sortir d'une boucle.Utilisez-le comme il était destiné à être utilisé.


Edit: Pour obtenir à une image plus grande ici: Lorsque vous écrivez du code, le principe directeur de « dois-je utiliser la fonction de la langue X ou Y » doit être « de quelle manière se traduira par plus code élégant "? L'élégance, dans le code, est à peu près un art, mais je l'exposerais comme un équilibre entre la lisibilité et l'efficacité algorithmique (lire: pas de micro-optimisations). La lisibilité va être déterminée par la longueur, la complexité du code, etc. Une boost :: bind d'une ligne peut très bien être plus difficile à lire qu'une boucle de 3 lignes.

Si une fonction de langue peut vous aider à écrire du code plus facile à comprendre pendant le travail, utilisez-la. Ceci s'applique à break, goto, aux exceptions C++, etc. Ne pas suivre un "X est (mal considéré comme dangereux)" aveuglément - appliquer le bon sens et la logique à chaque fois.

2

Il existe un paradigme selon lequel n'importe quelle boucle ne doit avoir qu'un seul point de sortie (la même chose qu'une fonction ne devrait avoir qu'un seul retour). Cela a à voir avec la lisibilité. Trop de points de sortie peuvent rendre le code très difficile à comprendre. En outre, il est important de vérifier le code (c'est-à-dire de vérifier mathématiquement si votre code est correct). Cependant, les directives sont souvent là pour aider, mais ne sont pas strictes. Il y a peut-être des situations où une pause est préférable à ne pas l'utiliser. Par conséquent, on devrait être pragmatique à ce sujet, mais comprendre la raison de ces principes afin de créer un bon code.

1

L'incrémentation de votre compteur de boucles au lieu d'utiliser l'interruption signifie également que vous avez fini d'exécuter l'itération en cours de la boucle, ce qui peut être souhaitable ou non.
Bien sûr, vous pouvez envelopper le reste dans une clause if, puis le faire à nouveau lorsque vous réalisez que vous devez vérifier si oui ou non arrêter de boucler plusieurs fois, et vous vous rendrez vite compte pourquoi les gens utilisent break;

11

Non seulement il n'y a pas de problème avec break, c'est aussi OK to use goto quand break est insuffisant. N'ayez pas peur des retours multiples non plus.

Tout ce qui précède s'applique uniquement s'il facilite la compréhension du code *.

* Et si votre PHB lui permet ...

1

Je suggère cet algorithme si vous envisagez d'utiliser une technique donnée.

  • Si elle est considérée comme une bonne pratique :
    • utiliser.
  • Si elle est pas bonne pratique:
    • l'utiliser que si vous le jugez être la meilleure solution à long terme.
  • Si l'on considère le mal :
    • l'utiliser que si vous le jugez être la meilleure solution à long terme et vous êtes très confiant dans votre jugement. Méfiez-vous: les choses considérées comme mauvaises ont tendance à être trompeuses.

Je classerais break; comme "pas une bonne pratique". Utilisez-le quand il rend le code plus lisible, réduit le risque de bogues, ne complique pas le débogage, etc.

+0

J'utilise le break tout le temps ... –

7

Je pense que votre compagnon est fou. break est parfaitement acceptable, parfaitement lisible et parfaitement maintenable. Période.