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

0

У нас есть приложение, которое запускается каждые 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++)? Также будут полезны любые указатели на соответствующие шаблоны проектирования.

  • 0
    Вид наблюдателей может быть? Ваш вопрос довольно широкий, без краткого примера.
  • 0
    О каких наблюдателях вы думаете? Состояние наблюдателей также зависит друг от друга, что является сложной частью. Кроме того, это основанное на цикле приложение, поэтому знание того, что состояние объекта Foo необходимо обновить, не является сложной частью здесь.
Показать ещё 5 комментариев
Теги:
oop
design-patterns
design
class-design

1 ответ

1

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню