用C ++设计状态机

问题描述 投票:7回答:7

我有一个涉及建模状态机的小问题。

[我设法进行了一些知识工程,并对一组确定状态以及状态转换的原始确定性规则进行了“逆向工程”。

我想知道最佳实践是什么:

  • 如何严格测试我的状态和状态转换,以确保系统不会处于不确定状态。

  • 如何执行状态转换要求(例如,应该不可能直接从stateFoo转到StateFooBar,即,向每个州灌输关于其可以转换到的状态的“知识”。

    ]
  • 理想情况下,我想使用整洁的,基于模式的设计,并尽可能使用模板。

尽管我确实需要一个开始的地方,对于以我的方式发送的任何指针(无双关语,我将不胜感激。)>

我有一个涉及建模状态机的小问题。我设法进行了一些知识工程和“逆向工程”,以一套原始的确定性规则来确定...

c++ design-patterns state-machine state-pattern
7个回答
7
投票

请务必查看Boost Statechart Library


3
投票

天哪,它看起来并不复杂。状态机代码非常简单且简短。


1
投票

测试与模式,模板等关系不大。我建议使用像CppUnit(xUnit系列的一部分)这样的测试框架来捕获所有测试用例。数量当然取决于状态机的复杂度。

您关于强制执行状态转换的问题已成为您的状态机类设计的核心。我想说的是,一个状态将具有一组可能过渡到的子状态,以及将触发每个子状态的事件。如果事件Foo没有FooBar子级,则无法过渡到该子级。


1
投票

使用状态机有时会出现。我通常按​​照建议的建议做,只是简单地做一个switch语句。但是,这仅在状态不是太大的情况下有效。听起来有点像您的情况。考虑到这一点,我认为最好的方法是从一个好的架构开始,该架构将允许您执行某些操作。我接受了达菲(Duffymo)的建议,并尝试了Google。本文看起来很有趣-Object-Oriented State Machines。可能矫kill过正,但我​​认为它将提供一个易于使用CppUnit之类进行测试的框架。

[来自Google搜索的其他一些很好的参考


0
投票

听起来像是用于单元测试的原始应用程序。那里有许多单元测试框架。我碰巧喜欢Boost one


0
投票

如果您正在寻找经典的GOF设计模式状态机模式,请查看wikipedia

在Java示例中查看此页面(在撰写本文时)。


0
投票
如果您喜欢状态设计模式,我做了一个实验,然后将该模式移到了库中:https://code.google.com/p/dpsmlib/
© www.soinside.com 2019 - 2024. All rights reserved.