如何改进逻辑以检查 4 个布尔值是否匹配某些情况

新手上路,请多包涵

我有四个 bool 值:

 bool bValue1;
bool bValue2;
bool bValue3;
bool bValue4;

可接受的值为:

          Scenario 1 | Scenario 2 | Scenario 3
bValue1: true       | true       | true
bValue2: true       | true       | false
bValue3: true       | true       | false
bValue4: true       | false      | false

因此,例如,这种情况是不可接受的:

 bValue1: false
bValue2: true
bValue3: true
bValue4: true

目前我想出了这个 if 语句来检测不良情况:

 if(((bValue4 && (!bValue3 || !bValue2 || !bValue1)) ||
   ((bValue3 && (!bValue2 || !bValue1)) ||
   (bValue2 && !bValue1) ||
   (!bValue1 && !bValue2 && !bValue3 && !bValue4))
{
    // There is some error
}

可以改进/简化该语句逻辑吗?

原文由 Andrew Truckle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 384
2 个回答

我的目标是可读性:你只有 3 个场景,用 3 个单独的 if 处理它们:

 bool valid = false;
if (bValue1 && bValue2 && bValue3 && bValue4)
    valid = true; //scenario 1
else if (bValue1 && bValue2 && bValue3 && !bValue4)
    valid = true; //scenario 2
else if (bValue1 && !bValue2 && !bValue3 && !bValue4)
    valid = true; //scenario 3

恕我直言,易于阅读和调试。此外,您可以分配一个变量 whichScenario 同时继续 if

只有 3 个场景,我不会选择“如果前 3 个值是真的,我可以避免检查第四个值”这样的东西:它会让你的代码更难阅读和维护。

不是一个优雅的解决方案也许当然,但在这种情况下是可以的:简单易读。

如果您的逻辑变得更复杂,请丢弃该代码并考虑使用更多内容来存储不同的可用场景(正如 Zladeck 所建议的那样)。

我真的很喜欢 这个答案 中给出的第一个建议:易于阅读,不易出错,可维护

(几乎)题外话:

我不会在 StackOverflow 上写很多答案。非常有趣的是,上述接受的答案是迄今为止我历史上最受赞赏的答案(在我认为之前从未有超过 5-10 次投票),而实际上并不是我通常认为的“正确”方法。

但简单往往是“正确的做法”,很多人似乎都这么认为,我应该比我想得更多:)

原文由 Gian Paolo 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据 mch 的建议,您可以这样做:

 if(!((bValue1 && bValue2 && bValue3) ||
  (bValue1 && !bValue2 && !bValue3 && !bValue4))
)

其中第一行涵盖了前两个好的案例,第二行涵盖了最后一个。

现场演示,我在那里玩过,它通过了你的案例。

原文由 gsamaras 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题