状态机 - 为不同状态定义布尔值的最佳方法是什么?

State Machine - What is the best way to define boolean for different states?

有以下问题困扰我一段时间。我是状态机建模的新手,非常感谢您的帮助、想法和建议。

假设我有一个 "Valve",它可以处于 "opened" 或 "closed" 状态。现在,当我为状态机建模时。

我应该为每个状态定义两个布尔值吗?

  bool opened; 
  bool closed;

因此,我应该为每个状态都使用两个布尔值吗?

示例:状态 "opened" 将有布尔值--> opened = 1 and closed = 0;

我可以只定义一个布尔变量吗?

bool opened;

示例:状态 "opened" 将只有一个布尔值-->opened = 1,而在状态 "closed" 中它将有布尔值 opened = 0;

此处的最佳做法是什么?使用两个布尔值比使用一个布尔值有什么优势?我可以想象在这种情况下,每次状态转换到另一个状态时都必须定义和重置太多变量。

提前致谢

如果这两个状态相互排斥,那么拥有一个您需要维护的冗余状态变量是没有意义的。一个布尔值已经为您提供了两种可能的状态。

根据语言的不同,您也许可以引入一个别名,这样您就可以使用不同的名称来引用相同的状态,这纯粹是为了美观,编译器会删除冗余。但同样,它可能比真正有用的东西更令人讨厌。

当你需要处理独立状态或者当你想要描述子状态时,你想要有额外的状态变量。

我认为您可以考虑完全不使用布尔值来表示对象状态。大多数对象都会有两个以上的状态,如果你使用布尔标志,你最终会得到很多状态。这会使测试和验证代码是否始终按预期工作变得非常困难。我曾与一个 class 中有 22 个布尔标志的人一起工作。这意味着 class 有超过 400 万种可能的状态。

我通常使用枚举来表示 class 状态。阀门可以打开或关闭,但如果它出现故障并且无法操作怎么办?我可以轻松地向枚举添加更多状态,将状态数增加 1,但如果我使用布尔值,我将在添加更多标志时以指数方式增加可能状态的数量。

我还建议使用状态机库,而不是在您自己的代码中手动处理状态。有许多可用的状态机库,我在 Github 上使用(并贡献)stateless 状态机库。