Я начал миграцию алгоритма физики высоких энергий, написанного в FORTRAN, на объектно-ориентированный подход на С++. Код FORTRAN использует множество глобальных переменных во множестве функций.
Я упростил глобальные переменные в набор входных переменных и набор инвариантов (переменные, вычисленные один раз в начале алгоритма, а затем используемые всеми функциями).
Кроме того, я разделил полный алгоритм на три логических шага, представленных тремя разными классами. Итак, очень просто, у меня есть что-то вроде этого:
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();
}
Моя проблема:
- Для выполнения вычислений всем объектам
InvariantsTypeX
иStepX
нужны входные параметры (и это не только три). - для трех объектов
s1
,s2
иs3
нужны данные объектовinvA
иinvB
. - все классы используют несколько других классов через композицию для выполнения своей работы, и всем этим классам также нужен вход и инварианты (например,
s1
имеет объект-членtheta
классаThetaMatrix
, которому требуетсяx
,z
иinvB
, чтобы построить). - Я не могу переписать алгоритм для уменьшения глобальных значений, поскольку он следует за несколькими физическими формулами высоких энергий, и эти формулы так же.
Есть ли хороший шаблон для совместного использования входных параметров и инвариантов ко всем объектам, используемым для вычисления результата?
Должен ли я использовать синглтоны? (но функция calculateFactor
оценивается примерно миллион раз)
Или мне нужно передать все необходимые данные в качестве аргументов для объектов при их создании? (но если я это сделаю, то данные будут передаваться везде в каждом объекте-члене каждого класса, создавая беспорядок)
Спасибо.