Quel est le problème avec l'utilisation de goto? [dupliquer]
Possible les Doublons:
Pourquoi est-il mauvais d'utiliser goto?
GOTO toujours considéré comme dangereux?
Je ramdomming à travers xkcd et vu celui-ci (si aussi lu quelques textes négatifs à leur sujet il y a quelques années):
Quel est réellement le problème avec elle? Pourquoi goto est-il même possible en C++ alors?
Pourquoi devrais-je pas utiliser?
6 réponses
Parce Qu'ils conduisent à code spaghetti .
Dans le passé, les langages de programmation n'avaient pas while() if() etc, et les programmeurs utilisaient goto pour composer la logique de leurs programmes. Cela conduit à un désordre irrécupérable.
C'est pourquoi les dieux CS ont créé des fonctions conditionnelles et des boucles. la programmation structurée était une révolution à l'époque.
Les Goto sont appropriés à quelques endroits, par exemple pour sauter des boucles imbriquées
Rien ne va mal avec goto
s'il est utilisé correctement. La raison pour laquelle il est "tabou" est que dans les premiers jours de C, les programmeurs (venant souvent d'un arrière-plan d'assemblage) utiliseraient goto
pour créer du code incroyablement difficile à comprendre.
La Plupart du temps, vous pouvez vivre sans goto
et d'être bien. Il y a quelques cas, cependant, où goto
peut être utile. Le premier exemple est un cas comme:
for (i = 0; i < 1000; i++) {
for (j = 0; j < 1000; j++) {
for (k = 0; k < 1000; k++) {
...
if (condition)
goto break_out;
....
}
}
}
break_out:
Utiliser un goto
pour sortir d'une boucle profondément imbriquée peut souvent être plus propre que utiliser une variable de condition et la vérifier à tous les niveaux.
L'utilisation de goto
pour implémenter des sous-programmes est la principale façon d'en abuser. Cela crée ce qu'on appelle le "code spaghetti" qui est inutilement difficile à lire et à maintenir.
Il n'y a rien de mal avec goto en soi. C'est une construction très utile dans la programmation et a de nombreuses utilisations valides. Le meilleur qui vient à l'esprit est la libération de ressources structurées dans les programmes C.
Là où goto va mal, c'est quand ils sont maltraités. L'abus de gotos peut conduire à un code complètement illisible et non maintenable.
En 1968, Edsger Dijkstra a écrit une lettre célèbre à l'éditeur de Communications de L'ACM GOTO est considéré comme nuisible dans lequel il a exposé le cas pour la programmation structurée avec while boucles et if...puis...else conditions. Lorsque GOTO est utilisé pour remplacer ces structures de contrôle, le résultat est très souvent code spaghetti . À peu près tous les langages de programmation utilisés aujourd'hui sont un langage de programmation structuré, et l'utilisation de GOTOs a été pratiquement éliminé. En fait, Java, Scala, Ruby et Python n'ont pas du tout de commande goto
.
C, C++ et Perl ont toujours une commande GOTO, et il y a des situations (en C en particulier) où un GOTO est utile, par exemple une instruction break qui sort de plusieurs boucles, ou comme un moyen de concentrer le code de nettoyage dans un seul endroit dans une fonction même quand il y a plusieurs façons la progression d'une fonction). Mais en général, son utilisation devrait être limitée à des modèles de conception spécifiques qui l'exigent d'une manière contrôlée et reconnue.
(en C++, il est préférable d'utiliser RAII ou un ScopeGuard (Plus) au lieu d'utiliser GOTO pour le nettoyage. Mais GOTO est un idiome fréquemment utilisé dans le noyau Linux (une autre source ) qui est un excellent exemple de code C idiomatique.)
La bande dessinée XKCD est une blague sur la question " devrait GOTO toujours être considéré comme nuisible quand il y a certains modèles de conception spécifiques qui sont grandement aidés par son utilisation?"
Avez-vous google le problème?
Le fondateur du mouvement anti-goto est Edsger Dijskstra avec son légendaire "Goto considéré comme nuisible"
Pour vous aider à démarrer, vous pouvez goto (ha ha!) http://en.wikipedia.org/wiki/GOTO
C'est possible en C++ parce que c'est possible en C. que vous deviez ou non l'utiliser est une guerre de religion de longue date.