У нас есть приложение, которое запускается каждые 5-10 минут, а работа приложения - использовать последние данные для обновления состояния в памяти для объектов класса Foo
. Состояние класса может быть представлено как:
Class Foo {
int foo1;
double foo2;
bar foo3;
double foo4;
...
...
int fooN;
}
Итак, для n'th
запуска этого приложения, которое получает последние данные bazObj(n)
класса Baz
, Foo(n) = f(Foo(n-1), Baz(n))
Трудность здесь в том, что есть много взаимозависимостей в вычислении. Например, вычисление foo3
зависит от foo1
что foo1
уже обновлен, вычисление foo4
зависит от того, что foo2
и foo3
уже обновлены и так далее.
Наш нынешний дизайн представляет собой простой последовательный поток, который неявно содержит все эти зависимости, которые не фиксируются и не выполняются нигде, что затрудняет поддержание кода.
Каковы были бы хорошие способы структурирования вычислений Foo(n)
чтобы сделать поток кода интуитивно понятным и понятным/поддерживающим (используя C++)? Также будут полезны любые указатели на соответствующие шаблоны проектирования.
Кажется, ваша цель состоит в том, чтобы вычислить каждый объект после того, как объекты, от которых он зависит, были вычислены. Похоже, вы делали это вручную в своем коде и находили его склонным к ошибкам.
Вот простой подход. Он может быть значительно улучшен путем сортировки на основе зависимостей, но он выполнит свою работу.
create a list of every object with a list of objects that it depends on
while (some objects are not computed)
for (each uncomputed object)
if (object dependencies are met)
compute object
Mark as computed
Это упростит код, потому что вы можете просто добавлять/изменять свои объекты и их непосредственные зависимости, не беспокоясь о том, где их добавить в список. Вышеупомянутый алгоритм гарантирует, что они будут вычислены в правильном порядке.
Это не особенно быстрый метод - это грубая сила, но простая. Это может быть значительно улучшено.
Вы можете записать порядок, в котором вы вычислили объекты, и повторно использовать его в последующем проходе (при условии, что ничего не изменилось).