Est-ce une mauvaise pratique d'utiliser une break
instruction dans une for
boucle ?
Dites, je recherche une valeur dans un tableau. Comparez à l'intérieur d'une boucle for et lorsque la valeur est trouvée, break;
pour quitter la boucle for.
Est-ce une mauvaise pratique? J'ai vu l'alternative utilisée: définir une variable vFound
et la définir sur true lorsque la valeur est trouvée et vérifier vFound
la for
condition de l' instruction. Mais est-il nécessaire de créer une nouvelle variable uniquement dans ce but?
Je demande dans le contexte d'une boucle for normale en C ou C ++.
PS: Les directives de codage MISRA déconseillent d'utiliser break.
break
dans la même ligue quegoto
:)Réponses:
Beaucoup de réponses ici, mais je n'ai pas encore vu cela mentionné:
La plupart des «dangers» associés à l'utilisation
break
oucontinue
dans une boucle for sont annulés si vous écrivez des boucles ordonnées et facilement lisibles. Si le corps de votre boucle s'étend sur plusieurs longueurs d'écran et a plusieurs sous-blocs imbriqués, oui, vous pourriez facilement oublier que du code ne sera pas exécuté après la pause. Si, cependant, la boucle est courte et précise, le but de l'instruction break doit être évident.Si une boucle devient trop grande, utilisez plutôt un ou plusieurs appels de fonction bien nommés dans la boucle. La seule vraie raison d'éviter de le faire est le traitement des goulots d'étranglement.
la source
Non, la pause est la bonne solution.
L'ajout d'une variable booléenne rend le code plus difficile à lire et ajoute une source potentielle d'erreurs.
la source
goto
pour sortir des boucles imbriquées de niveau 2+ - car il n'y en a pasbreak(level)
Vous pouvez trouver toutes sortes de codes professionnels avec des instructions «break». Il est parfaitement logique de l'utiliser chaque fois que cela est nécessaire. Dans votre cas, cette option est meilleure que de créer une variable distincte dans le seul but de sortir de la boucle.
la source
Utiliser
break
aussi bien quecontinue
dans unefor
boucle est parfaitement bien.Il simplifie le code et améliore sa lisibilité.
la source
Loin d'être une mauvaise pratique, Python (et d'autres langages?) A étendu la structure de la
for
boucle de sorte qu'une partie de celle-ci ne sera exécutée que si la boucle ne le fait pasbreak
.Production:
Code équivalent sans
break
et que pratiqueelse
:la source
Il n'y a rien de mal en soi à utiliser une instruction break, mais les boucles imbriquées peuvent prêter à confusion. Pour améliorer la lisibilité, de nombreux langages ( du moins Java le fait ) prennent en charge le passage aux étiquettes, ce qui améliorera considérablement la lisibilité.
Je dirai que les instructions break (et return) augmentent souvent la complexité cyclomatique, ce qui rend plus difficile la preuve que le code fait la bonne chose dans tous les cas.
Si vous envisagez d'utiliser une pause lors de l'itération sur une séquence pour un élément particulier, vous voudrez peut-être reconsidérer la structure de données utilisée pour contenir vos données. L'utilisation de quelque chose comme un ensemble ou une carte peut fournir de meilleurs résultats.
la source
for
boucles complexes .break est une instruction tout à fait acceptable à utiliser (ainsi est continue , btw). Tout est question de lisibilité du code - tant que vous n'avez pas de boucles trop compliquées, c'est bien.
Ce n'est pas comme s'ils étaient de la même ligue que goto . :)
la source
Règle générale: si suivre une règle vous oblige à faire quelque chose de plus maladroit et difficile à lire, alors enfreindre la règle, alors enfreignez la règle.
Dans le cas d'une boucle jusqu'à ce que vous trouviez quelque chose, vous rencontrez le problème de distinguer trouvé par rapport à introuvable lorsque vous sortez. C'est:
Alors d'accord, vous pouvez définir un indicateur ou initialiser une valeur "trouvée" à null. Mais
C'est pourquoi en général je préfère pousser mes recherches dans des fonctions:
Cela permet également de désencombrer le code. Dans la ligne principale, "find" devient une seule instruction, et lorsque les conditions sont complexes, elles ne sont écrites qu'une seule fois.
la source
break
, j'essaie de trouver un moyen de refactoriser le code en une fonction, afin que je puisse l'utiliser à lareturn
place.Cela dépend de la langue. Bien que vous puissiez éventuellement vérifier une variable booléenne ici:
il n'est pas possible de le faire lors d'une itération sur un tableau:
Quoi qu'il en soit,
break
cela rendrait les deux codes plus lisibles.la source
Dans votre exemple, vous ne connaissez pas le nombre d'itérations pour la boucle for . Pourquoi ne pas utiliser en place la boucle, ce qui permet le nombre d'itérations à durée indéterminée au début?
Il est donc pas nécessaire d'utiliser pause statemement en général, la boucle peut être mieux comme indiqué en boucle.
la source
Je suis d'accord avec les autres qui recommandent d'utiliser
break
. La question évidente qui en découle est de savoir pourquoi quelqu'un recommanderait le contraire? Eh bien ... lorsque vous utilisez break, vous ignorez le reste du code dans le bloc et les itérations restantes. Parfois, cela provoque des bogues, par exemple:une ressource acquise en haut du bloc peut être libérée en bas (cela est vrai même pour les blocs à l'intérieur des
for
boucles), mais cette étape de libération peut être sautée accidentellement lorsqu'une sortie "prématurée" est provoquée par unebreak
instruction (en "moderne" C ++, "RAII" est utilisé pour gérer cela de manière fiable et sans risque d'exception: en gros, les destructeurs d'objets libèrent des ressources de manière fiable, quelle que soit la façon dont une portée est sortie)quelqu'un peut changer le test conditionnel dans l'
for
instruction sans remarquer qu'il existe d'autres conditions de sortie délocaliséesLa réponse de ndim observe que certaines personnes peuvent éviter
break
s pour maintenir un temps d'exécution de boucle relativement cohérent, mais vous compariezbreak
à l'utilisation d'une variable de contrôle booléenne de sortie précoce où cela ne tient pasDe temps en temps, les gens qui observent de tels bogues se rendent compte qu'ils peuvent être évités / atténués par cette règle "sans interruption" ... en effet, il existe toute une stratégie connexe pour une programmation "plus sûre" appelée "programmation structurée", où chaque fonction est censée avoir un point d'entrée et de sortie unique aussi (c'est-à-dire pas de goto, pas de retour anticipé). Il peut éliminer certains bogues, mais il en introduit sans doute d'autres. Pourquoi font-ils cela?
la source
break
. Ils l'ont évité mais n'ont pas réfléchi aux conditions qui ont remplacé l'utilisation de la pause.Son utilisation est parfaitement valable
break
- comme d'autres l'ont souligné, ce n'est nulle part dans la même ligue quegoto
.Bien que vous souhaitiez peut-être utiliser la
vFound
variable lorsque vous souhaitez vérifier en dehors de la boucle si la valeur a été trouvée dans le tableau. Du point de vue de la maintenabilité également, il pourrait être utile d'avoir un indicateur commun signalant les critères de sortie.la source
J'ai fait quelques analyses sur la base de code sur laquelle je travaille actuellement (40 000 lignes de JavaScript).
Je n'ai trouvé que 22
break
déclarations, parmi lesquelles:switch
instructions (nous n'avons que 3 instructions switch au total!).for
boucles - un code que j'ai immédiatement classé comme devant être refactoré en fonctions distinctes et remplacé parreturn
instruction.break
intérieurewhile
... j'ai courugit blame
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é des
continue
déclarations. Aucun trouvé.la source
Je ne vois aucune raison pour laquelle ce serait une mauvaise pratique à condition que vous souhaitiez terminer le traitement STOP à ce stade.
la source
Dans le monde embarqué, il existe de nombreux codes utilisant la construction suivante:
C'est un exemple très générique, beaucoup de choses se passent derrière le rideau, des interruptions en particulier. N'utilisez pas cela comme code standard, j'essaie juste d'illustrer un exemple.
Mon opinion personnelle est qu'il n'y a rien de mal à écrire une boucle de cette manière tant que des précautions appropriées sont prises pour éviter de rester indéfiniment dans la boucle.
la source
continue
instructions dans la logique de l'application. Sont là?Dépend de votre cas d'utilisation. Il existe des applications où le temps d'exécution d'une boucle for doit être constant (par exemple pour satisfaire certaines contraintes de temps, ou pour cacher vos données internes aux attaques basées sur le temps).
Dans ces cas, il sera même judicieux de définir un indicateur et de ne vérifier la valeur de l'indicateur qu'APRÈS que toutes les
for
itérations de boucle se sont réellement déroulées. Bien sûr, toutes les itérations de la boucle for doivent exécuter du code qui prend toujours à peu près le même temps.Si vous ne vous souciez pas du temps d'exécution ... utilisez
break;
etcontinue;
pour rendre le code plus facile à lire.la source
Sur les règles MISRA 98, qui sont utilisées sur mon entreprise en C dev, l'instruction break ne doit pas être utilisée ...
Edit: la pause est autorisée dans MISRA '04
la source
Bien sûr,
break;
c'est la solution pour arrêter la boucle for ou foreach. Je l'ai utilisé en php dans foreach et for loop et j'ai trouvé que cela fonctionnait.la source
Je ne suis pas d'accord!
Pourquoi ignoreriez-vous la fonctionnalité intégrée d'une boucle for pour créer la vôtre? Vous n'avez pas besoin de réinventer la roue.
Je pense qu'il est plus logique d'avoir vos chèques en haut de votre boucle for comme ça
ou si vous devez d'abord traiter la ligne
De cette façon, vous pouvez écrire une fonction pour tout exécuter et créer un code beaucoup plus propre.
Ou si votre condition est compliquée, vous pouvez également déplacer ce code!
«Code professionnel» qui est criblé de pauses ne me semble pas vraiment un code professionnel. Cela ressemble à du codage paresseux;)
la source
break
soutiennent que c'est pour la lisibilité du code. Maintenant, regardez à nouveau la folle condition de 5 miles de long dans les boucles ci-dessus ...