Итак, у меня есть классовая иерархия, которая выглядит так: < /p>
Это встроенный проект, поэтому весь код будет выполняться снова и снова.
Код: Выделить всё
class Algorithm1 { Algo1Output out; };
class Algorithm2 { Algo2Output out; };
class Algorithm3 { Algo3Output out; };
Эти классы алгоритма организованы классом алгоритмов . Этот класс собирает выходы алгоритмов в агрегированном выходе (это просто ссылки на отдельные выходы). < /P>
Код: Выделить всё
class Algorithms {
Algorithm1 a1{};
Algorithm2 a2{};
Algorithm3 a3{};
AlgosOutput out{ a1.out, a2.out, a3.out };
};
class AlgosOutput {
Algo1Output& a1out;
Algo2Output& a2out;
Algo3Output& a3out;
};
Алгоритмы , в свою очередь, управляется классом Manager , который также управляет компьютером состояния и имеет свой собственный вывод, который является лишь ссылкой на выходы алгоритмов и Statemachine :
Код: Выделить всё
class Manager {
StateMachine sm;
Algorithms a;
ManagerOutput out{ sm.out, a.out };
};
class StateMachine {
SmOutput out;
};
< /code>
Вся эта иерархия получает свои входы из общего источника, который просто передается при инициализации. Конструкторы в основном выглядят почти одинаково: < /p>
Manager(InputData& inData) : sm(inData), a(inData) {}
StateMachine(InputData& inData) : inData(inData) {} // holds a reference to inData for actual use
Algorithms(InputData& inData) : a1(inData), a2(inData), a3(inData) {}
Algorithm1(InputData& inData) : inData(inData) {}
Algorithm2(InputData& inData) : inData(inData) {}
Algorithm3(InputData& inData) : inData(inData) {}
Таким образом, у всех компонентов есть ссылка на indata (доступ только для чтения, но я пытался соблюдать краткое краткое изложение фрагментов кода), а Indata обновляется с новой информацией каждый цикл выполнения. И каждый класс в иерархии имеет доступ к выводу классов, непосредственно под ним (который, в свою очередь, содержит Outptus классов, непосредственно под ними и т. Д.). После выполнения, согласно новому состоянию, в котором находится Statemachine , будет использоваться результат одного из 3 классов алгоритма. Эта логика находится в менеджере :
Код: Выделить всё
void Algorithms::execute() {
a1.execute();
a2.execute();
a3.execute();
}
void Manager::execute() {
sm.execute();
a.execute();
switch (out.stateMachineOut.currentState) {
// select one of the 3 algo results for further use
}
}
Проблема заключается в том, что теперь Algorithm2 требует текущего состояния машины состояния для функционирования. Поэтому мне нужен способ передать эту информацию. В идеале элегантный способ, который не включает в себя сложную структуру дизайна, такую как медиатор. Внутренние внутренние системы. Однако из -за того, как работает инициализация C ++, это будет означать, что внутренний менеджер , Statemachine всегда должен оставаться объявленным выше алгоритмов , поэтому он инициируется до алгоритмов , что означает, что мне придется разместить большой комментарий с «оставить машину состояния выше алгоритмы» и надежду, что другие разработчики будут читать его. Передайте текущее состояние Statemachine в качестве аргумента Algorithms :: execute () (что, в свою очередь, передаст его в 3 классы алгоритма). Этот метод также дает мне ощущение, что это будет плохой практикой, поскольку все классы в основном используют только Indata в качестве входных данных, и если бы я добавил в них один единый аргумент, ситуация классов алгоритма изменится на ввод, который будет разделен, примерно с 95% значений ввода внутри Indata , и один входной значение будет передаваться как аргумент. Есть ли что -то, о чем я не думал? Или степень связи неизбежна, поскольку мне в основном нужно внести выход Statemachine в алгоритмы в любом случае?
Подробнее здесь:
https://stackoverflow.com/questions/794 ... archy-in-c