我开始用状态机实现一个系统。但我到了怀疑状态机是否是正确方法的地步。
例如:我有四种状态:
(空闲,启动,关闭,工作)
以及其他两个州:
(生产、测试)
在生产和测试状态中,powerup和powerdown的行为是不同的。
如果我有更多的州,州的组合会爆炸.
如何用状态机解决这个问题?
发布于 2017-07-09 22:28:01
这一点很难回答,因为实际的用例非常模糊,但以下是一些可能的技术:
优点:直率。
缺点:杂乱无章,不能很好地扩展,如果在实例之间共享一些状态逻辑,就会涉及到一些副本面点(因此,不太容易维护)。
因此,在您的示例中,您将有一个生产/测试状态机,每个状态机都将在内部实现它自己的Idle/Powerup/Powerdown/Work状态机。
如果您仔细考虑,这实际上是选项1的更整洁的实现。
优点:比备选方案1更具可读性
缺点:假设子状态应该共享一些常见的登录,仍然需要复制粘贴。
在您的示例中,您的代理或系统将成为上述状态机的容器,并依次处理它们。生产/测试机器将向共享内存写入某种状态,由另一台机器从中读取,并相应地将其状态逻辑分支。
优点:可以在不同的状态之间共享代码。
缺点:可以在不同的州之间共享代码..。好的,序列化,非常重要的是要理解共享代码并不总是一个好主意(但这是另一个复杂的讨论。只需确保正确地计算共享代码的数量和唯一的代码或路径的数量,这样就不会有一个实质上包含两个完全独立的代码路径的大型类。
发布于 2017-07-28 14:01:27
您的状态机“爆炸”的感觉在传统的“平面”FSM中非常典型(事实上,它通常被称为“状态转换爆炸”现象)。解决方法是使用分层状态机 (HSM),它专门对抗传统有限状态机的“爆炸”。基本上,HSM允许您将具有类似行为的状态分组在一起(在更高级别的超级状态内),从而重用相关状态之间的常见行为。这是一个非常强大的概念,导致更优雅和一致的设计。要了解有关分层状态机的更多信息,可以阅读文章“分层状态机简介”。
发布于 2017-07-09 22:09:16
状态机可以与另一个状态机共享信号。因此,指示prod或dev的状态机可以向另一台发送信号。
实际上,如果状态机上只有两个状态,则可以为此使用一个变量。因此,您将有一个状态机,它将根据变量的值执行不同的工作。
https://stackoverflow.com/questions/45001448
复制相似问题