Briser une boucle" pour "en utilisant" briser " considéré comme nocif? [dupliquer]
il y a quelques jours, j'ai lancé un projet open source rapide et, lorsque certains collègues ont regardé le code sur svn, l'un d'eux m'a dit qu'utiliser break
déclaration à l'intérieur d'une boucle for
est considéré comme nuisible et ne devrait pas être fait.
il a ajouté, cependant, que je trouverais plusieurs cas de break
déclarations à l'intérieur de for
boucles sur le code source du noyau Linux, mais c'était juste parce que seulement 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, l'émulation du comportement de break
en utilisant des variables booléennes ou quelque chose de semblable ajoute beaucoup de frais généraux nécessaires et rend le code moins simple.
aussi, il n'y a pas de place pour la comparaison avec goto
, parce que break
ne peut pas changer arbitrairement le flux du programme d'un point à l'autre lie goto
faire.
9 réponses
Je ne vois aucun problème à utiliser des pauses. Il y aura toujours des circonstances où vous voulez arrêter de traiter une boucle, et utiliser un break;
a beaucoup plus de sens (et le rend plus lisible!) que de fixer votre compteur de boucle, jusqu'à une valeur qui ferait de votre boucle d'arrêt à l'itération suivante.
obligatoire:
Le point est que vous ne devriez pas éviter purement pour des raisons de mauvaise pratique (ou velociraptors), mais d'envisager au cas par cas.
c'est une question de clarté. Comme vous l'avez dit, vous ne jamais avoir à l'utiliser, mais dans certains cas, il favorise la lisibilité. C'est utile quand la boucle se termine habituellement normalement, mais dans de rares cas, vous devez renflouer. Les boucles qui habituellement (ou toujours) cassent sont plus une odeur de code (mais pourrait toujours être approprié).
non seulement il n'y a aucun problème à utiliser break
, je dirais que quiconque disant qu'il est" considéré comme nocif " est tout à fait faux.
break
est un trait de langage utilisé pour annuler une boucle - vous pouvez utiliser goto
, mais alors vous encourez la colère (appropriée) de la bande dessinée XKCD ci-dessous. Vous pouvez utiliser un indicateur de l'état, mais qui nuirait à la lisibilité. break
n'est pas seulement le moyen le plus facile, mais aussi le plus clair de nombreuses fois pour sortir d'une boucle. L'utiliser comme il était censé être utilisé.
modifier: pour obtenir une vue d'ensemble ici: lorsque vous écrivez du code, le principe directeur à "devrais-je utiliser la caractéristique de langue X ou Y" devrait être "de quelle façon résultera le code plus élégant"? L'élégance, en code, est à peu près un art, mais je dirais que c'est un équilibre subtil entre la lisibilité et l'efficacité algorithmique (Lire: pas de micro-optimisations). La lisibilité va être déterminée par longueur, complexité du code, etc. Un boost d'une ligne:: bind peut très bien être plus difficile à lire et à comprendre qu'une boucle de 3 lignes.
si une caractéristique de langue peut vous aider à écrire du code qui est plus facile à comprendre tout en faisant le travail, puis l'utiliser. Ceci s'applique aux break
, goto
, exceptions C++, etc. Ne suivez pas un" X is (evil|considered harmful) " aveuglément - appliquez le bon sens et la logique à chaque fois.
non seulement il n'y a pas de problème avec break
, c'est aussi OK pour utiliser goto
quand break
est insuffisant. N'ayez pas peur des retours multiples non plus.
toutes les dispositions ci-dessus ne s'appliquent que si le code est plus facile à comprendre*.
*et si votre PHB le permet...
je pense que votre ami est fou. break
est parfaitement acceptable, parfaitement lisible et parfaitement maintenable. Période.
il existe un paradigme selon lequel une boucle ne devrait avoir qu'un seul point de sortie (de même 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. Aussi, il est important si vous voulez faire la vérification de code (c.-à-d. la preuve mathématique si votre code est correct).
Toutefois, les lignes directrices sont souvent là pour aider, mais ne sont pas strictes. Il y a peut-être des situations où une pause est meilleure que ne l'utilisez pas. Il faut donc faire preuve de pragmatisme à cet égard, mais comprendre la raison d'être de tels principes afin de créer un bon code.
incrémenter votre compteur de boucle au lieu d'utiliser break signifie également que vous finissez d'exécuter l'itération actuelle 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 avez besoin de vérifier si oui ou non d'arrêter de boucler plusieurs fois, et vous vous rendrez rapidement compte pourquoi les gens utilisent break;
je suggère cet algorithme si vous envisagez d'utiliser une technique donnée.
- si elle est considérée comme bonne pratique :
- utilisez-le.
- si elle est et non considérée comme une bonne pratique:
- utilisez-le SEULEMENT si vous le jugez être la meilleure solution à long terme.
- si elle est considéré comme mauvais :
- utilisez-le SEULEMENT si vous jugez qu'il s'agit de la meilleure solution à long terme et que vous êtes extrêmement confiant dans votre jugement. Attention: les choses qui sont considérées comme mauvaises ont tendance à être trompeusement attirantes.
je classerais break;
que "pas pratique". Utilisez - le quand il rend le code plus lisible, réduit les risques de bogues, ne complique pas le débogage, etc.
je pense que cela dépend du contexte. Bien qu'il puisse être "mauvais" style de codage dans certaines situations, Je ne peux pas penser à un cas où il serait nocif .
En fait, dans certains cas, je le recommande. Par exemple, si vous utilisiez une recherche linéaire, dans tous les cas (sauf dans le pire des cas), un je pense que sortir de la boucle lorsque 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 envelopper le corps de boucle dans un bloc break
améliorerait votre vitesse. if
. (Et l'autre option, une if
qui contient continue
, combine le pire de deux mondes: la logique de boucle d'enroulement dans un bloc if
, et le style de codage pauvre réprimandé par des gens comme vos amis qui n'aiment pas break
.)