代码之家  ›  专栏  ›  技术社区  ›  rubenvb

好的设计来构建一个完整的程序作为一个FSM?

  •  1
  • rubenvb  · 技术社区  · 14 年前

    我已经使用fsm/pushdown automaton方法构建了一个解析器,如这里所示(而且它工作正常,很好!): C++ FSM design and ownership 它允许我优雅地退出,并在解析器阶段出错时向用户输出一条有用的错误消息。

    我一直在想在程序的其余部分实现这一点的一个好方法,很自然,解析器方法出现在我的脑海中……

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

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

    谢谢你的建议!

    附言:我知道Boost拥有人们可能需要的一切,但我想限制外部依赖,尤其是Boost。C++是可以的(但我认为这里并没有真正相关)。

    3 回复  |  直到 12 年前
        1
  •  1
  •   Pontus Gagge    14 年前

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

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

    为正确的工作使用正确的工具。每种方法都有其优点和缺点。您的解决方案添加了另一层 复杂性 你可以用更多的C++方式处理日志记录和错误处理。如果您不喜欢编写C++代码,那么您可以考虑其他现有语言,而不是只建立一个FSM语言。

        2
  •  0
  •   Puppy    14 年前

    大多数人会使用继承而不是switch/case/default。然而,强迫一切成为一种方式的想法本身就是错误的。您应该始终根据自己的优点来处理每个必需的功能。

        3
  •  0
  •   Dervin Thunk    14 年前

    你总是可以看看 boost .