Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema con la implementacion de Clases

Estas en el tema de Problema con la implementacion de Clases en el foro de .NET en Foros del Web. Saludos Foreros Tengo el siguiente problema, a ver si alguien me puede dar una idea de como solucionarlo de una manera ""elegante"".. o bien.. no ...
  #1 (permalink)  
Antiguo 12/08/2009, 18:39
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 6 meses
Puntos: 5
Problema con la implementacion de Clases

Saludos Foreros

Tengo el siguiente problema, a ver si alguien me puede dar una idea de como solucionarlo de una manera ""elegante"".. o bien.. no tan elegante pero efectiva

Tengo un conjunto de datos (muchos datos) con los cuales debo hacer calculos (muchos calculos). estos calculos se hacen con un set de formulas

pues bien, siguiendo un poco de lejos la programacion poo, me cree una clase, que encapsula estas formulas, y ademas defini para esta clase, un set de propiedades, que es como le estoy pasando los valores que usaran estas formulas para generar los resultados...
este es un esquema de como esta estructurada la clase

class cFormulas
{
//Propertys
private Int32 iNI_Acu;
public Int32 iNumeroInicioMes_Acu
{
get
{
return iNI_Acu;
}
set
{
iNI_Acu = value;
}
}

private double dBI_Acu;
public double dBioMasaInicioMes_Acu
{
get
{
return dBI_Acu;
}
set
{
dBI_Acu = value;
}
}
.
.
.
.
.
// muchas propertys

// funciones miembro de la clase (calculos)
public double? dCalculaPesoInicial()
{
try
{
return System.Math.Round((dB0_Acu / iN0_Acu) * 1000, 4);
}
catch (Exception)
{
return null;
}
}
public double? dCalculaPorcentajeCrecimientoUltimoMes()
{
double dVarAux_Biomasas1 = dBF_UltPer + dBH_UltPer + dBOUT_UltPer;
double dVarAux_Biomasas2 = dBI_UltPer + dB0_UltPer + dBIN_UltPer;
Int32 iVarAux_Numeros1 = iNF_UltPer + iNH_UltPer + iNOUT_UltPer;
Int32 iVarAux_Numeros2 = iNI_UltPer + iN0_UltPer + iNIN_UltPer;
try
{
return System.Math.Round((((dVarAux_Biomasas1 / iVarAux_Numeros1) - (dVarAux_Biomasas2 / iVarAux_Numeros2)) / (dVarAux_Biomasas2 / iVarAux_Numeros2) * 100), iNumeroDecimales);
}
catch (Exception)
{
return null;
}
}
.
.
.
.
.
// muchos calculos
}

Esto funciona bien, pero tiene una complicacion, y es que como son MUCHOS calculos, al instanciar la clase, debo estar llenando todos y cada uno de las variables que esta clase ocupa.... a su vez, por cada calculo debo llamar a la funcion miembro correspondiente..

se me ocurre que, dado que los datos los puedo tener de alguna forma en structs, los puedo pasar de esta manera a la clase (solucion aceptable)
lo que no puedo conseguir aun, es ver una manera de automatizar las llamadas a las funciones miembro, dado que estas tienen un nombre distinto cada una
Se me ocurre entonces, crear una unica funcion miembro, que internamente en la clase, llame a la funcion correspondiente (con algun codigo), pero no puedo concretar esta idea.. se que existen metodos que hacen este tipo de trabajos, pero no soy muy habil aun con la programacion OOP.

Si alguien tiene una idea, y me puede ayudar, quedare muy agradecido

Saludos
PLCH
  #2 (permalink)  
Antiguo 12/08/2009, 20:08
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Problema con la implementacion de Clases

no termino de entender lo que necesitas.

necesitas que si por ejemplo que involucra

-dCalculaPorcentajeCrecimientoUltimoMes
-dCalculaPesoInicial

internamente lo invoques sin ningun problema o generar funciones dinamicamente con solo pasar como parametros que otras funciones invocar?

dime si estoy equivocado o si no entendi
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 12/08/2009, 20:26
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problema con la implementacion de Clases

Hola, muchas gracias por responder..
a ver si me explico mejor..

Al momento de ejecutar las formulas, tengo que hacer lo siguiente

cFormulas cCalculo = new cFormulas(); // instancio la clase
if (cCalculo.iCalculaNumeroInicial() == null)
{
alguna accion
}
else
{
aca debo guardar en una BD el resultado del calculo
}

asi como este calculo, debo hacer muchos mas (decenas)

mi idea es poder quiza, hacer un ciclo, pasandole como parametros algun codigo que identifique la formula. No se si se entiende mas mi idea.

si es qu eexiste otra forma para hacer eso, estoy atento a cualquier recomendacion
Gracias :)
slds PLCH
  #4 (permalink)  
Antiguo 12/08/2009, 21:35
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Problema con la implementacion de Clases

claro que existe una manera usando reflection y sabiendo que tu clase solo necesita inicializarse tu podrias sin problemas invocar al metodo que deseas con solo el nombre

supongamos que tienes una clase x
Código csharp:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace MiClase
  7. {
  8.     public class ClaseX
  9.     {
  10.         private static string pvalorX;
  11.         public static string valorX { get { return pvalorX; } set { pvalorX=value;} }
  12.  
  13.         public static double Metodo1()
  14.         {
  15.            /// loque sea que haga
  16.                         return 3.0;
  17.         }
  18.  
  19.  
  20.         public static double Metodo2()
  21.         {
  22.                         return 1.0;
  23.         }
  24.  
  25.         public static double Metodo3()
  26.         {
  27.             return 2.0;
  28.         }
  29.  
  30.     }
  31. }

y quieres invocar tus metodos dinamicamente solo con el nombre

Código csharp:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Reflection;
  5.  
  6.  
  7. namespace MiClase
  8. {
  9.    public class ClassInvocaDinamicamente
  10.     {
  11.         public double cualquierfuncion(string metodo)
  12.         {  
  13.             //Namespace.NombreClase
  14.             Type variableTipo = Type.GetType("MiClase.ClaseX");
  15.             // Que Metodo Invocar
  16.             MethodInfo variableInfoMetodo= variableTipo.GetMethod(metodo);
  17.             // Ojo esto solo funcionara si tu constructor es static sin parametros y si tus metodos son estaticos y no requieren que instancies la clase
  18.             object instanciaResultado=variableInfoMetodo.Invoke(null, null);
  19.             double resultado = Convert.ToDouble(instanciaResultado);
  20.             return resultado;
  21.         }
  22.     }
  23. }


y cuando invoques tu metodo simplemente haras algo como esto

Código csharp:
Ver original
  1. MiClase.ClassInvocaDinamicamente objeto = new MiClase.ClassInvocaDinamicamente();
  2.             Console.WriteLine(objeto.cualquierfuncion("Metodo1"));
  3.             Console.WriteLine(objeto.cualquierfuncion("Metodo2"));
  4.             Console.WriteLine(objeto.cualquierfuncion("Metodo3"));
  5.             Console.ReadLine();

prueba haciendo algo asi , pero pon atencion a los detalles esta es la forma rapida considerando q tus propiedades, metodos y miembros practicamente todos son estaticos, si tienes miembros no estaticos hay q trabajar mas con reflection pero de que puedes invocar metodos solo con el nombre es indudable.

cualquier dudad no aqui estamos para ayudarte
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #5 (permalink)  
Antiguo 13/08/2009, 06:39
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problema con la implementacion de Clases

uhhh maestro!!!! ... siempre he dicho... el que sabe... sabe
Gracias por la informacion, voy a probar tu idea a ver que tal me va
Gracias
Slds PLCH
  #6 (permalink)  
Antiguo 13/08/2009, 09:28
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problema con la implementacion de Clases

Estimado, le comento que su idea funciono a la excelentemente bien
Para implementar, puse todas las funciones miembro que realizan calculos, en una tabla, con sus tipos de datpos retornados, con lo cual solo me basta con hacer un foreach al datatable, para invocar el metodo necesario por cada tipo de calculo, y al mismo tiempo guardo el resultado en la misma tabla.
Gracias por la excelente ayuda
Saludos
PLCH
  #7 (permalink)  
Antiguo 13/08/2009, 09:30
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Problema con la implementacion de Clases

que buenoo que funciono, y es mucho mejor tu idea de almacenar los identificadores de namespaces, clases, propiedades y metodos para optimizar la generacion de codigo ejecucion.

que bueno que funciono para eso estamos para ayudar.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:14.