(C++) Sobre la estructuración del código

Iniciado por amchacon, 11 Julio 2013, 00:15 AM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

Tengo un problema que me frie la sangre.

Tengo esto en un archivo:

Código (cpp) [Seleccionar]

HILO(DesplazamientoPersonaje,parametro)
{
   Datos* param = (Datos*) parametro;

   switch (param->Orientacion)
   {
   case ARRIBA:
       Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
       break;
   case ABAJO:
       Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
       break;
   case IZQUIERDA:
       Transicion(param,-1,0); // Etc
       break;
   case DERECHA:
       Transicion(param,1,0);
       break;

   }

   delete param;
}

void Transicion(Datos* param,short incrx,short incry)
{
   for (short ini = 1; ini < 21; ini++)
   {
           //Blablablabla...
   }
   
}


Y en otro archivo tengo:

Código (cpp) [Seleccionar]
HILO(Desplazamiento,parametro)
{
   Datos* param = (Datos*) parametro;

   switch (param->Orientacion)
   {
   case ARRIBA:
       Transicion2(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
       break;
   case ABAJO:
       Transicion2(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
       break;
   case IZQUIERDA:
       Transicion2(param,-1,0); // Etc
       break;
   case DERECHA:
       Transicion2(param,1,0);
       break;

   }

   delete param;
}

void Transicion2(Datos* param,short incrx,short incry)
{
   
   for (short ini = 1; ini < 21; ini++)
   {
           // blablabla

           if (param->Valor == 1)
               circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);

           if (param->Valor == 2)
               circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);

           // blablablabla

       
   }
}


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?  :-\

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

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:


void Transicion(Datos* param,short incrx,short incry)
{
    for (short ini = 1; ini < 21; ini++)
    {
      funcA( param, incrx, incry, i );
      funcB( param, incrx, incry, i );
    }
}

void Transicion2(Datos* param,short incrx,short incry)
{
    for (short ini = 1; ini < 21; ini++)
    {
        funcA( param, incrx, incry, ini );

        if (param->Valor == 1)
            circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);

        if (param->Valor == 2)
            circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);

        funcB( param, incrx, incry, ini );
    }
}


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 (cpp) [Seleccionar]

class A
{
  public:
    void Transicion( Datos* param, short incrx, short incry )
    {
      // ...

      FuncIf( );

      // ...
    }

  private:
    virtual void FuncIf( Datos* param, short incrx, short incry )
    { }
};

class B : public A
{
    virtual void FuncIf( Datos* param, short incrx, short incry )
    {
       if ( ... )
    }
}



amchacon

Cita de: eferion en 11 Julio 2013, 08:29 AMLo 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 (cpp) [Seleccionar]
HILO(Desplazamiento,parametro)
{
    Datos* param = (Datos*) parametro;

    switch (param->Orientacion)
    {
    case ARRIBA:
        Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo
        break;
    case ABAJO:
        Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo
        break;
    case IZQUIERDA:
        Transicion(param,-1,0); // Etc
        break;
    case DERECHA:
        Transicion(param,1,0);
        break;

    }

    delete param;
}

void Transicion(Datos* param,short incrx,short incry)
{

    for (short ini = 1; ini < 21; ini++)
    {
            // Blablablabla...

            if (param->Valor == 1)
                circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]);

            if (param->Valor == 2)
                circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]);

            // Blablablabla...
    }
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Cita de: amchacon en 11 Julio 2013, 10:48 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.