Est-ce une mauvaise pratique à utiliser break dans une boucle for?
Est-ce une mauvaise pratique à utiliser break
déclaration à l'intérieur d'un for
boucle?
Dire, je suis à la recherche d'une valeur dans un tableau. Comparer à l'intérieur d'une boucle et lorsque la valeur est trouvée, break;
à la sortie de la boucle for.
Est-ce une mauvaise pratique? J'ai vu la solution de rechange: définir une variable vFound
et attribuez la valeur true lorsque la valeur est trouvée et vérifier vFound
dans le for
déclaration de l'état. Mais est-il nécessaire de créer une nouvelle variable pour ce but?
Je fais une demande dans le cadre d'une normale C ou C++ pour la boucle.
P. S: Le Directives de codage MISRA déconseillé d'utiliser la pause.
break
dans la même ligue que goto
🙂Re, je n'ai pas placés dans la même ligue que d'aller...MISRA, les règles stipulent pause, si je me souviens bien.
La seule raison pour laquelle je peux penser à ne pas utiliser de pause à l'intérieur d'une boucle, c'est quand vous avez encore de processus de plus d'éléments susceptibles de modifier le résultat de ce que vous faites...
MISRA règles ont été assouplies: misra.org.uk/forum/viewtopic.le php?f=75&t=298
Dupliqué: programmers.stackexchange.com/a/58253/72317
OriginalL'auteur kiki | 2010-10-13
Vous devez vous connecter pour publier un commentaire.
Beaucoup de réponses ici, mais je n'ai pas vu ce encore mentionné:
La plupart des "dangers" liés à l'utilisation
break
oucontinue
dans une boucle for sont annulés si vous écrivez bien rangé, facilement lisible par les boucles. Si le corps de la boucle s'étend sur plusieurs écran longueurs et a de multiples imbriquée des sous-blocs, oui, vous pouvez facilement oublier que le code ne sera pas exécuté après la pause. Si, toutefois, la boucle est court et au point, le but de l'instruction break devrait être évident.Si une boucle est devenu trop grand, utiliser un ou plusieurs bien-nommé appels de fonction à l'intérieur de la boucle de la place. La seule vraie raison pour éviter de faire est pour le traitement des goulets d'étranglement.
Un autre problème est que la rupture et continuer à causer des problèmes de refactoring. Cela pourrait être un signe que c'est une mauvaise pratique. Le but du code est également plus clair lors de l'utilisation de if.
Ces "bien-nommé d'appel de fonction(s), peut être défini localement lambda fonctions à la place des définis à l'externe les fonctions privées qui ne sont pas utilisés ailleurs.
OriginalL'auteur e.James
Non, la rupture est la bonne solution.
L'ajout d'une variable booléenne rend le code plus difficile à lire et ajoute une source potentielle d'erreurs.
C'est pourquoi j'utilise
goto
de sortir de Niveau 2+ boucles imbriquées - parce qu'il n'est pasbreak(level)
Je préfère mettre la boucle de code dans une fonction, et juste retour. Cela évite le goto, et les pauses de votre code en petits morceaux.
OriginalL'auteur smirkingman
Vous pouvez trouver toutes sortes de professionnels de code avec "casser" des états. C'est parfaitement logique d'utiliser cette chaque fois que nécessaire. Dans votre cas, cette option est préférable à la création d'une variable distincte juste dans le but de sortir de la boucle.
OriginalL'auteur Amit S
À l'aide de
break
ainsi quecontinue
dans unfor
boucle est parfaitement bien.Il simplifie le code et améliore sa lisibilité.
OriginalL'auteur
Loin d'être une mauvaise pratique, Python (et d'autres langues?) étendue de la
for
de la boucle structure d'une partie de celui-ci va seulement être exécuté que si la boucle n'est pasbreak
.De sortie:
Code équivalent sans
break
et à portée de mainelse
:"C-comme la langue" 😛
OriginalL'auteur Nick T
Règle générale: Si à la suite d'une règle qui vous oblige à faire quelque chose de plus délicat et difficile à lire, puis la rupture de la règle, puis briser la règle.
Dans le cas de la boucle jusqu'à ce que vous trouvez quelque chose, vous rencontrez le problème de la distinction trouvé par rapport à introuvable lorsque vous sortez. Qui est:
Donc d'accord, vous pouvez définir un indicateur, ou initialiser un "trouvé" la valeur null. Mais
C'est pourquoi en général je préfère pousser mes recherches sur des fonctions:
Cela permet aussi de mettre de l'ordre dans le code. Dans la ligne principale, "trouver", devient une seule instruction, et quand les conditions sont complexes, ils ne sont écrites qu'une seule fois.
break
, j'essaie de trouver un moyen de refactoriser le code dans une fonction, de sorte que je peux utiliserreturn
à la place.Je suis d'accord à 100% avec vous, il n'y a rien d'intrinsèquement mauvais avec l'aide de pause. Cependant, cela indique généralement que le code c'est peut être extrait dans une fonction où la cassure pourrait être remplacé par retour. Il devrait être considéré comme une odeur de code " plutôt qu'une simple erreur.
Votre réponse pourrait conduire certains à examiner l'opportunité de l'aide de plusieurs instructions return.
OriginalL'auteur Jay
Il n'y a rien d'intrinsèquement mauvais avec l'aide d'une instruction de saut, mais les boucles imbriquées peut prêter à confusion. Afin d'améliorer la lisibilité de nombreuses langues (au moins, Java ne) soutien à la rupture à des étiquettes qui va grandement améliorer la lisibilité.
Je dirai que la pause (et retour), les déclarations d'augmenter la la complexité cyclomatique ce qui le rend plus difficile à prouver code est en train de faire la bonne chose dans tous les cas.
Si vous envisagez de l'utiliser d'une pause lors de l'itération sur une séquence pour certains élément particulier, vous pourriez vouloir reconsidérer la structure de données utilisée pour stocker vos données. En utilisant quelque chose comme un Ensemble ou d'une Carte peut fournir de meilleurs résultats.
.NET programmeurs pourraient vouloir explorer l'utilisation de LINQ comme un potentiel autres complexe
for
boucles.OriginalL'auteur cyber-monk
pause est tout à fait acceptable de déclaration à utiliser (donc continuer, btw). Il est tout au sujet de la lisibilité du code: tant que vous n'avez pas trop compliqué et les boucles, il est très bien.
Ce n'est pas comme s'ils étaient de la même ligue que goto. 🙂
Le problème avec le goto, c'est que vous pouvez la faire pointer n'importe où. La fois pause et de continuer à préserver la modularité du code. Cet argument est du même niveau que d'avoir un seul point de sortie de chaque fonction.
J'ai entendu dire que le fait d'avoir plusieurs points de sortie pour une fonction est effectivement goto. ;D
Le problème avec le goto n'est pas l'instruction goto, c'est l'introduction de l'étiquette que le goto sauts de que la est le problème. Whem vous lire une instruction goto, il n'y a pas d'incertitude sur le flux de contrôle. Quand vous lisez l'étiquette, il y a beaucoup d'incertitude sur le flux de contrôle (où sont tous les gotos que le transfert de contrôle de ce label?). Une instruction de saut de ne pas introduire un label, afin de ne pas introduire de nouvelles complications.
La "pause" est une specialzied goto qui ne peut laisser les blocs. L'historique des problèmes avec les "goto" (1) il peut être, et est souvent, utilisés pour construire le chevauchement de la boucle de blocs dans une manière qui n'est pas possible avec un bon contrôle des structures; (2) une façon courante de faire un "si-alors" construction de qui était d'habitude le "faux" est d'avoir le cas de bifurquer à aucun endroit dans le code, et puis la branche de retour. Cela coûterait deux branches dans les rares cas et zéro dans le cas le plus courant, mais il fait le code à l'air monstrueux.
OriginalL'auteur riviera
Cela dépend de la langue. Alors que vous pouvez éventuellement vérifier une variable booléenne ici:
il n'est pas possible de le faire lorsque itering sur un tableau:
De toute façon,
break
serait de faire les deux codes plus lisible.OriginalL'auteur eumiro
Dans votre exemple, vous ne connaissez pas le nombre d'itérations pour la pour boucle. Pourquoi ne pas utiliser tout boucle de place, ce qui permet le nombre d'itérations à durée indéterminée dès le début?
Il n'est donc pas nécessaire d'utiliser pause statemement en général, comme la boucle peut être mieux indiqué comme un tout boucle.
Dans l'exemple donné, cherchant dans un tableau pour une clé, la boucle for est la bonne idiomatiques construire. Vous n'en avez pas, utilisez une boucle while à marcher à travers un tableau. Vous utilisez une boucle for. (ou une boucle for-each si disponible). Vous faites cela par courtoisie pour les autres programmeurs, comme ils reconnaître les "for (int i=0; i < ra.longueur; i++){}" construire immédiatement comme "Pied à travers le tableau" l'Ajout d'une pause, cette construction est tout simplement un "Quitter tôt si vous le pouvez".
OriginalL'auteur Schedler
Je suis d'accord avec les autres qui vous recommandons d'utiliser
break
. L'évidence consécutifs question est de savoir pourquoi quelqu'un aurait-il recommander? Eh bien... quand vous utilisez pause, vous passez le reste du code dans le bloc, et les autres itérations. Cela entraîne parfois des bugs, par exemple:une ressource acquise au sommet du bloc peut être libéré sur le fond (ce qui est vrai même pour les blocs à l'intérieur de
for
boucles), mais que l'étape de libération peut être accidentellement sauté lors d'un "prématuré" de sortie est causée par unbreak
déclaration (dans "modern" C++ "RAII" est utilisé pour gérer cela dans un fiable et d'exception-sûre: en fait, l'objet de destructeurs de libérer des ressources de manière fiable, peu importe la façon dont un champ d'application est quittée)quelqu'un peut modifier le test conditionnel dans le
for
déclaration, sans remarquer qu'il y a d'autres délocalisée conditions de sortie dendim réponse observe que certaines personnes peuvent éviter
break
s pour maintenir un niveau relativement cohérente de la boucle d'exécution, mais vous étiez en comparantbreak
contre l'usage d'un booléen début de la sortie de variable de contrôle où il n'en est pasChaque maintenant et puis les gens l'observation de ces bugs se rendre compte qu'ils peuvent être évités/atténué par ce "sans casse" la règle... en effet, il y a toute une stratégie connexe pour la "sécurité" de programmation appelé "programmation structurée", où chaque fonction est censé avoir une seule entrée et à la sortie (c'est à dire pas de goto, pas de retour anticipé). Il peut éliminer les quelques bugs, mais sans doute introduit d'autres. Pourquoi font-ils cela?
break
. Le fait de l'éviter, mais a échoué à réfléchir sur les conditions qui ont remplacé l'utilisation de pause.OriginalL'auteur Tony Delroy
Il est parfaitement valide pour utiliser
break
comme d'autres l'ont souligné, il est nulle part dans la même ligue quegoto
.Bien que vous pourriez vouloir utiliser la
vFound
variable lorsque vous voulez vérifier dehors de la boucle, si la valeur a été trouvé dans le tableau. Aussi à partir d'une maintenabilité point de vue, avoir un drapeau commun de signalisation les critères de sortie peut être utile.OriginalL'auteur Ace
Je ne vois pas pourquoi ce serait une mauvaise habitude que vous voulez ARRÊTER complètement le traitement à ce stade.
OriginalL'auteur Cornelius J. van Dyk
J'ai fait un peu d'analyse sur la base de code sur lequel je travaille actuellement (de 40 000 lignes de JavaScript).
Je n'ai trouvé que 22
break
états, de celles-ci:switch
états (nous avons seulement 3 instructions de commutation au total!).for
boucles - un code que j'ai immédiatement classé comme être remaniée dans la séparation des fonctions et remplacé parreturn
déclaration.break
à l'intérieur dewhile
boucle... j'ai courugit blame
pour voir qui a écrit cette merde!Donc, selon mes statistiques: Si
break
est utilisé en dehors deswitch
, c'est une odeur de code.J'ai également recherché
continue
consolidés. Aucune n'a été trouvée.OriginalL'auteur Rene Saarsoo
Dans le monde embarqué, il y a beaucoup de code qui utilise les éléments suivants construire:
C'est un très générique exemple, beaucoup de choses qui se passe derrière le rideau, les interruptions en particulier. Ne pas l'utiliser comme code réutilisable, j'essaie juste d'illustrer un exemple.
Mon opinion personnelle est qu'il n'y a rien de mal avec l'écriture d'une boucle de cette manière, tant qu'il prenne les précautions prises pour empêcher restant dans la boucle indéfiniment.
continue
états à l'intérieur de la logique de l'application. Existe-il?continuer déclarations sont inutiles car vous êtes déjà lié par une boucle infinie. En gros, vous effectuez la logique nécessaire pour atteindre un objectif et si cet objectif n'est pas atteint n nombre de tentatives ou d'une condition de délai d'attente expire, vous sortir de la boucle par une pause de construire et de prendre des mesures correctives ou d'informer l'appelant de code d'erreur. Je vois ce type de code souvent dans l'uCs qui communiquent via un bus commun (RS-485, etc.) En gros, vous avez tenter de s'emparer de la ligne et de communiquer sans collisions, si les collisions se produisent, vous attendez une durée déterminée par un nombre aléatoire et essayez à nouveau.
A l'inverse, si les choses vont bien, vous pouvez également utiliser l'instruction break pour sortir une fois que la condition a été remplie. Compte tenu de ce cas, le code suivant de la boucle est exécuté, et tout le monde est heureux.
"si (call_some_bool_returning_function()) return TRUE; else return FALSE;" pourrait être simplement "retour call_some_bool_returning_function()"
OriginalL'auteur Nate
Dépend de votre cas d'utilisation. Il y a des applications où l'exécution d'une boucle for doit être constante (par exemple, pour satisfaire à certaines contraintes de temps, ou pour cacher vos données internes de timing des attaques).
Dans ces cas, il sera même sens pour définir un indicateur et ne vérifiez la valeur de l'indicateur APRÈS tous les
for
itérations de boucle ont fait exécuter. Bien sûr, tous pour la boucle d'itérations nécessaire pour exécuter le code qui toujours prend environ le même temps.Si vous ne vous souciez pas de la durée d'exécution... utiliser
break;
etcontinue;
pour rendre le code plus facile à lire.OriginalL'auteur ndim
Sur MISRA 98 règles, qui est utilisé sur mon entreprise en dev C, l'instruction break ne doit pas être utilisé...
Edit : interruption est autorisée dans MISRA '04
Je ne sais pas exactement pourquoi, il est interdit (plus personne intelligente que moi ont à y penser...), mais la rupture (et plusieurs retour) sont mieux pour la lisibilité (à mon avis, mais mon avis ne sont pas les entreprises, règles...)
Euh, MISRA règles ne permettent l'utilisation de break : misra.org.uk/forum/viewtopic.le php?f=75&t=298
Nous avons utilisé MISRA 98 règles... Il est exact que MISRA 2004 modifie les règles de
OriginalL'auteur Benoît
Je suis en désaccord!
Pourquoi voulez-vous ignorer la fonctionnalité intégrée d'une boucle for pour faire votre propre? Vous n'avez pas besoin de réinventer la roue.
Je pense qu'il est plus logique d'avoir de vos chèques en haut de votre boucle for comme
ou si vous avez besoin de processus de la rangée d'abord
De cette façon, vous pouvez écrire une fonction pour effectuer tout et faire beaucoup plus propre code.
Ou si votre état est compliqué vous pouvez vous déplacer que de code en trop!
"Code de déontologie" qui est criblé de pauses ne donne pas l'impression code professionnel pour moi. Il sonne comme paresseux de codage 😉
Seulement si elle n'est pas une douleur dans le cul pour maintenir 🙂
J'ai tendance à la pratique "GTFO le plus tôt possible". C'est, si je peux quitter une structure proprement alors je doit le faire dès que possible, et au plus près de la condition qui indique la sortie.
Bien que les travaux de trop. Je pense que l'argument que j'essaie de faire passer est que si vous êtes en utilisant une boucle for, il n'a pas de mal à utiliser ses construit en fonctionnalités pour rendre votre code lisible et modulaire. Si vous avez absolument besoin d'avoir briser les instructions à l'intérieur de la boucle, je voudrais vous asseoir et avoir une réflexion sur le pourquoi de ce niveau de complexité est nécessaire.
Haha. Considérez le fait que la plupart des gens qui décourager
break
dire, que c'est pour la lisibilité du code. Maintenant, regardez à nouveau le fou 5 km de long, une condition dans la boucle ci-dessus...OriginalL'auteur Biff MaGriff
Bien sûr,
break;
est la solution pour arrêter la boucle for ou une boucle foreach. Je l'ai utilisé en php foreach et pour la boucle et trouvé de travail.OriginalL'auteur gautamlakum