¿Qué hay de malo en usar goto? [duplicar]

Resuelto asked hace 14 años • 6 respuestas

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): ¿
Tu conexión lenta apesta, consigue una más rápida para ver esta imagen.
Qué tiene realmente de malo? Entonces, ¿por qué son posibles los goto en C++?

¿Por qué no debería usarlos?

 avatar Aug 19 '10 07:08
Aceptado

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.

Byron Whitlock avatar Aug 19 '2010 00:08 Byron Whitlock

No hay nada malo gotosi 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 gotocrear código increíblemente difícil de entender.

La mayor parte del tiempo, puedes vivir sin ellos gotoy estar bien. Sin embargo, hay algunos casos en los que gotopuede 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 gotopara 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 gotopara 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.

bta avatar Aug 19 '2010 00:08 bta

No hay nada malo gotoen 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 gotosale mal es cuando se abusa de ello. El abuso de gotopuede generar un código completamente ilegible e imposible de mantener.

JaredPar avatar Aug 19 '2010 00:08 JaredPar

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 gotocomando.

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?"

Ken Bloom avatar Aug 19 '2010 00:08 Ken Bloom