我工作的一个有限状态机库,这些公共方法:声明,异常,运行时错误或未定义行为?
template <typename STATE_T>
void add_state(); // allocate STATE_T on heap - STATE_T must derive from state
template <typename FROM_STATE_T, typename TO_STATE_T>
void link_state(std::function<bool()> cond, unsigned int priority);
// search for base state pointer that can be dynamically caste d to STATE_T* type, set this state as the beginning state
template <typename STATE_T>
void begin_state();
void execute();
//STATE_T must be a user defined state class that inherits from the base state class.
我选择在编译时运行时实现,因为使用可变参数模板参数的状态时,界面会更复杂。但是,我想强制实施一些限制,以确保程序员在实现状态机时不会引入错误。
这里有限制,我想执行:
- 不能添加重复的状态
- 无法链接不存在的状态(如状态类型(即增加了两个相同的派生型。)没有国家的FSM列表)
- 国家必须有一个入口点/可到达
- 一个开始和结束时的必须存在
- 执行不能同时运行多次
声明中止程序并明确遵守这些约束,但它是正确的选择吗?
可能违反了1,2,3并且fsm仍然处于有效状态(根本不做任何事情),但我不喜欢隐式处理这些问题的想法,因为它引入了虚假的安全感隐藏程序员错误。
如果我为1,2,3引发异常并且程序员捕获它们,那么fsm仍然可以处于有效状态,从而允许运行不正常的fsm。
5是不应该做的事情。我应该处理这个问题,还是把它作为UB?
什么是最适合这些约束的机制?