我在下面的代码中有很多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");
}
}
注意:根据条件错误代码会有所不同
答案 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");
无论CONDITION5
,CONDITION6
,CONDITION7
(感谢Peter Lawrey提示)