• Ahi algo que me parece que no se puede negar, si las funciones siguen estando implementadas en los compiladores que cumplen ciertas normas ANSI a esta altura del partido, por algo debe ser. Si generaran codigo erroneo seguramente hubieran pasado a estar 'deprecated' (no se como traducir eso) hace rato.

    Una explicacion es que sirven para generacion automatica de codigo, programas que te generan codigo c y te lo llenan de Gotos. Pero la idea es que sea flexible el lenguaje, lo que haga el tipo que sea problema de el.


    Marcos: Podes evitar el break ese con una variable sin modificar la estructura del programa

    int tmp;

    tmp = 0;

    while (tmp == 0){
    ....

    Pero es una complicacion que a mi me suena innecesaria. Compara:


    funcion (param)

     if condicion
          codigo A...
          return A  
     else
          codigo B....
          return B
     endif

    Con esta version que cumple con la regla de una entrada una salida:

    funcion (param)
     var rta

     if condicion
          codigo A...
          rta = A  
     else
          codigo B....
          rta = B
     endif
     return rta
    Me cuesta mucho entender como es mejor la segunde version, con una variable de mas, es mas rebuscada, no mas simple, y ni me parece mas entendible. Sera cuestion de gustos nomas.  Lo entiendo para funciones muy largas, que uno no puede abarcar con la mirada asi nomas, pero no hay que escribir funciones muy largas y variadas, se divide en funciones mas chicas antes que nada, eso si me parece importante.

        Saludos
       MARCOS
     


  • Me cuesta mucho entender como es mejor la segunde version, con una variable de mas, es mas rebuscada, no mas simple, y ni me parece mas entendible. Sera cuestion de gustos nomas.  Lo entiendo para funciones muy largas, que uno no puede abarcar con la mirada asi nomas, pero no hay que escribir funciones muy largas y variadas, se divide en funciones mas chicas antes que nada, eso si me parece importante.

        Saludos
       MARCOS


    No es más rebuscada Marcos, es más larga y más clara. Las subfunciones se usan para reutilizar código, o sea, cuando las utilizás desde más de un lugar, el uso exagerado lo único que hace es embarrar la cancha haciéndote saltar de un lado a otro para seguir el hilo del código. Generalmente las funciones hacen una tarea determinada que es útil por si misma, no son cachos de código disgregados para que se pueda entender un ciclo complicado dónde puse sentencias break por todos lados o funciones con más salidas que un colador.
    Hablando de variables, vos fijate que necesitaste no menos de cuatro en el ejemplo que me posteaste y yo resolví lo mismo con tu misma lógica usando una sola y guardando las reglas de una programación ordenada...
    No es cierto que ni siquiera sea más costoso a nivel recursos respetar una buena programación.
    Igualmente, como bien dijiste, cada uno es libre de hacer de su código una matraca, y programar como se le canta.

    Saludos, Gabriel
     

  • Me gustaría hacer esa ventanita para poner el código adentro, pero todavía no manejo bien la paleta de herramientas del foro.

    Ponele "Code", la que tiene el numeral arriba.



    no estoy muy al día con el lenguaje que usaste Marcos, así que hice mi versión en Delphi, como programaste en Pascal no vas a tener problemas).

    Pascal / delphi solo lo use enla facultad. Para hacer un trabajo en un lenguaje de alto nivel (que todabia estoy manteniendo), tenia que elegir el lenguaje, y fui directo al Delphi porque no queria saber nada con Visual Basic, pero las pruebas que hice me decepciono tanto, no que se quise hacer, la cosa es que termine usando Visual Basic 6, que lo detesto!!!  >:(  

    El ejemplo que pusiste vos:

       if Lista[i]
    = Valor then Result := I                    //Si es igual asigna el valor de devolución
       else begin
    Si entra en ese IF, el resto de la funcion no importa. Cuanto mas claro seria el codigo si abandonaras ahi mismo la ejecucion, en vez de tener un else que te tira la mayor parte del programa unas columnas a la derecha? Ademas tenes un end abajo de todo que viene de arriba, muy descolgado.

    El resto de la funcion es recursiva, no tiene un loop como la mia, asi no hay mucho break posible  ;) De hecho es la forma mas decente de implementar una busqueda binaria, y si no lo hice asi fue porque ni se me ocurrio, sino lo hubiera hecho asi que es mucho mas entendible smile El ejemplo que elegi es pesimo  :D


    Primer crítica que haría a lo que mandaste es el ciclo infinito, los puristas (o sea rompebolas como yo) lo consideramos malo porque cuando ves un ciclo deberías saber cuando termina por su condición.

    Es que para poner la condicion dentro del while, en casos que la condicion son varias lineas de codigo, tendrias que crear una funcion, y crear una funcion solo para cumplir esa regla.... prefiero seguir siendo un hereje  


    De no ser así, y el ciclo contener un par de cientos de lineas en su interior con un par de decenas de breaks y otros tantos returns, se va a complicar al momento de querer modificar algo.

    Es que no tenes que tener funciones con cientos de lineas!!!!! suprised Solamente en casos en que sea codigo repetitivo, pero nunca con mucha logica adentro, o en casos de seleccion en que tenes 50 opciones y dentro de cada una codigo para esa opcion, pero solo para esa opcion que no afecte al resto de la funcion. Ahi si que no dudo y te lo divido en todas las funciones que sean necesarias. Pero crear una variable rta por no querer usar dos returns, ahi no entro!!.


    El nombre de las variables i,i1,i2 sería interesante que representaran lo que significan (el uso de contadores I,J,K es normal pero el resto...)
    Y finalmente, es más facil programar cuando lo hacés bien de entrada, eso de después correr todo para poner un else no es lo que quise decir.

    Las variables locales les pongo nombres asinomas, de una letra, o poco mas, con las que soy muy estricto es con las publicas. Ademas fijate que i, i2, etc tienen un tipo definido por el programa (tDbLinkIdx) que si conoces la estructura del programa te dice mucho (tipo de indice de registro Link del modulo DB), asi que el resto no es muy necesario.

    La verdad que hace unos años que no leo nada de teoria de programacion, estube metido en otras cosas, y vengo con el piloto automatico. Voy a ver si retomo porque no quiero darme cuenta que en una de esas estoy defendiendo lo indefendible, aunque no creo  ;)

         Saludos
        MARCOS  

    PD: Ahora quede amargado, mañana voy a tener que perder tiempo pasando las 3 rutinas de busqueda binaria a recursividad. Con lo atrazado que estoy!!! Estas cosas es mejor darse cuenta en el momento o nunca  >:(
     


  • De no ser así, y el ciclo contener un par de cientos de lineas en su interior con un par de decenas de breaks y otros tantos returns, se va a complicar al momento de querer modificar algo.

    Es que no tenes que tener funciones con cientos de lineas!!!!! suprised Solamente en casos en que sea codigo repetitivo, pero nunca con mucha logica adentro, o en casos de seleccion en que tenes 50 opciones y dentro de cada una codigo para esa opcion, pero solo para esa opcion que no afecte al resto de la funcion. Ahi si que no dudo y te lo divido en todas las funciones que sean necesarias. Pero crear una variable rta por no querer usar dos returns, ahi no entro!!.


    Se puede poner un goto en el segundo return para tener una sola salida por el primer return ::) ;D ;D
     

  • Marcos, lo único que realmente me decepciona de toda esta discusión, es que te haya decepcionado Delphi y hayas involucionado al Visual Basic !!!  ;D ;D ;D El Delphi no es un lenguaje académico, de hecho tengo implementado el 70% de un sistema para una obra social de tamaño mediano/grande en este lenguaje, con un esquema de tras capas (programa cliente,programa servidor de aplicaciones y base de datos, no la pedorridad que llaman 3 capas los de VB) y te digo que es una satisfacción... ah y sin un solo break ni escapes furtivos de funciones !!!!!  ;D ;D ;D ;D
    Respecto a la salida que propones para el ejemplo que pasé, te puedo objetar sobre que pasaría, si por algún motivo, que quizás no aplica bien a este caso, pero permitime la licencia que tomo solo para graficarme, un par de meses después de haber terminado la rutina, necesito imprimir un cartel o algo similar con el resultado como parte de la función (obviamente hablo de la función iterar y olvidándome por un momento que es recursiva). En ese caso debería hacer tres impresione, una en cada salida que tuviera la función, o modificar todo para que quede como lo hice yo y poner una sola llamada al final.
    Y si hiciera las tres impresiones y meses después tuviera que cambiar el texto, me tendría que acordar que son tres y cambiar cada una de ellas... Bueno, dejemoslo así, todo lo vale si a uno lo hace feliz. Realmente me gustó la opción de pastbytes del GOTO, creo que la voy a empezar a aplicar de ahora en más   tongue tongue tongue
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal