如何使用许多参数评估布尔表达式?

时间:2019-06-15 15:01:41

标签: java

我正在尝试为我的代码设置条件检查。但是,代码变得冗长而复杂。我需要一个可以轻松完成工作的简单版本的代码。

我试图比较用括号分隔的三个布尔值,这样我只比较两个值。

if (
    (((userState[0][0]&&userState[0][1])&&(userState[0][2]))) || 
    (((userState[1][0]&&userState[1][1])&&(userState[1][2]))) ||
    (((userState[2][0]&&userState[2][1])&&(userState[2][2]))) ||
    (((userState[0][0]&&userState[1][0])&&(userState[2][0]))) ||
    (((userState[0][1]&&userState[2][1])&&(userState[1][1]))) ||
    (((userState[0][2]&&userState[2][2])&&(userState[1][2]))) ||
    (((userState[0][0]&&userState[2][2])&&(userState[1][1]))) ||
    (((userState[1][2]&&userState[1][1])&&(userState[2][0])))
)

2 个答案:

答案 0 :(得分:3)

您可以使用嵌套循环:

boolean result;
for (int i = 0; i < userState.length; i++) {
 for (int j = 0; j < userState[i].length; j++) {
  result |= userStage[i][j];
 }
}

答案 1 :(得分:1)

干净的代码建议不要一开始就编写此类代码。

如果有的话,例如,您可以为每行创建小的辅助方法,例如:

private hasStateConditionXyz(boolean[][] userState) {
  return userState[0][0]&&userState[0][1])&&(userState[0][2];
} 

其中“ Xyz”将是一个漂亮的好名字,它告诉读者该支票的意图是什么。

当然,这破坏了您对数组进行循环的能力。

换句话说:

  • 如果可能的话,请查看是否有可能通过遍历该数组来计算结果,而不是写下此类手动“模式”
  • 如果没有,请考虑使用此类命名的辅助方法

最后,真正的答案可能是退后一步,着眼于要解决的整体问题。含义:当您拥有如此复杂的“状态机”时,最好创建一个状态机。或使用某种“工作流程”引擎。这样的工具使您能够以更加简洁和易读的方式表达这种复杂的(业务?)规则。