Comencé una migración de un algoritmo de física de alta energía escrito en FORTRAN a un enfoque orientado a objetos en C++. El código FORTRAN utiliza muchas variables globales en una gran cantidad de funciones.Patrón para compartir datos entre objetos en C++
He simplificado las variables globales en un conjunto de variables de entrada, y un conjunto de invariantes (variables calculadas una vez al comienzo del algoritmo y luego utilizadas por todas las funciones).
Además, he dividido el algoritmo completo en tres pasos lógicos, representados por tres clases diferentes. Por lo tanto, de una manera muy sencilla, tengo algo como esto:
double calculateFactor(double x, double y, double z)
{
InvariantsTypeA invA();
InvariantsTypeB invB();
// they need x, y and z
invA.CalculateValues();
invB.CalculateValues();
Step1 s1();
Step2 s2();
Step3 s3();
// they need x, y, z, invA and invB
return s1.Eval() + s2.Eval() + s3.Eval();
}
Mi problema es:
- para hacer los cálculos de todos los
InvariantsTypeX
yStepX
objetos necesitan los parámetros de entrada (y estos no son solo tres). - los tres objetos
s1
,s2
ys3
necesitan los datos de los objetosinvA
yinvB
. - todas las clases utilizan varias otras clases a través de la composición para hacer su trabajo, y todas esas clases también necesitan la entrada y los invariantes (por ejemplo,
s1
tiene un objeto miembrotheta
de claseThetaMatrix
que necesitax
,z
yinvB
para construirse). - No puedo reescribir el algoritmo para reducir los valores globales, porque sigue varias fórmulas de física de alta energía, y esas fórmulas son así.
¿Hay un buen patrón para compartir los parámetros de entrada y los invariantes a todos los objetos que se utilizan para calcular el resultado?
¿Debo usar singletons? (pero la función calculateFactor
se evalúa alrededor de un millón de veces)
¿O debería pasar todos los datos requeridos como argumentos a los objetos cuando se crean? (pero si hago eso, entonces los datos se pasarán a todas partes en cada miembro objeto de cada clase, creando un lío)
Gracias.
"¿Debo usar singletons?" NOOOOOOOOOOO! (Gritando de forma muy melodramática, en cámara lenta :)) –
Para aclarar lo que dice @John: los singleton son una herramienta útil, pero no son la herramienta adecuada para esta situación. No estoy completamente convencido de que necesite usar clases aquí, ya que este es el dominio de la programación funcional, pero no es la peor solución posible al problema. –
¿FORTRAN ha "nombrado bloques COMMON"? –