En 1967, Edgar Dijkstra a écrit un article dans un magazine spécialisé expliquant pourquoi il fallait éliminer le goto des langages de haut niveau pour améliorer la qualité du code. Tout un paradigme de programmation appelé "programmation structurée" en est issu, bien que tout le monde ne soit pas d'accord pour dire que le goto est automatiquement synonyme de mauvais code.
L'essence de la programmation structurée est essentiellement que la structure du code devrait déterminer son flux plutôt que d'avoir des gotos ou des pauses ou de continuer à déterminer le flux, dans la mesure du possible. De la même manière, les points d'entrée et de sortie multiples d'une boucle ou d'une fonction sont également découragés dans ce paradigme.
Bien entendu, ce n'est pas le seul paradigme de programmation, mais il peut souvent être facilement appliqué à d'autres paradigmes comme la programmation orientée objet (ala Java).
Votre professeur a probablement appris, et essaie d'apprendre à votre classe, que la meilleure façon d'éviter le "code spaghetti" est de s'assurer que notre code est structuré et de suivre les règles implicites de la programmation structurée.
Bien qu'il n'y ait rien d'intrinsèquement "mauvais" dans une implémentation qui utilise break, certains considèrent qu'il est beaucoup plus facile de lire du code où la condition de la boucle est explicitement spécifiée dans la condition while(), et élimine certaines possibilités d'être trop rusé. L'utilisation d'une condition while(true) comporte des pièges qui semblent apparaître fréquemment dans le code des programmeurs novices, comme le risque de créer accidentellement une boucle infinie, ou de créer un code difficile à lire ou inutilement confus.
Paradoxalement, le traitement des exceptions est un domaine où l'on s'écarte de la programmation structurée et où l'on s'attend à ce qu'il en soit ainsi à mesure que l'on progresse dans la programmation en Java.
Il est également possible que votre instructeur ait attendu de vous que vous démontriez votre capacité à utiliser une structure de boucle particulière ou une syntaxe enseignée dans ce chapitre ou cette leçon de votre texte, et bien que le code que vous avez écrit soit fonctionnellement équivalent, vous n'avez peut-être pas démontré la compétence particulière que vous étiez censé apprendre dans cette leçon.
8 votes
Je ne sais pas si l'étiquette "devoirs" s'applique, je voulais plutôt dire que c'était une question de programmation générale, mais je suis d'accord.
24 votes
Demandez à votre professeur, ce genre de choses est assez subjectif.
19 votes
J'ai trouvé cet article utile pour comprendre ce qui est nuisible à propos de goto . La comparaison avec
break
est probablement bien intentionné, mais en réalité mal compris. Peut-être pouvez-vous sensibiliser votre professeur à ce sujet ;) D'après mon expérience, les professeurs ne connaissent pas grand-chose à l'art de la programmation.104 votes
La seule mauvaise chose incontestable à ce sujet est, à mon avis.
do {} while (true)
est équivalent àwhile(true) {}
et cette dernière est de loin la forme la plus conventionnelle et beaucoup plus claire.11 votes
Si quelqu'un n'apprécie pas la puissance expressive simple de
break
ils devraient essayer de programmer dans un langage sans cela. Il suffit de quelques boucles pour que vous le souhaitiez !17 votes
Je ne suis pas d'accord avec l'étiquette "devoirs".
0 votes
do {} while (true);
correspond biendo {} while (false);
. :^)7 votes
Les pauses ne sont pas mauvaises, et sont souvent bonnes. Les pauses étiquetées ne sont pas mauvaises lorsqu'elles sont utilisées avec soin, de manière judicieuse et évidente. Ni l'une ni l'autre n'est équivalente à goto, qui est une un saut complètement arbitraire de n'importe où à n'importe quel endroit .
0 votes
@jprete, pour ajouter à votre commentaire : les pauses étiquetées sont merveilleux pour l'échappement des boucles imbriquées. Les boucles imbriquées doivent être évitées, et par conséquent, les coupures étiquetées doivent l'être aussi. Cependant, si vous en avez besoin, utilisez-les.
4 votes
Si l'échappement break était mauvais, il n'aurait pas été implémenté dans les langages modernes qui évitent plutôt goto. Ceci dit, "Les vrais programmeurs n'ont pas peur d'utiliser les GOTO". soit :)
0 votes
Eh bien "break" ne remplace que quelques "si" et l'utilisation d'un drapeau...
1 votes
Et (dans Delphi) vous avez besoin de Break pour terminer prématurément une boucle for (car dans Delphi vous ne pouvez pas changer la valeur de l'index de l'itérateur dans le corps de la boucle for). Très utile. Je ne voudrais pas avoir à recourir à des boucles while pour itérer sur un tableau ou une collection et "sortir" dès que vous avez trouvé ce que vous cherchiez...
0 votes
@Marjan Venema -- bon point. Mais il est certain que cela nécessite de l'expérience. Les programmeurs qui ne sont pas familiers avec ce mauvais tour de passe-passe comprendront mieux la solution while (c'est-à-dire celle qui remplace le For, et non le while true do... "break").
0 votes
@TheBlastOne : Sortir des boucles for (et des boucles while d'ailleurs) fait partie du "vocabulaire standard de Delphi". Si vous regardez un exemple de code Delphi plus que trivial, vous rencontrerez cette construction assez rapidement/souvent.
0 votes
@Marjan Venema : Oui, je n'étais pas en désaccord sur ce point.
0 votes
J'ai été appelé devant la classe parce que j'ai fait ça à un test. La raison pour laquelle j'ai été appelé est que j'ai fait
do while(true)
pas parce que j'ai utiliséwhile(true)
. Mon professeur a ditdo while true
était confus à lire, et comme undo while true
est fonctionnellement identique à unwhile true
il n'y a aucune raison de ne pas utiliser cette dernière, qui est plus facile à lire directement. Je ne suis pas d'accord avec les gens d'en bas qui disent qu'utiliser unewhile true break
est la même chose que l'utilisation d'un booléen dans l'optionwhile
. Une instruction break est fondamentalement différente, puisqu'elle se termine à cet endroit.1 votes
La réaction académique au code spaghetti dans les langages sans mécanismes de contrôle de flux plus puissants que le
GOTO
a été très forte et si vous acceptez inconditionnellement l'affirmation "GOTO est mauvais", il est très facile d'extrapoler en disant que "tout mécanisme de flux de type GOTO est mauvais". On dirait que c'est ce qui s'est passé ici. J'ai constaté que j'ai rarement besoin debreak
/continue
mais fréquemment pour le remaniement d'une méthode où ils sont alors remplacés par desreturn
.0 votes
Re : Quel est le problème avec
do-while (true)
? En dehors dewhile-do
Pour être plus clair, je pense que la principale raison pour laquelle certains programmeurs chevronnés disent aux étudiants de ne pas utiliserwhile-loops
utiliserfor-loops
au lieu de cela, c'est parce que, dans certaines conditions non prévues, unewhile-loop
peut devenir une boucle infinie, c'est-à-dire potentiellement une condition de course et c'est beaucoup plus difficile/ennuyeux à déboguer. C'est ce que m'a dit une fois quelqu'un dont je respecte le code, mais je ne m'y suis pas attardé. C'est pourquoi je refactore toujours enfor-loop
si je peux. évidemment, ce n'est pas vraiment possible si vous voulez vous casser à l'intérieur de la boucle, à moins que le langage ne le permette.break
surfor-loops
.0 votes
L'équivalent de @Voo ?
while(..){..}
!=do {..} while(..)
puisque l'exécution du do-while est garantie au moins une fois !0 votes
@MartinPfeffer Je garderai cela à l'esprit pour le moment où
true
commence à s'évaluer à false.1 votes
Vous devriez envoyer cette page par e-mail à votre professeur :)
0 votes
Votre professeur est mal informé, ou même mal informé. Cette attitude est courante dans le milieu universitaire, mais inexistante dans le monde réel. Il n'est tout simplement pas vrai que le fait d'agrémenter votre code de booléens supplémentaires ou d'autres variables d'état est supérieur, de quelque manière que ce soit, à l'utilisation de la fonction
break
et il y a de bons arguments formels à avancer. contre état supplémentaire. L'argument de Dijkstra ne tient pas.