Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
5年前关闭。
我正在使用以下公共方法来开发有限状态机库:
我选择了运行时实现而不是编译时实现,因为在状态下使用可变参数模板参数时,接口会更加复杂。但是,我要强制执行一些约束,以确保程序员在实现其状态机时不会引入错误。
以下是我要强制执行的约束:
无法添加重复状态(即,添加两个相同的派生类型)
无法链接不存在的状态(例如状态fsm列表中没有的状态类型)
州必须有一个入口点/可以到达
开始和结束状态必须存在
execute不能同时运行多次
断言中止程序,并明确遵守这些约束,但这是正确的选择吗?
可能会违反1,2,3,并且fsm仍处于有效状态(仅不执行任何操作),但是我不喜欢隐式处理这些错误的想法,因为它通过隐藏程序员错误而引入了错误的安全感。
如果我抛出1,2,3的异常并且程序员捕获了它们,则fsm可能仍处于有效状态,从而允许运行格式错误的fsm。
5是不应做的事情。我应该处理此问题,还是将其保留为UB?
用于这些约束的最合适的机制是什么?
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
5年前关闭。
我正在使用以下公共方法来开发有限状态机库:
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列表中没有的状态类型)
州必须有一个入口点/可以到达
开始和结束状态必须存在
execute不能同时运行多次
断言中止程序,并明确遵守这些约束,但这是正确的选择吗?
可能会违反1,2,3,并且fsm仍处于有效状态(仅不执行任何操作),但是我不喜欢隐式处理这些错误的想法,因为它通过隐藏程序员错误而引入了错误的安全感。
如果我抛出1,2,3的异常并且程序员捕获了它们,则fsm可能仍处于有效状态,从而允许运行格式错误的fsm。
5是不应做的事情。我应该处理此问题,还是将其保留为UB?
用于这些约束的最合适的机制是什么?
最佳答案
这是处理错误的相当典型的问题。答案通常取决于成本。问题被忽视的代价是什么?程序异常中止的费用是多少?
在大多数情况下,程序崩溃的代价并不是很大。用户将重新启动它。在这种情况下,您应该寻求未处理的异常。这样,您将迅速注意到这些错误,对其进行修复,最后得到一个更好的程序。
有一种混合方法:在DEBUG构建中,使用“声明失败”消息框处理错误(通常是通过ASSERT()宏完成),但是在Release构建中,静默处理错误。但是,这使问题在客户端计算机上不被察觉,通常会触发其他错误,这些错误很难发现。
最后,您担心程序员可能会处理异常:这不是您应该考虑的事情。您指出了一个致命错误,如果程序员忽略了它,那是他的错。