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: 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: 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? :-\
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: 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: 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 ( ... ) } }
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: 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... } }
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.
|