Autor
|
Tema: (C++) Sobre la estructuración del código (Leído 2,538 veces)
|
amchacon
Desconectado
Mensajes: 1.211
|
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?
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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 ( ... ) } }
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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... } }
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
problema de estructuracion
Programación Visual Basic
|
fraktal
|
1
|
1,286
|
15 Septiembre 2006, 11:55 am
por WarGhost
|
|
|
Pregunta sobre un codigo
Programación Visual Basic
|
CH4ØZ
|
3
|
2,110
|
13 Octubre 2009, 04:21 am
por BlackZeroX
|
|
|
Pregunta sobre código
PHP
|
darkvidhack
|
4
|
2,090
|
19 Agosto 2011, 00:49 am
por darkvidhack
|
|
|
un par de dudas sobre codigo
Programación C/C++
|
ALCales
|
4
|
3,965
|
14 Enero 2012, 23:30 pm
por Xandrete
|
|
|
(Duda) Piramide completa en batch. Estructuración.
Scripting
|
zero-cool22
|
1
|
3,703
|
30 Enero 2014, 21:26 pm
por Meine programmen
|
|