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

问题描述 投票:0回答:2

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

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

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

  bool opened; 
  bool closed;

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

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

要么

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

bool opened;

示例:状态“已打开”将只有一个布尔值 - >打开= 1,并且在“关闭”状态下,它将具有布尔值打开= 0;

这里的最佳做法是什么?使用两个布尔值超过一个布尔值的任何优点?我可以想象在这种情况下,每次状态转换到另一个状态时,必须定义太多变量并重置。

先感谢您

boolean state-machine
2个回答
0
投票

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

根据语言的不同,您可能会引入一个别名,以便您能够以不同的名称引用相同的状态,纯粹出于审美目的,编译器将删除冗余。但同样,它可能比真正有用的东西更令人讨厌。

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


0
投票

我想你可以考虑不使用boolean来表示对象状态。大多数对象将有两个以上的状态,如果你使用布尔标志,你最终会退出很多。这使得测试和验证代码始终按预期工作非常困难。我和一个在一个类中有22个布尔标志的人一起工作。这意味着该班级有超过400万个可能的州。

我通常使用枚举来表示类状态。阀门可以打开或关闭,但如果它变得有缺陷并且无法操作呢?我可以轻松地向枚举中添加更多状态,将状态数增加1,但如果我使用布尔值,则在添加更多标志时,将以指数方式增加可能状态的数量。

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

© www.soinside.com 2019 - 2024. All rights reserved.