On m'a toujours appris à avoir une sortie des fonctions et d'écrire du code qui ne saute pas partout dans la place, est le mauvais code suivant ou y a-t-il une meilleure façon d'écrire la boucle sans avoir besoin d'une "sortie" ?
dim dt as datatable = FillDataTableFunction() dim bWrite as boolean = false for each row as datarow in dt.rows if row.item("somecolumn") <> string.empty then bWrite = true exit for end if next if bWrite then 'do stuff end if
10 Réponses :
I Signalant que cela a été considéré comme une mauvaise pratique aussi. Cependant, je ne pense pas que cela soit considéré comme une mauvaise pratique. En fait, je peux lire votre code assez facilement: c'est la fin des programmes bien écrits, je suppose ...
Cependant, em>, il y a une autre étape que tout le monde peut changer pour améliorer son / Son code: Dans la boucle, vous essayez de trouver la première ligne qui a un élément qui correspond à une condition. Si vous programmez plus de manière «fonctionnelle» (je ne sais pas exactement quelles installations de VB à cet égard, mais c'est toujours une bonne considération de design), disons: p> Notez comment la boucle entière est condensée dans une description schématique de ce que vous recherchez. Cette "façon de penser" Je considère que c'est beaucoup plus important que si vous utilisez la sortie ou un complexe pendant la condition ... P> P>
* chante * C'est la fin des programmes bien écrits que nous le savons, c'est la fin des programmes bien écrits que nous le connaissons ... et je me sens bien! scnr i>
Avoir une seule sortie de votre fonction est plus d'une ligne directrice qu'une règle difficile et rapide - faites ce que vous préférez. Personnellement, je préfère rendre les choses dès que possible. P>
Le code que vous avez collé semble bien pour moi, et pas du tout Spaghetti - vous êtes court-circuitez votre boucle, afin d'éviter de devoir boucler 100 000 rangées si vous trouvez votre réponse dans les 100 premiers. Dans ce cas, je dirais que votre sortie est entièrement justifiée. P>
Qu'est-ce que vous parlez de "code spaghetti" est l'utilisation de l'ancien mot-clé "goto" qui a été fortement utilisé dans le passé. (par exemple: montage, gwbasique, etc.). p>
Utilisation de pauses pour sortir des structures de boucle et des structures de décision est parfaitement naturelle. P>
"J'ai toujours été enseigné" - à un moment de la vie, les gens commencent à apprendre plutôt qu'à être enseignés: -) p>
Ne prenez pas rien em> comme évangile (même de moi - si vous êtes en désaccord, faites votre propre esprit). Regardez derrière les directives pour voir pourquoi em> ils existent. P>
La raison pour laquelle vous avez appris que plusieurs points de sortie sont mauvais, c'est parce qu'ils conduisent souvent à un code difficile à suivre. En d'autres termes, une fonction de 400 lignes poivrée avec des déclarations code> de retour code> est difficile à analyser en termes de comportement. P>
Votre petit extrait de code ne souffre pas de cela. La ligne directrice que je suive est la suivante: Si vous pouvez voir le flux de contrôle sur un seul écran de l'éditeur, c'est bien. Et, étant donné que 12 lignes conviendront dans tout éditeur que j'ai utilisé au cours des deux dernières décennies, votre code est très lisible. P>
En fait, j'ai vu du code de "Ne jamais utiliser plusieurs points de sortie" des personnes beaucoup moins lisibles que celle produite en brisant leurs règles. Il implique généralement des énoncés multi-conditions Viser la lisibilité. Si les directives aident avec cela, utilisez-les. Sinon, jetez-les la fenêtre. P> tandis que code> ainsi convolu qu'ils doivent la casser sur plusieurs lignes et que c'est toujours une douleur à analyser. P>
+1 pour une réponse véritablement sensible. (Heck, je donnerais ce +10 si je pouvais)
Il y a beaucoup plus à considérer que simplement si une commande spécifique est bonne ou mauvaise. Cela dépend beaucoup de la situation. P>
Dans un simple code de code comme votre exemple, il est probablement plus lisible d'utiliser une sortie que d'essayer de le mettre dans la logique de la boucle. Comme le code qui sort de la boucle est si proche de l'endroit où il se termine, c'est Spaghetti-Ness a un impact aussi important qu'il est dérégué par combien de plus complexe la boucle a dû faire la même chose. P>
S'il y a beaucoup plus de code, il peut être difficile de suivre où une sortie se retrouverait réellement et quel effet qui aurait sur le reste du code, donc dans ce cas, il peut y avoir un point pour essayer de garder un seul point de sortie. p>
Les instructions telles que la sortie ont une tendance héritée de spaghetti, car elles font un saut à un point différent du code, mais si le saut est proche, il ne perturbera pas le flux plus que par exemple une déclaration IF. P >
Une autre chose à considérer est la fréquence à laquelle une commande spécifique est utilisée. Si une construction spécifique est souvent utilisée, il est plus probable qu'il soit compris. P>
Goto considéré comme nocif
Dans le code moderne, regarde cela. Dans ce qui précède, vous quittez la fonction tout ensemble de la boucle - il y a donc deux points de sortie, l'un non plus où vous pourriez penser que cela devrait être. Le retour est «caché» dans les autres lignes de la boucle et peut être manquée par le lecteur. p> p>
En fait, non, ça ne le fait pas. GOTO considéré comme nocif est Seulement B> sur les goto à l'envers, et avec la raison. Parce qu'avec uniquement l'avant de goto, vous pouvez toujours lire un programme, et dans votre tête, gardez une trace des États du programme éventuels (alors que les goto à l'envers, vous auriez pu arriver de l'avenir). Je suis d'accord pour dire que les points de sortie multiples sont déroutants, mais c'est un problème assez différent (et moins important).
La sortie est socialement acceptable, car elle laisse efficacement la boucle en bas. L'important est de rendre le code facile à comprendre, en particulier pour vous dans quelques mois lorsque vous avez oublié ce que vous avez fait aujourd'hui. Si vous avez l'habitude d'utiliser la sortie, il sera probablement plus facile de reconnaître en un coup d'œil que toute autre méthode de quittant la boucle. P>
De nombreuses "règles" des langues (langues humaines ou langues informatiques) existent parce que des personnes qui ont eu un sentiment de ce qui semblait bien et ce qui semblait que Icky voulait aider les autres à écrire bien, et a donc essayé d'identifier ce qui fait "bonne" affaire différent de «icky». Ce n'est pas une adhésion (ou son absence) à une règle qui fait quelque chose de bien (ou de mauvais). Au contraire, c'est le fait que les choses qui suivent la règle sont généralement meilleures que celles qui ne le font pas, qui ont conduit à écrire la règle en premier lieu. P>
Je ne suis pas terriblement désireux de "sortir pour"; J'ai tendance à penser que dans la plupart des cas où une boucle pour la prochaine sortie, un autre type de boucle aurait été meilleur. Néanmoins, il y a des endroits où une sortie précoce pour la prochaine boucle "se sent" à droite, et je vais donc l'utiliser. Je suis le plus apte à la sortie précoce d'une boucle pour la prochaine boucle si l'attente est que la boucle fonctionnera à l'achèvement, mais jetant une exception pour le cas de sortie précoce ne se sentirait pas bien. P>
Il n'y a pas beaucoup de mal avec votre extrait de code.
C'est probablement plus une question de goût, mais je l'appuierais dans une fonction séparée: p> ou, utilisez linq: p>
Ceci est le code que je dois travailler
Je suppose que c'est comme
casse code> dans d'autres langues? Si tel est le cas, nous avons eu quelques questions à ce sujet et il est généralement convenu qu'il s'agit d'une restriction inutile et souvent néfaste.
Je ne connais pas avec VB, alors je suis quelque peu deviner à ce qui se passe, mais je pense avoir l'idée. Quoi qu'il en soit, on m'a appris à utiliser un certain temps ou tout moment / répéter jusqu'à la boucle lorsque vous devrez peut-être quitter "tôt".
J'ai posé une question similaire il y a quelque temps il y a quelque temps: Stackoverflow.com/questions/2071764/...