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

时间:2019-04-17 07:17:02

标签: boolean state-machine

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

假设我有一个“阀”,它可以处于“打开”或“关闭”状态。现在,当我为状态机建模时。

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

  bool opened; 
  bool closed;

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

示例:状态“打开”将具有布尔值->打开= 1,关闭= 0;

OR

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

bool opened;

示例:状态“ opened”将只有一个布尔值-> opened = 1,在状态为“ closed”时,它将具有布尔值open = 0;

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

提前谢谢

2 个答案:

答案 0 :(得分:0)

如果两个状态是互斥的,则没有必要保留一个冗余状态变量。一个布尔值已经为您提供了两种可能的状态。

根据语言的不同,您可能可以引入别名,这样就可以出于不同的目的使用不同的名称引用相同的状态,这纯粹是出于美观目的,并且编译器将删除冗余。但同样,它可能比真正有用的东西更令人讨厌。

当您需要处理独立状态或想要描述子状态时,您希望拥有其他状态变量。

答案 1 :(得分:0)

我认为您可以考虑根本不使用布尔值来表示对象状态。大多数对象将具有两个以上的状态,如果您使用布尔型标志,则会以qute结束很多状态。这会使测试和验证代码始终按预期工作非常困难。我和一个班上有22个布尔型标志的人一起工作。这意味着该类具有超过400万个可能的状态。

我通常使用一个枚举来表示类状态。阀门可以打开或关闭,但是如果出现故障并且无法操作怎么办?我可以轻松地向枚举中添加更多状态,从而将状态数增加1,但是如果我使用布尔值,那么在添加更多标志时我将成倍增加可能状态的数。

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