¿Qué hay de malo en usar goto? [duplicar]
Posibles duplicados:
¿Por qué es malo usar goto?
¿GOTO todavía se considera perjudicial?
Estaba revisando xkcd y vi este (si también leí algunos textos negativos sobre ellos hace algunos años): ¿
Qué tiene realmente de malo? Entonces, ¿por qué son posibles los goto en C++?
¿Por qué no debería usarlos?
Porque conducen al código espagueti .
En el pasado, los lenguajes de programación no tenían bucles while, declaraciones if, etc., y los programadores usaban goto para crear la lógica de sus programas. Condujo a un desastre inmantenible.
Por eso los dioses del CS crearon métodos, condicionales y bucles. La programación estructurada fue una revolución en ese momento.
Los gotos son apropiados en algunos lugares, como para saltar de bucles anidados.
No hay nada malo goto
si se usa correctamente. La razón por la que es "tabú" es porque en los primeros días de C, los programadores (a menudo con experiencia en ensamblaje) solían goto
crear código increíblemente difícil de entender.
La mayor parte del tiempo, puedes vivir sin ellos goto
y estar bien. Sin embargo, hay algunos casos en los que goto
puede resultar útil. El mejor ejemplo es un caso como:
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:
Usar a goto
para salir de un bucle profundamente anidado a menudo puede ser más limpio que usar una variable de condición y verificarla en todos los niveles.
El uso goto
para implementar subrutinas es la forma principal en que se abusa de él. Esto crea el llamado "código espagueti", que es innecesariamente difícil de leer y mantener.
No hay nada malo goto
en sí mismo. Es una construcción muy útil en programación y tiene muchos usos válidos. Lo mejor que me viene a la mente es la liberación estructurada de recursos en programas C.
Donde goto
sale mal es cuando se abusa de ello. El abuso de goto
puede generar un código completamente ilegible e imposible de mantener.
En 1968, Edsger Dijkstra escribió una famosa carta al editor de Comunicaciones de ACM. GOTO se considera dañino en la que expuso los argumentos a favor de la programación estructurada con bucles while y condicionales if...then...else . Cuando se utiliza GOTO para sustituir estas estructuras de control, el resultado suele ser un código espagueti . Prácticamente todos los lenguajes de programación que se utilizan hoy en día son lenguajes de programación estructurados y el uso de GOTO prácticamente se ha eliminado. De hecho, Java, Scala, Ruby y Python no tienen ningún goto
comando.
C, C++ y Perl todavía tienen un comando GOTO, y hay situaciones (particularmente en C) en las que GOTO es útil , por ejemplo, una instrucción break que sale de múltiples bucles, o como una forma de concentrar el código de limpieza en un solo lugar en una función incluso cuando hay múltiples formas de terminar la función (por ejemplo, devolviendo códigos de error en múltiples puntos del progreso de una función). Pero, en general, su uso debería restringirse a patrones de diseño específicos que lo requieran de forma controlada y reconocida.
(En C++, es mejor usar RAII o ScopeGuard (más) en lugar de usar GOTO para la limpieza. Pero GOTO es un modismo usado con frecuencia en el kernel de Linux ( otra fuente ), que es un gran ejemplo de código C idiomático).
El cómic de XKCD es una broma sobre la pregunta "¿Debería considerarse siempre GOTO dañino cuando hay ciertos patrones de diseño específicos que se ven muy favorecidos por su uso?"