Как использовать шаблоны проектирования для множества взаимозависимых состояний?

У нас есть приложение, которое запускается каждые 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 будучи уже обновленным, foo4 вычисление зависит от foo2 а также foo3 уже обновляется и так далее.

Наш текущий дизайн представляет собой простой последовательный поток, который неявным образом имеет все эти зависимости, которые нигде не фиксируются и не применяются, что затрудняет поддержку кода.

Какие бы хорошие способы структурировать вычисления Foo(n) сделать поток кода интуитивно понятным и простым для понимания / поддержки (с использованием C ++)? Любые указатели на соответствующие шаблоны дизайна также будут полезны.

0

Решение

Ваша цель состоит в том, чтобы вычислить каждый объект после того, как были вычислены объекты, от которых он зависит. Похоже, вы делали это вручную в своем коде и находили его подверженным ошибкам.

Вот простой подход. Это может быть значительно улучшено путем сортировки на основе зависимостей, но это сделает работу.

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's dependencies are met)
compute object
Mark as computed

Делая это, вы упростите код, потому что вы можете просто добавлять / изменять ваши объекты и их непосредственные зависимости, не беспокоясь о том, где их добавить в список. Приведенный выше алгоритм будет гарантировать, что они рассчитаны в правильном порядке.

Это не особенно быстрый метод — это грубая сила, но легко. Это может быть значительно улучшено.

Вы можете записать порядок, в котором вы вычислили объекты, и повторно использовать его в последующем проходе (при условии, что ничего не изменилось).

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector