c++ - 将整个程序构建为 FSM 的良好设计?

标签 c++ fsm

我已经使用像这里这样的 FSM/下推自动机方法构建了一个解析器(它工作得很好!):C++ FSM design and ownership 当解析器阶段出现问题时,它允许我优雅地退出并向用户输出有用的错误消息。

我一直想知道在我的程序的其余部分中完成这项工作的好方法,自然地,我想到了解析器方法...

我会让每个对象成为一个状态,它有一个单独的 event() 函数,它有一个 switch 语句,根据我所处的执行阶段调用对象特定的函数。我可以使用特定于对象的枚举来跟踪它,并使代码更具可读性(case parsercase 5 更具可读性)。这将允许我关闭我创建的状态的下推树(在我的其他问题中使用 m_parent* 方法)。

这是好的设计吗(强制一切都在 FSM 模式下)?有没有更好的方法,它会复杂多少(我发现 FSM 很容易实现和测试)?

感谢您的建议!

PS:我知道 boost 拥有人们可能需要的一切,但我想限制外部依赖性,尤其是在 boost 上。虽然 c++0x 还可以(但我认为这里不是很相关)

最佳答案

您所做的有点像在您的程序中构建一个(简单的)虚拟机。 FSM 往往非常适合一些受限制的问题,例如词法分析和解析,而且正如您可能已经注意到的那样,您可以“免费”获得相当多的日志记录和错误管理。

但是,如果您尝试将 FSM 模式应用于所有内容(这对于例如包含大量状态的 GUI 程序来说很难,您通常不想将其变成显式状态),您将意识到您还需要工具来调试您的 FSM(因为 C++ 调试器不会理解您的状态和事件)和工具来链接和重用状态(因为状态不会是 OO 级别的构造)。如果您想将您的代码交给其他人,他或她将需要额外的培训才能成功使用您的 FSM。您是否要为多个应用程序保留一个 FSM 引擎?如果是这样,您将如何处理版本控制和升级?

为正确的工作使用正确的工具。每种方法都有其优点和缺点。您的解决方案增加了另一层复杂性:您可以用更多类似 C++ 的方式来处理日志记录和错误处理。如果您对编写 C++ 代码不满意,您可能会考虑其他现有语言,而不是构建只有您理解的 FSM 语言。

关于c++ - 将整个程序构建为 FSM 的良好设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3699663/

相关文章:

c++ - 我怎样才能得到一个返回自身的 boost::function (或其他通用函数包装器)?

另一种方式的python FSM Fysom回调

javascript - 从一种特定状态转换到另一种特定状态时执行操作?

c++ - GTest改变失败的输出

java - 正确实现三次样条插值

c++ - Cmake:将 openscenegraph 链接到我的共享库

java - JBoss/Java 的状态机框架?

c++ - 为什么不总是使用 fpic(位置无关代码)?

c++ - 将指向模板函数的指针作为函数参数传递?

recursion - 在 F# 中使用不可变记录的状态机