To GOTO or not to GOTO. That’s a good question!

Parafraseando a Shakespheare, nada menos (“To be, or not to be: that is the question”). Recientemente asistí a un debate en un foro de Internet sobre el uso de GOTO en programación, un tema muy controvertido aun en estos días de paradigmas de computación avanzados como la Orientación al Objeto, Eventos y demás entes peculiares. Se trataba de un caso concreto en el que se planteaba una liberación de recursos de la máquina en la cual se ejecutaba un programa en lenguaje C. A raíz de los interesantes comentarios y discusiones que surgieron, he decidido abrir un pequeño artículo sobre el tema, cuya fuente fundamental es Steve McConnell y su libro Code Complete 2.

Por qué no usar GOTO

Empecemos por los inconvenientes por dos razones: la primera es que el autor lo hace así en su libro, y la segunda es que me parece del todo apropiado ya que a cualquier programador que le preguntes sobre el asunto dirá, a bote pronto: ¡no a los GOTO!

– Según Dijkstra (uno de los padres de la computación moderna, por si algún despistado no sabe quién es), el uso de GOTO nos lleva irremediablemente a una peor calidad en el código, y una mayor dificultad en probar la correctitud del mismo.

– Indentación rota en el código, por su estilo. Es difícil estructurar de forma legible el código al utilizar GOTO. Al dificultar la legibilidad empeora, además, el mantenimiento del código.

– Romple las optimizaciones del compilador, al forzar los caminos a seguir.

– Es falso que el código con GOTO sea más pequeño o más rápido. Depende de cómo traduzca el compilador el código a lenguaje máquina, lo cual es desconocido para la mayoría de los mortales… Steve McConnell dedica un par de capítulos enteros en Code Complete 2 al “code tuning” y romper mitos sobre qué es más rápido y qué no: la conclusión es que si no se miden tiempos es una insensatez afirmar que un código es más rápido que otro.

– En la práctica, GOTO rompe el principio de que el código debería fluir de arriba hacia abajo. Incluso aunque al principio se usen cuidadosamente, al final se reproducen como termitas en una casa podrida.

Para acabar nuestros argumentos en contra del uso de GOTO, simplemente comentar que después de dos décadas parece que Dijkstra sigue teniendo razón y por eso muchos lenguajes de programación modernos no implementan el uso de GOTO. Una cita interesante:

Las etiquetas GOTO deberían ir alinadas a la izquierda con todas las letras en mayúsculas, y deberían incluir el nombre del programador, el número de teléfono de su domicilio y su número de la tarjeta de crédito bancaria.

Abdul Nizar.

Por qué sí usar GOTO

Malas noticias para los que llegaron hasta aquí pensando que tenían la solución a todos sus problemas: hay situaciones en las cuales el uso de GOTO es, digamos, aceptable (no me voy a atrever a decir recomendable).

– Si se usa cuidadosamente puede aportar ventajas. Muchos inconvenientes del uso de GOTO vienen por el uso indiscriminado de esta construcción.

– Puede eliminar duplicaciones de código. Las duplicaciones son problemáticas cuando sólo se modifica una de las copias. Además, el tamaño del ejecutable es así menor en espacio.

– Útil en operaciones que reservan recursos, hacen uso de esos recursos y después los liberan. Permite tener todo en un sitio y que no se olvide liberar alguno. Una buena alternativa a esta solución serían los bloques try-catch, siempre que el lenguaje de programación implemente tales construcciones.

– En algunos casos puede producir código más pequeño, más rápido.

– Centrarse en la descomposición, ese es el objetivo, no evitar GOTO. Soluciona el problema con la mejor herramienta disponible.

– Hay lenguajes modernos que incluyen GOTO: Visual Basic, C++, Ada.

Para terminar los argumentos a favor, señalamos que hay gente (Sheil) que no sostiene o dicho por Dijkstra y Schneiderman, aunque tampoco afirman que sea bueno utilizar GOTO indiscriminadamente.

Conclusiones

Por lo general no es bueno utilizar GOTO, salvo en aquellos casos en los que las ventajas sean cuantiosas. Los libros de texto habituales no ayudan porque siempre ponen ejemplos burdos y sencillos en los cuales salta a la vista que no debe utilizarse GOTO. Alternativas a GOTO son: if anidados, variables de estado y bloques trycatch.

En la mayoría de los lenguajes modernos, el 90% de los usos de GOTO pueden ser sustituídos perfectamente por otra cosa. Si aun así se decide optar por utilizar GOTO, es indispensable documentar tal uso en el código.

——————————————————————————

Fuente:

Code Complete 2, Steve McConnell

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s