Question

goto est presque universellement découragée. Est d'utiliser cette déclaration jamais utile?

Était-ce utile?

La solution

Cela a été discuté à plusieurs reprises sur Stack Overflow, et Chris Gillum résume les utilisations possibles de goto :

  

Cleanly la sortie d'une fonction

     

Souvent, dans une fonction, vous pouvez allouer des ressources et la nécessité de sortir à plusieurs endroits. Les programmeurs peuvent simplifier leur code en mettant le code de nettoyage des ressources à la fin de la fonction tous les « points de sortie » de la fonction serait goto l'étiquette de nettoyage. De cette façon, vous n'avez pas à écrire du code de nettoyage à chaque « point de sortie » de la fonction.

     

Exiting boucles imbriquées

     

Si vous êtes dans une boucle imbriquée et la nécessité de sortir de tous boucles, un goto peut faire ce beaucoup plus propre et plus simple que les déclarations de rupture et si-chèques.

     

Amélioration de la performance à faible niveau

     

Ceci est valable uniquement dans le code PERF-critique, mais goto EXECUTE très rapidement et peut vous donner un coup de pouce lors du déplacement par une fonction. C'est une épée à double tranchant cependant, car un compilateur de code ne peut généralement pas optimize qui contient GOTO.

Je dirais, comme beaucoup d'autres soutiennent que, dans tous ces cas, l'utilisation de goto est utilisé comme un moyen de sortir d'un coin codé s'en, et est généralement un symptôme de code qui pourrait être refondus.

Autres conseils

constructions de flux de contrôle de niveau supérieur ont tendance à correspondre à des concepts dans le domaine des problèmes. Un if / else est une décision fondée sur une condition. Une boucle dit effectuer une action à plusieurs reprises. Même une déclaration de rupture dit « nous faisions cela à plusieurs reprises, mais maintenant nous devons arrêter ».

Déclaration de A, d'autre part, tend à correspondre à un concept dans le programme en cours d'exécution, pas dans le domaine du problème. Il dit de poursuivre l'exécution à un point spécifié dans le programme . Quelqu'un lisant le code doit déduisent ce que cela signifie en ce qui concerne le domaine du problème.

Bien sûr, toutes les constructions de niveau supérieur peuvent être définis en termes de GOTO et simples branches conditionnelles. Cela ne signifie pas qu'ils sont simplement GOTO déguisés. Considérez-les comme limité GOTO - et ce sont les restrictions qui les rendent utiles. Une déclaration de rupture est mis en œuvre un saut vers la fin de la boucle englobante, mais il est mieux considéré comme fonctionnant sur la boucle dans son ensemble.

Toutes choses égales par ailleurs, le code dont la structure reflète celle du domaine du problème tend à être plus facile à lire et à maintenir.

Il n'y a pas de cas où une instruction goto est absolument nécessaire (il y a un théorème à cet effet), mais il y a les cas où il peut être la moins mauvaise solution. Ces cas varient d'une langue à l'autre en fonction de ce qui construit les supports linguistiques de niveau supérieur.

En C, par exemple, je crois qu'il ya trois scénarios de base où un goto est approprié.

  1. Sortir d'une boucle imbriquée. Ce serait inutile si la langue avait une déclaration de rupture marquée.
  2. Bailing sur un tronçon de code (généralement un corps de fonction) dans le cas d'une erreur ou d'un autre événement inattendu. Ce serait inutile si la langue avait des exceptions.
  3. La mise en œuvre d'une machine à états finis explicites. Dans ce cas (et, je pense que, seulement dans ce cas) a correspond goto directement à un concept dans le domaine du problème, la transition d'un état à un autre état spécifié, où l'état est représenté par quel bloc de code est en cours d'exécution .

D'autre part, une machine à états finis explicite peut également être mis en œuvre avec une instruction switch dans une boucle. Ceci a l'avantage que tous les départs de l'Etat au même endroit dans le code, ce qui peut être utile pour le débogage, par exemple.

L'utilisation principale d'un goto dans une langue assez moderne (qui supports if / else et boucles) est de simuler une construction de flux de contrôle qui manque de la langue.

Certes, cela dépend du langage de programmation. La principale raison goto a été est controversée en raison de ses effets néfastes qui surviennent lorsque le compilateur vous permet de l'utiliser trop généreusement. Des problèmes peuvent survenir, par exemple, si elle vous permet d'utiliser de manière goto d'une telle que vous pouvez maintenant accéder à une variable uninitialised, ou pire, de sauter dans une autre méthode et le désordre avec la pile d'appels. Il devrait être la responsabilité du compilateur de désavouer le flux de contrôle de sens.

Java a tenté de « résoudre » ce problème en prohibant entièrement goto. Cependant, Java vous permet d'utiliser return dans un bloc finally et provoquer ainsi une exception à inadvertantly avalée. Le même problème est toujours là: le compilateur ne fait pas son travail. Suppression goto de la langue n'a pas fixé il.

En C #, goto est aussi sûr que break, continue, try/catch/finally et return. Il ne vous permet pas d'utiliser des variables non initialisées, il ne vous permet pas de sauter d'un bloc finally, etc. Le compilateur se plaindra. En effet, elle permet de résoudre le réel problème, ce qui est comme je l'ai dit flux de contrôle de sens. goto n'annule pas comme par magie analyse tâche définie et d'autres contrôles du compilateur raisonnable.

Oui. Lorsque vos boucles sont imbriquées en profondeur plusieurs niveaux, goto est que moyen de rompre avec élégance d'une boucle intérieure. L'autre option consiste à définir un indicateur et de sortir de chaque boucle si ce drapeau satisfait à une condition. C'est vraiment laid, et assez sujette aux erreurs. Dans ces cas, goto est tout simplement mieux.

Bien sûr, la déclaration de break marquée de Java fait la même chose, mais sans vous permettant de sauter à un point arbitraire dans le code, ce qui permet de résoudre le problème d'une manière ordonnée sans laisser les choses qui font mal goto.

La plupart du découragement vient former une sorte de « religion » qui a été créé Aroud Dieu Djikstra qui était irrésistible au début des années 60 à ce sujet est le pouvoir sans discernement à:

  • sauter partout dans tout bloc de code
    • fonction non exécutée à partir du début
    • boucles non exécutées depuis le début
    • sautée initialisation variable
  • sauter loin de tout bloc de code sans nettoyage possible.

Cela n'a plus rien à voir avec la déclaration de goto des langues modernes, dont l'existence est simplement en raison de soutenir la création de structures de code autres que celles linguistiques sont fournies.

En particulier, le premier point principal ci-dessus est plus autorisée et la seconde est nettoyée (si vous goto d'un bloc de la pile est unwinded correctement et tous les Destructeurs appropriés appelé)

Vous pouvez consulter cette réponse pour avoir une idée de la façon dont le code même de ne pas utiliser goto peut être illisible. Le problème ne se goto, mais le mauvais usage.

Je peux écrire un programme complet sans utiliser if, juste for. Bien sûr, il ne sera pas bien lisible, un maladroit regard et inutilement compliqué.

Mais le problème n'est pas for. Il est moi.

Des choses comme break, continue, throw, bool needed=true; while(needed) {...}, etc. sont faisant remarquer plus de Masquerade goto pour échapper à l'écart des cimeterres des zélotes Djikstrarian, que -50 ans après l'invention de laguages- moderne veulent toujours leurs prisonniers. Ils ont oublié ce que Djikstra parlait, ils ne se rappellent le titre de sa note (GOTO considéré comme nocif, et il n'a même pas été son titre onw: il a été modifié par l'éditeur) et le blâme et bash, bash et blâmer tous contruct avoir ces 4 lettre placée en séquence.

Il est 2011. Il est temps de comprendre que goto a noter pour faire face à la déclaration de GOTO Djikstra était convaincant sur

Le goto étrange ici ou là, tant qu'il est locale à une fonction, rarement nuit grandement la lisibilité. Il bénéficie souvent en attirant l'attention sur le fait qu'il ya quelque chose d'inhabituel dans ce code qui nécessite l'utilisation d'une structure de contrôle un peu hors du commun.

Si GOTO (locales) nuisent considérablement la lisibilité, il est généralement un signe que la fonction contenant le goto est devenu trop complexe.

Le dernier goto je mis dans un morceau de code C était de construire une paire de boucles de verrouillage. Il ne rentre pas dans la définition normale d'utilisation goto « acceptable », mais la fonction a fini par nettement plus faible et plus claire en conséquence. Pour éviter le goto aurait nécessité une violation particulièrement désordonnée de DRY.

Je pense que toute cette question a été un cas d'aboyer le mauvais arbre.

GOTO en tant que telle ne semble pas un problème pour moi, mais il est très souvent un symptôme d'un péché réel: le code spaghetti

.

Si le GOTO provoque des principaux passages de lignes de contrôle de flux, alors il est mauvais, période. Si elle franchit aucune ligne de contrôle de flux, il est inoffensif. Dans la zone grise entre nous avons des choses comme sauvetages en boucle, il y a encore quelques langues qui n'ont pas ajouté des constructions qui couvrent tous les cas gris legit.

Le seul cas que je me suis trouvé en utilisant en fait dans de nombreuses années est le cas de la boucle où le point de décision est au milieu de la boucle. Vous vous retrouvez avec soit le code dupliquée, un drapeau ou un GOTO. Je trouve la solution de GOTO le meilleur des trois. Il n'y a pas de croisement de lignes de contrôle de flux ici, il est inoffensif.

Oui, le goto peut être utilisé pour profiter de l'expérience du développeur: http://adamjonrichardson.com/2012/02/06/ long live the-goto-déclaration /

Cependant, comme avec tout outil puissant (pointeurs, héritage multiple, etc.), on doit être discipliné en utilisant ce. L'exemple fourni dans la liaison utilise PHP, ce qui limite l'utilisation de la construction d'goto à la même fonction / procédé et désactive la possibilité de sauter dans un nouveau bloc de contrôle (par exemple, une boucle, un état de commutation, etc.).

dépend de la langue. Il est encore largement utilisé dans la programmation Cobol, par exemple. J'ai aussi travaillé sur un dispositif Barionet 50, dont le langage de programmation est un firmware dialecte BASIC début que bien sûr vous oblige à utiliser Goto.

Je dirais non. Si vous trouvez la nécessité d'utiliser GOTO, je parie qu'il ya un besoin de redessiner le code.

goto peut être utile lorsque le portage du code assembleur existant à C. Dans le premier cas, une conversion instruction par instruction à C, en utilisant goto en remplacement de l'instruction de branch de l'assembleur, peut permettre le portage très rapide.

Je dirais non. Ils doivent toujours être remplacés par un spécifique plus d'outils au problème du goto est utilisé pour résoudre (à moins que ce n'est pas disponible dans votre langue). Par exemple, les déclarations de rupture et les exceptions à résoudre les problèmes précédemment résolus goto-boucle et d'échapper à la gestion des erreurs.

Licencié sous: CC-BY-SA avec attribution
scroll top