重构多个if-else

时间:2018-06-06 13:02:41

标签: java

我在下面的代码中有很多if else codition。由于这个if else代码看起来更复杂,而且声纳说"Refactor this method to reduce its Cognitive Complexity from 17 to the 15 allowed."

还有其他方法可以减少复杂性。

    if (CONDITION1) {
        validatorVO.setErrorCode("ERROR_CODE_1");
    } else if (CONDITION2) {
        validatorVO.setErrorCode("ERROR_CODE_2");
    } else if (CONDITION3) {
        validatorVO.setErrorCode("ERROR_CODE_3");
    } else if (CONDITION4) {
        if (CONDITION5) {
            validatorVO.setErrorCode("ERROR_CODE_4");
        } else if (CONDITION6) {
            validatorVO.setErrorCode("ERROR_CODE_5");
        } else if (CONDITION7) {
            validatorVO.setErrorCode("ERROR_CODE_6");
        } else {
            validatorVO.setErrorCode("ERROR_CODE_7");
        }
    } else if (CONDITION8) {
        validatorVO.setErrorCode("ERROR_CODE_8");
    } else if (CONDITION9) {
        validatorVO.setErrorCode("ERROR_CODE_9");
    } else if (CONDITION10) {
        validatorVO.setErrorCode("ERROR_CODE_10");
    } else if (CONDITION11) {
        validatorVO.setErrorCode("ERROR_CODE_11");
    }
}

注意:根据条件错误代码会有所不同

2 个答案:

答案 0 :(得分:7)

通过修改后的问题,一个选项是使用错误代码维护LinkedHashMap<Supplier<Boolean>, String>(以保留顺序)。请注意,订单很重要(如果您先放置CONDITION4,则永远不会检查组合条件。)

Map<Supplier<Boolean>, String> conditions = new LinkedHashMap<> ();
conditions.put(() -> CONDITION1, "ERROR_CODE_1");
conditions.put(() -> CONDITION2, "ERROR_CODE_2");
conditions.put(() -> CONDITION3, "ERROR_CODE_3");
conditions.put(() -> CONDITION4 && CONDITION5, "ERROR_CODE_4");
conditions.put(() -> CONDITION4 && CONDITION6, "ERROR_CODE_5");
conditions.put(() -> CONDITION4 && CONDITION7, "ERROR_CODE_6");
conditions.put(() -> CONDITION4, "ERROR_CODE_7");
conditions.put(() -> CONDITION8, "ERROR_CODE_8");
conditions.put(() -> CONDITION9, "ERROR_CODE_9");
conditions.put(() -> CONDITION10, "ERROR_CODE_10");
conditions.put(() -> CONDITION11, "ERROR_CODE_11");

然后迭代:

for (Entry<Supplier<Boolean>, String> e : conditions.entrySet()) {
  if (e.getKey().get()) {
    validatorVO.setErrorCode(e.getValue());
    break;
  }
}

OLD ANSWER

在不知道条件是什么的情况下,很难重构代码。

你可以写:

if (CONDITION1 || CONDITION2 || ... CONDITION11) validatorVO.setErrorCode("FAILED");

你可以把条件放在一个数组中:

boolean[] conditions = {CONDITION1, CONDITION2, ...}
for (boolean b : conditions) {
  if (b) validatorVO.setErrorCode("FAILED");
}

另请注意,您可以排除CONDITION5,CONDITION6和CONDITION7,因为它们在您的代码中被忽略(无论它们是否为真都没有区别)。

答案 1 :(得分:1)

如果结果相同,那么你可以这样做:

if (CONDITION1 || CONDITION2 ||CONDITION3
     || CONDITION4
     || CONDITION8 || CONDITION9 ||CONDITION10 || CONDITION11) {
        validatorVO.setErrorCode("FAILED");
}

实际上,您的CONDITION4始终评估

validatorVO.setErrorCode("FAILED");

无论CONDITION5CONDITION6CONDITION7(感谢Peter Lawrey提示)