Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: amchacon en 11 Julio 2013, 00:15 am



Título: (C++) Sobre la estructuración del código
Publicado por: amchacon en 11 Julio 2013, 00:15 am
Tengo un problema que me frie la sangre.

Tengo esto en un archivo:

Código
  1. HILO(DesplazamientoPersonaje,parametro)
  2. {
  3.    Datos* param = (Datos*) parametro;
  4.  
  5.    switch (param->Orientacion)
  6.    {
  7.    case ARRIBA:
  8.        Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
  9.        break;
  10.    case ABAJO:
  11.        Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
  12.        break;
  13.    case IZQUIERDA:
  14.        Transicion(param,-1,0); // Etc
  15.        break;
  16.    case DERECHA:
  17.        Transicion(param,1,0);
  18.        break;
  19.  
  20.    }
  21.  
  22.    delete param;
  23. }
  24.  
  25. void Transicion(Datos* param,short incrx,short incry)
  26. {
  27.    for (short ini = 1; ini < 21; ini++)
  28.    {
  29.            //Blablablabla...
  30.    }
  31.  
  32. }

Y en otro archivo tengo:

Código
  1. HILO(Desplazamiento,parametro)
  2. {
  3.    Datos* param = (Datos*) parametro;
  4.  
  5.    switch (param->Orientacion)
  6.    {
  7.    case ARRIBA:
  8.        Transicion2(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
  9.        break;
  10.    case ABAJO:
  11.        Transicion2(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
  12.        break;
  13.    case IZQUIERDA:
  14.        Transicion2(param,-1,0); // Etc
  15.        break;
  16.    case DERECHA:
  17.        Transicion2(param,1,0);
  18.        break;
  19.  
  20.    }
  21.  
  22.    delete param;
  23. }
  24.  
  25. void Transicion2(Datos* param,short incrx,short incry)
  26. {
  27.  
  28.    for (short ini = 1; ini < 21; ini++)
  29.    {
  30.            // blablabla
  31.  
  32.            if (param->Valor == 1)
  33.                circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);
  34.  
  35.            if (param->Valor == 2)
  36.                circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);
  37.  
  38.            // blablablabla
  39.  
  40.  
  41.    }
  42. }

Son muy parecidas, las unicas diferencia son los dos ifs de la función for. Hay alguna forma (sencilla) de juntar las dos funciones pero conservando los dos ifs?  :-\



Título: Re: (C++) Sobre la estructuración del código
Publicado por: eferion en 11 Julio 2013, 08:29 am
Entiendo que los dos archivos tienen que coexistir en el programa a la vez, no ?

Si estás en c, yo creo que la mejor opción es tener una variable que redirija el flujo del programa en una dirección u otra. Lo más normal sería añadir un 4º parámetro a la función para elegir el camino... un int que haga las veces de booleano, por ejemplo.

Si no, también podrías sacar lo que es común a dos funciones independientes ( funcA ( para lo que hay antes del if ) y funcB ( para lo que hay después ), de tal forma que:

Código
  1. void Transicion(Datos* param,short incrx,short incry)
  2. {
  3.    for (short ini = 1; ini < 21; ini++)
  4.    {
  5.      funcA( param, incrx, incry, i );
  6.      funcB( param, incrx, incry, i );
  7.    }
  8. }
  9.  
  10. void Transicion2(Datos* param,short incrx,short incry)
  11. {
  12.    for (short ini = 1; ini < 21; ini++)
  13.    {
  14.        funcA( param, incrx, incry, ini );
  15.  
  16.        if (param->Valor == 1)
  17.            circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);
  18.  
  19.        if (param->Valor == 2)
  20.            circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);
  21.  
  22.        funcB( param, incrx, incry, ini );
  23.    }
  24. }

Si estás en c++ podrías crear dos clases tal que una herede de la otra y sobreescriba la función o... si quieres aprovechar al máximo el código... que sobreescriba una función secundaria.

Me explico:

Código
  1. class A
  2. {
  3.  public:
  4.    void Transicion( Datos* param, short incrx, short incry )
  5.    {
  6.      // ...
  7.  
  8.      FuncIf( );
  9.  
  10.      // ...
  11.    }
  12.  
  13.  private:
  14.    virtual void FuncIf( Datos* param, short incrx, short incry )
  15.    { }
  16. };
  17.  
  18. class B : public A
  19. {
  20.    virtual void FuncIf( Datos* param, short incrx, short incry )
  21.    {
  22.       if ( ... )
  23.    }
  24. }



Título: Re: (C++) Sobre la estructuración del código
Publicado por: amchacon en 11 Julio 2013, 10:48 am
Lo más normal sería añadir un 4º parámetro a la función para elegir el camino... un int que haga las veces de booleano, por ejemplo.

Perfecto, simplemente he pasado un valor "nulo" en el caso 1 y de esa forma los ifs no se cumplen:

Código
  1. HILO(Desplazamiento,parametro)
  2. {
  3.    Datos* param = (Datos*) parametro;
  4.  
  5.    switch (param->Orientacion)
  6.    {
  7.    case ARRIBA:
  8.        Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
  9.        break;
  10.    case ABAJO:
  11.        Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
  12.        break;
  13.    case IZQUIERDA:
  14.        Transicion(param,-1,0); // Etc
  15.        break;
  16.    case DERECHA:
  17.        Transicion(param,1,0);
  18.        break;
  19.  
  20.    }
  21.  
  22.    delete param;
  23. }
  24.  
  25. void Transicion(Datos* param,short incrx,short incry)
  26. {
  27.  
  28.    for (short ini = 1; ini < 21; ini++)
  29.    {
  30.            // Blablablabla...
  31.  
  32.            if (param->Valor == 1)
  33.                circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);
  34.  
  35.            if (param->Valor == 2)
  36.                circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);
  37.  
  38.            // Blablablabla...
  39.    }
  40. }


Título: Re: (C++) Sobre la estructuración del código
Publicado por: eferion en 11 Julio 2013, 11:17 am
Perfecto, simplemente he pasado un valor "nulo" en el caso 1 y de esa forma los ifs no se cumplen:

Me encanta cuando las cosas salen de forma tan sencilla.

A mi modo de ver es un indicativo de que el código está bien diseñado.