elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (C++) Sobre la estructuración del código
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (C++) Sobre la estructuración del código  (Leído 2,538 veces)
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
(C++) Sobre la estructuración del código
« 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?  :-\



En línea

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: (C++) Sobre la estructuración del código
« Respuesta #1 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. }



En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: (C++) Sobre la estructuración del código
« Respuesta #2 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. }
En línea

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: (C++) Sobre la estructuración del código
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema de estructuracion
Programación Visual Basic
fraktal 1 1,286 Último mensaje 15 Septiembre 2006, 11:55 am
por WarGhost
Pregunta sobre un codigo
Programación Visual Basic
CH4ØZ 3 2,110 Último mensaje 13 Octubre 2009, 04:21 am
por BlackZeroX
Pregunta sobre código
PHP
darkvidhack 4 2,090 Último mensaje 19 Agosto 2011, 00:49 am
por darkvidhack
un par de dudas sobre codigo
Programación C/C++
ALCales 4 3,965 Último mensaje 14 Enero 2012, 23:30 pm
por Xandrete
(Duda) Piramide completa en batch. Estructuración.
Scripting
zero-cool22 1 3,703 Último mensaje 30 Enero 2014, 21:26 pm
por Meine programmen
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines