Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Draklit en 1 Julio 2011, 22:35 pm



Título: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Draklit en 1 Julio 2011, 22:35 pm
Bueno, me gustaría si me aclaran esa duda ya que no estoy tan seguro al respecto :huh:


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Edu en 1 Julio 2011, 22:58 pm
Busca en el buscador que ya se hablo hace poco de esto.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: WaAYa HaCK en 2 Julio 2011, 00:24 am
Básicamente es porque un montón de saltos en el código de un programa puede resultar muy engorroso de leer. Si haces un code con 86 goto's, el que lea el código se va a volver loco.

Saludos!


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: leogtz en 2 Julio 2011, 04:25 am
No soy partidiario del código spaguetti, pero a veces usar goto facilita las cosas, aunque no sea necesario.

If You Want To Go Somewhere, Goto Is The Best Way To Get There. -- Ken Thompson



Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Foxy Rider en 3 Julio 2011, 12:14 pm
+1 a leo, la difamación al goto es ... básicamente culpa de Dijkstra y es perdonable, la fecha del paper ("Go To Statement Considered Harmful" -> PDF : http://ur1.ca/bbpu ) es de 1968 y vale pensar qué lenguajes había en esa época.
Es un groso, pero faileó con esto ... muchos repiten lo que el dijo, que repitieron sus profesores y así (y siempre cosas exageradas y sin sentido) ... sin saber de donde salió lo de "código spaghetti" y lo más importante para preguntar : ¿por qué?
por que muchos se conforman con una explicación "pedorra" u otros siquiera preguntan debidamente y aceptan pasivamente lo que el profesor dice mientras dicen "ok, goto no, goto no, goto no, listo, ya lo memoricé"

En diaspora hace poco hubo un debate muy interesante sobre goto que empezó por un chiste ( http://blog.susam.in/2011/06/urls-in-c.html ) y se escribieron muchas cosas.
Una de ellas revivió un viejo debate en las listas de Linux que te aconsejo leer (por que sí, linux usa goto en varios lugares, así como el código del kernel de FreeBSD en partes de muy bajo nivel -por cierto-) : http://kerneltrap.org/node/553/2131

goto es una herramienta del lenguaje, y como tal hay que saber cuando se usa y cuando no. hay lugares donde un goto tiene más sentido que cualquier otra cosa y viceversa ...

Saludos.



Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: WaAYa HaCK en 3 Julio 2011, 14:24 pm
Pues claro que sí, alguien puede decir que los comentarios en un código no sirven para una *****, pero yo diría que sí que sirven.

Dicen que no es recomendable usar goto... si hay una opción mejor, pero en muchos casos goto sirve para mucho. En batch, por ejemplo.
Saludos!

PD: Leo, me gustó la frase... +1


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: leogtz en 3 Julio 2011, 18:57 pm
Leyendo el código de los comandos del SO opensolaris te lo llegas a encontrar bastante seguido así que... no está tan prohibida su práctica.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Valkyr en 4 Julio 2011, 02:51 am
En mi opinión, tal y como dice vertex@symphony, habrá circustancias en las que se imponga razonadamente el uso de goto y otras en las que no sea así. Lo que yo considero es que, en lo que viene siendo la disciplina de programación, cuando se están dando los primeros pasos, no es una buena técnica, ya que puede llegar a acostumbrar al "futuro programador" a solucionar cualquier situación con un goto sin pararse a pensar en otros aspectos del problema.

Es una sentencia más del lenguaje sí, y la habrán usado en innumerables ocasiones, pero eso no significa que sea recomendable su uso, que es lo que pregunta Draklit. Creo que si se hace un uso "razonable" de la instrucción, sin abusar de ella ante cualquier situación, es una instrucción tan válida como el resto. Sin embargo, cuando la cosa ya comienza a ser un cachondeo de goto's por todo el código ante el más mínimo inconveniente, lo considero la peor técnica del mundo. Así que supongo que la cosa estará en encontrar un punto medio y no volverse loco poniendo instrucciones de este tipo.

Yo sinceramente veo más lógicas estas instrucciones en bajo nivel, ya que las sentencias de control son mínimas. Pero en lenguajes de alto nivel, donde existen muchas otras sentencias de control de flujo...no la considero indispensable.

Saludos.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: [Zero] en 4 Julio 2011, 03:24 am
Pues yo discrepo, aparte de que tal vez el código se vuelva más confuso a la hora de leer (o al contrario, la mayoría de situaciones que se prestan a usar un goto es porque lo ves más claro), lo más importante es que choca con el resto de estructuras de control. Toda estructura de bucle o condición te permite ir a donde quieres, y me parece que si no utilizas estas salidas de las estructuras "estándar" y añades un goto, 1º, complicas el algoritmo, y 2º, tal vez el compilador genere un código menos optimizado. Además, a la hora de ver el código, al menos a mí, no sé si por costumbre, un vistazo a estas estructuras ya te da una idea precisa del algoritmo, mientras que, tal vez, de utilizar un goto debes releer el código y seguirle la pista al flujo de ejecución de instrucciones. Igual que el uso de break y continue, es más gusto personal que otra cosa seguramente, pero aún complicando el algoritmo para no utilizarlos, me parece que éste queda mejor reflejado sin ellos.

En resumen, yo no veo razonable el uso de un goto en ningún caso.

Saludos


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Akai en 4 Julio 2011, 15:22 pm
por que sí, linux usa goto en varios lugares

En bastantes de hecho.

@[Zero]:

En una charla de FOSDEM 2010 (me parece que era 2010, sino, 2011) Greg Kroah-Hartman en la charla "Write and Submmit your first Kernel Patch" comenta acerca que:

dado el carácter multihilo del kernel que cuando en una función haces locking a algo y por un caso finalizas es más simple saltar al final de la función donde en cualquier caso sea funcionamiento normal o anormal vas a hacer los unlocks necesarios que duplicar el codigo para desbloquear (esta última es más propensa a errores)


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Foxy Rider en 4 Julio 2011, 16:26 pm
Si van a decir cosas como "Dicen que" y similares repitiendo demás crap, por favor, pongan argumentos justificados, nada de exageraciones, código or GTFO.

Por que la demonización de goto tarde o temprano tiene que terminar.
Es una herramienta como cualquier otra, y como *CUALQUIER* construcción en un lenguaje de programación no debe ser abusada y debe utilizarse donde sea más coherente, pero muchos usan la exageración (léase: abuso del goto y ponerlo all over the place) como una forma de desaconsejar su uso.

Bajo esa idea, podríamos decir que cosas como punteros o cualquier otra construcción es "desaconsejable"
Los argumentos contra el goto fueron desarmados hace mil años, pero hay gente que insiste repetir cosas de 1968 ...

Saludos.

P.S: sí, este es un mensaje al buen estilo "leave goto alone" (o era leave britney alone ? méh)
P.S 2 : me toca un poco los ... que yo diga que hay gente repitiendo crap (y explique un poquito por qué y ofrezca referencias) , y vengan a hacer eso sin aportar absolutamente nada a la justificación de eso.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Akai en 4 Julio 2011, 16:46 pm
Oh, Se me pasó complementar el comentario acerca de la charla que cité anteriormente y no voy a editar un post si alguien ha respondido ya después de publicarlo.

Uno de los ejemplos sobre los cuales en el kernel de linux se usa bastante el goto sería una estructura similar:

Código
  1. pthread_mutex_lock(&m)
  2. if (lo_que_sea){
  3.    haz_cosas();
  4. }else{
  5.    //no queremos continuar, pero aun asi tenemos que desbloquear
  6.    goto exit;
  7. }
  8. //aqui se tendria mucho mas codigo
  9. ...
  10.  
  11. pthread_mutex_unlock(&m);
  12. return algo;
  13.  

Obviamente, con un lock no parece mucho cambio duplicar el código. Pongamos 15 locks.

En situaciones como estas donde en unos casos la función debería terminar y se han bloqueado diversos locks y que es muy probable que dicho código se vaya a modificar, creo que queda claro que es preferible no duplicarlo en el else sino hacer un goto al final de la función, camino que también se recorrería si la función entrase en el if, haciendo a parte más cosas.

Sea cual sea el caso, al finalizar la función tenemos que soltar esos locks, llegaremos bien sea con un salto directo o bien por el recorrido completo. En este caso creo que se ve que el goto simplifica el código.

saltos para atrás son los que en determinados casos pueden marear la perdiz (aun así, qué son los bucles sino saltos condicionales hacia atrás?), hacia adelante no tienen ningún problema como creo que se puede ver en este ejemplo.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: leogtz en 5 Julio 2011, 00:26 am
Como dato interesante, ¿saben cuántos goto's hay en el código fuente de Perl?

Código:
─[0 leo@leo-945GCT-M ~/Descargas/perl-5.14.1]$
└─> find . -type f -iregex ".*c$" -exec cat {} \; | grep -i "goto" | wc -l
1430
┌─[0 leo@leo-945GCT-M ~/Descargas/perl-5.14.1]$
└─>

Perl está hecho totalmente en C y que yo sepa no tiene bugs.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Littlehorse en 5 Julio 2011, 00:49 am
No siempre menos lineas de código significa que este bien hecho y el goto para lo único que sirve en el 99% de los casos es para ahorrar lineas de código, esa por lo menos es mi opinión.

Que se use en Perl o en el Kernel que gusten no es una muestra de nada puesto que son programadores como todos; no puede tomarse eso como una referencia de que algo es correcto. Con el mismo criterio podemos decir que Dijkstra comento que no debería usarse y explico muy bien por que, y ¿Quien de ustedes se atreveria a decir que Dijkstra no tenia idea de lo que hablaba?.
Como verán ninguna de estas referencias pueden tomarse para probar que "esto es así sin ninguna duda" porque cada uno tiene una visión distinta; se puede estar de acuerdo o no.

Personalmente no creo que goto sea adecuado para nada, genera confusión en el código y torna al flujo del algoritmo difícil de seguir para los que deban continuar lo que uno hizo (nada mas propenso a errores que un programador que no puede entender el código base con el cual debe trabajar).

Lo del goto exit; puede aparentar valido cuando se muestra en 5 lineas pero cuando comienzan los errores, las excepciones, cuando comienza las unidades de testeo y la depuración, la historia es otra.

Estoy de acuerdo con lo que dijo Zero, es cuestión de gustos.

Saludos!

PD: Sin comentarios como gtfo ni demás porque todos tienen derecho a opinar en la forma que gusten mientras no se falte el respeto a nadie.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: leogtz en 5 Julio 2011, 04:11 am
No siempre menos lineas de código significa que este bien hecho y el goto para lo único que sirve en el 99% de los casos es para ahorrar lineas de código, esa por lo menos es mi opinión.

Que se use en Perl o en el Kernel que gusten no es una muestra de nada puesto que son programadores como todos; no puede tomarse eso como una referencia de que algo es correcto. Con el mismo criterio podemos decir que Dijkstra comento que no debería usarse y explico muy bien por que, y ¿Quien de ustedes se atreveria a decir que Dijkstra no tenia idea de lo que hablaba?.
Como verán ninguna de estas referencias pueden tomarse para probar que "esto es así sin ninguna duda" porque cada uno tiene una visión distinta; se puede estar de acuerdo o no.

Personalmente no creo que goto sea adecuado para nada, genera confusión en el código y torna al flujo del algoritmo difícil de seguir para los que deban continuar lo que uno hizo (nada mas propenso a errores que un programador que no puede entender el código base con el cual debe trabajar).

Lo del goto exit; puede aparentar valido cuando se muestra en 5 lineas pero cuando comienzan los errores, las excepciones, cuando comienza las unidades de testeo y la depuración, la historia es otra.

Estoy de acuerdo con lo que dijo Zero, es cuestión de gustos.

Saludos!

PD: Sin comentarios como gtfo ni demás porque todos tienen derecho a opinar en la forma que gusten mientras no se falte el respeto a nadie.


Sí, programadores, pero programadores muy brillantes, y si ellos usan goto es por algo, para algo les servirá, y por algo no lo hicieron de otra manera, ¿no crees?.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Littlehorse en 6 Julio 2011, 04:27 am
Lo de programadores muy brillantes es relativo, por supuesto algunas personalidades conocidas lo son, algunos desconocidos también lo serán, eso no significa que todos lo sean. Pero igualmente eso no importa mucho, a lo largo de la vida en sistemas puedes encontrarte con muchas personas brillantes y con muchas eminencias en determinadas áreas, así y todo no se puede dar por sentado todo lo que digan y/o hagan por mas geniales que sean como profesionales.

Muchas personalidades conocidas que son brillantes en lo que hacen opinan que C++ es una basura mientras que otros opinan que C++ es una maravilla; ese es uno de los tantos debates interminables.

Una frase muy cierta del libro "Spring in Action" que leí hace un tiempo que ejemplifica un poco todo esto:

Citar
There are certain things that most people can agree upon: The fact that the sky
is blue, that Michael Jordan is the greatest player to touch a basketball, and
that Star Trek V should have never happened. And then there are those things that
stir up controversy, such as politics, religion, and the eternal “tastes great/less
filling” debates.

Como profesional tienes que analizar las visiones existentes y ver cual te convence mas y luego de eso verificar que tan cierta es esa visión que tanto te convence. De lo contrario terminarías usando un framework solo porque tal persona brillante lo usa, terminaras comprando un auto porque tal persona lo usa, y así puedo seguir con interminables ejemplos que lograrían que tomes muy malas decisiones en la vida así sea en lo profesional como en lo personal.

Saludos


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: leogtz en 7 Julio 2011, 08:38 am
A lo que voy es que si hay evidencia de que el correcto uso de esa sentencia da resultados, no entiendo porque no usarla. El goto lo usé durante mucho tiempo y creanme que jamás tuve problemas de nada, como programador se está consciente de los saltos que se hacen.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Littlehorse en 8 Julio 2011, 00:47 am
El programador puede ser, pero tus compañeros de trabajo? usualmente no trabajas solo, y no siempre vas a ser vos el que depure el código. Incluso luego de 6 meses, vos no vas a ser el mismo que codifico esos gotos, y ni los comentarios van a ayudarte lo suficiente.

Obviamente no vas a tener problemas con goto en proyectos chicos, pero en aplicaciones reales los tenes, por esa misma razón es una característica de lenguaje obsoleta. No porque a alguien se le ocurrió demonizarla, no por cuestiones religiosas si no por simples conceptos de diseño de software que ya están muy bien explicados.

Habría que analizar la evidencia porque en lo que a mi respecta que se utilice en X lugar para mi no significa nada y eso es lo único que se ha dicho hasta ahora. Que en un link Linus diga que Dijkstra no tenia idea de lo que hablaba y que goto en algunos casos sirve para mi tampoco significa nada.

Habra algunos casos en donde usar goto es valido? seguro! de ahí a que haya varios casos en donde sea la mejor opción hay un abismo puesto que porque alguien considere que para algún caso en particular, goto es la mejor opción, no lo hace verdad, solo lo hace una opinión.

De hecho, de "Linux Device Drivers, 2nd Edition" -se encuentra dentro de unos de los links que pusieron- claramente se puede leer esto:

Citar
Error recovery is sometimes best handled with the goto statement. We normally hate to use goto, but in our opinion this is one situation (well, the only situation) where it is useful. In the kernel, goto is often used as shown here to deal with errors.

The following sample code (using fictitious registration and unregistration functions) behaves correctly if initialization fails at any point.

 
Código
  1.   int init_module(void)
  2.     {
  3.     int err;
  4.  
  5.      /* registration takes a pointer and a name */
  6.      err = register_this(ptr1, "skull");
  7.      if (err) goto fail_this;
  8.      err = register_that(ptr2, "skull");
  9.      if (err) goto fail_that;
  10.      err = register_those(ptr3, "skull");
  11.      if (err) goto fail_those;
  12.  
  13.      return 0; /* success */
  14.  
  15.      fail_those: unregister_that(ptr2, "skull");
  16.      fail_that: unregister_this(ptr1, "skull");
  17.      fail_this: return err; /* propagate the error */
  18.     }

Los problemas que Dijkstra menciono respecto de usar goto siguen siendo validos, no seria ni el primero ni el ultimo en exponer posibles problemas que permanecen vigentes en el tiempo incluso luego de décadas. Se le suele llamar "estar adelantado a la época" y Dijkstra era claramente uno de esos afortunados.
 
Lo único que puedo decir es repetir lo que ya dije en un pm; si quieren usarlo porque para determinado caso les parece correcto, haganlo, como profesional y moderador es mi deber avisarles que en el 99% de sus actuales/futuros trabajos a sus referentes técnicos no va a gustarles.

Saludos!


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: Meta en 18 Julio 2011, 01:46 am
En clases de programación, el profesor nos prohibió usar goto, excepto en ASM.


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: dandy_hack en 7 Agosto 2011, 21:00 pm
y si yo lo uso en batch es bueno usarlo o no es muy recomendable???


Título: Re: ¿Por qué es no recomendable el uso de "goto"?
Publicado por: leogtz en 7 Agosto 2011, 21:04 pm
y si yo lo uso en batch es bueno usarlo o no es muy recomendable???

No es que sea bueno o malo, sino que es la única manera de ir a una etiqueta, claro que también puedes ir con el comando "call", pero dicho comando incluye otras cosas...