Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 15 Marzo 2016, 23:42 pm



Título: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: class_OpenGL en 15 Marzo 2016, 23:42 pm
Hola, muy buenas. Haciendo un código me ha surgido una duda bastante importante a mi parecer. Según tengo entendido, una buena función es aquella que apenas tiene 'return'. Bien, pues yo quiero hacer una función con un diagrama de flujo como el siguiente:

Realizar Operación
Comprobar si ha salido bien
>> Ha salido mal
     Salir del programa
>> Ha salido bien
Realizar Operación 2º
>> Ha salido mal
     Salir del programa
>> Ha salido bien
Realizar Operación 3º
...
Y así sucesivamente hasta que todas las operaciones hayan terminado con éxito. Eso, en C++, sería algo así:

Código
  1. bool funcion() {
  2.    Realizar_Operacion_1();
  3.    if(Operacion_1_ha_tenido_exito() == false) {
  4.        return false;
  5.    }
  6.  
  7.    Realizar_Operacion_2();
  8.    if(Operacion_2_ha_tenido_exito() == false) {
  9.        return false;
  10.    }
  11.    Realizar_Operacion_3();
  12.    ...
  13.  
  14.    return true;
  15. }

Ahora bien, si tenemos en cuenta lo que dije al principio, este programa no sería el mejor porque tiene muchos saltos de línea 'return'. Entonces, otra forma de solucionarlo es así:

Código
  1. bool funcion() {
  2.    Realizar_Operacion_1();
  3.    if(Operacion_1_ha_tenido_exito() == false) {
  4.        return false;
  5.    } else {
  6.        Realizar_Operacion_2();
  7.        if(Operacion_2_ha_tenido_exito() == false) {
  8.            return false;
  9.        } else {
  10.            Realizar_Operacion_3();
  11.            ...
  12.        }
  13.    }
  14.  
  15.    return true;
  16. }

Pero este código se hace muy "ancho" cuando hay muchas operaciones a comprobar.

Entonces, lo último que se me ha ocurrido es lo siguiente:
Código
  1. bool funcion() {
  2.    bool error = false;
  3.  
  4.    Realizar_Operacion_1();
  5.    if(Operacion_1_ha_tenido_exito() == false) {
  6.        error = true;
  7.    }
  8.  
  9.    if(error == false) {
  10.        Realizar_Operacion_2();
  11.        if(Operacion_2_ha_tenido_exito() == false) {
  12.            error = true;
  13.        }
  14.    }
  15.  
  16.    if(error == false) {
  17.        Realizar_Operacion_3();
  18.        if(Operacion_3_ha_tenido_exito() == false) {
  19.            error = true;
  20.        }
  21.    }
  22.  
  23.    ...
  24.  
  25.    return error;
  26. }

Pero no lo veo muy bien, son muchos 'if' que no sé si son necesarios...

Me gustaría saber si saber de algún método mejor para realizar este tipo de diagramas de flujo... Gracias


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: xiruko en 15 Marzo 2016, 23:52 pm
Según tengo entendido, una buena función es aquella que apenas tiene 'return'.

Y donde has oido eso?

Siguiendo con tu ejemplo, yo no veo nada de malo en hacer algo así:

Código
  1. bool funcion()
  2. {
  3.   if (!RealizarOperacion1()) return false;
  4.   if (!RealizarOperacion2()) return false;
  5.   if (!RealizarOperacion3()) return false;
  6.   return true;
  7. }

Saludos!


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: class_OpenGL en 16 Marzo 2016, 00:20 am
Eso me han comentado, por eso no lo he afirmado... En cualquier caso, creo que el problema reside a nivel de ensamblador, donde la instrucción return "trocea" el programa (sinceramente, no lo sé muy bien, y tampoco sé que puede tener de malo :P)


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: xiruko en 16 Marzo 2016, 00:27 am
Bueno por eso te preguntaba que dónde habías oido eso, por curiosidad.

A nivel de ensamblador, la instrucción return no es más que un jump igual que los ifs, whiles, y cualquier otro bucle, solo que return coge la dirección de salto de la pila.

Pero bueno, a ver si algún experto se pasa y comenta.

Saludos!


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: MAFUS en 16 Marzo 2016, 07:07 am
El que haya un solo return por función es una de las corrientes de estilo de programación y tiene muchos seguidores, yo me incluyo, aunque no la llevo a rajatabla.
Es como otras como no salir de los bucles con break, no usar goto para la lógica, etc.
Yo digo: todos estos estilos tienen su espacio y su momento. Hay que usar el que, en cada momento,  deje más claro el código a la hora de revisarlo.


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: class_OpenGL en 16 Marzo 2016, 08:14 am
Comprendo... Pero, para que quede claro, escribir un programa como el que he planteado (el que tiene muchos return), en este caso, no estaría mal, ¿no? Gracias!


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: MAFUS en 16 Marzo 2016, 08:44 am
La primera y la tercera me gustan, la tercera me gusta más. La 2 no la haría.

Tambien puedes encadenar ifs:
Código
  1. bool retValue = false;
  2. if ( func1 ())
  3. if ( func2 ())
  4. if ( func3 ())
  5.    retValue = true;
  6.  
  7. return retValue;
  8.  

Queda bonito, visible a simple vista y quitas letras de enmedio.


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: class_OpenGL en 16 Marzo 2016, 15:00 pm
Si, pero el problema de encadenar ifs es que no quiero que las operaciones sigan XD. Me quedaré con la tercera forma, aunque resulte un poco tedioso...

Muchas gracias a tod@s por sus respuestas!


Título: Re: (Consulta) Optimizando programas omitiendo los saltos de líneas
Publicado por: engel lex en 16 Marzo 2016, 15:14 pm
para hoy dia con lo complejo de los compiladores no simplemente convierten pican e codigo y lo pasan a ensamblador...

primero, los satos de linea son irrelevantes, segundo como dice xiruko, a nivel de codigo son igules (aunque los return no son jmp, sino ret, que son casi iguales solo que el ret sabe donde volver, no tiene que indicarsele)

por otro lado el compilador optimiza el código, así que posiblemente a nivel de compilador tus 3 opciones terminen siendo un código ensamblador casi idéntico... dicho esto, lo importante al programar es que sea cómodamente legible pra que pueda revisarse, corregirse y darle mantenimiento facilmente