Les constructions de flux de contrôle de niveau supérieur ont tendance à correspondre aux concepts du domaine problématique. Un if / else est une décision basée sur une condition. Une boucle indique d'effectuer une action à plusieurs reprises. Même une déclaration de rupture dit "nous faisions cela à plusieurs reprises, mais maintenant nous devons arrêter".
Une instruction goto, d'autre part, tend à correspondre à un concept dans le programme en cours d'exécution, pas dans le domaine problématique. Il dit de continuer l'exécution à un point spécifié du programme . Quelqu'un qui lit le code doit déduire ce que cela signifie par rapport au domaine problématique.
Bien sûr, toutes les constructions de niveau supérieur peuvent être définies en termes de gotos et de branches conditionnelles simples. Cela ne signifie pas qu'ils ne sont que des gotos déguisés. Considérez-les comme des gotos restreints - et ce sont les restrictions qui les rendent utiles. Une instruction break est implémentée comme un saut à la fin de la boucle englobante, mais il vaut mieux la considérer comme opérant sur la boucle dans son ensemble.
Toutes choses étant égales par ailleurs, le code dont la structure reflète celle du domaine problématique a tendance à être plus facile à lire et à maintenir.
Il n'y a aucun cas où une instruction goto est absolument requise (il y a un théorème à cet effet), mais il y a des cas où cela peut être la moins mauvaise solution. Ces cas varient d'une langue à l'autre, selon les constructions de niveau supérieur prises en charge par la langue.
En C, par exemple, je pense qu'il y a trois scénarios de base où un goto est approprié.
- Sortir d'une boucle imbriquée. Cela ne serait pas nécessaire si la langue avait une instruction break étiquetée.
- Renvoi d'un bout de code (généralement un corps de fonction) en cas d'erreur ou autre événement inattendu. Cela ne serait pas nécessaire si le langage comportait des exceptions.
- Implémentation d'une machine à états finis explicite. Dans ce cas (et, je pense, seulement dans ce cas), un goto correspond directement à un concept dans le domaine problématique, passant d'un état à un autre état spécifié, où l'état actuel est représenté par le bloc de code en cours d'exécution. .
D'un autre côté, une machine à états finis explicite peut également être implémentée avec une instruction switch dans une boucle. Cela présente l'avantage que chaque état commence 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 un langage raisonnablement moderne (celui qui prend en charge if / else et les boucles) est de simuler une construction de flux de contrôle qui manque dans le langage.