问题描述
需要帮助优化此 java 代码。圈复杂度为 20 需要为 15。
private static void replaceNodeProperties(HashMap configNodeProperties,JSONArray esdNodepropertiesList)
{
HashMap replaceConfigNodePropRules = (HashMap) configNodeProperties.get("replace");
if (replaceConfigNodePropRules != null) {
for (Object replaceConfigNodeProp : replaceConfigNodePropRules.keySet()) {
for (int j = 0; j < esdNodepropertiesList.size(); j++) {
JSONObject esdNodePropObj = (JSONObject) esdNodepropertiesList.get(j);
if (esdNodePropObj.get("name").toString().contains("::")) {
esdNodePropObj.put("name",esdNodePropObj.get("name").toString().split("::")[1]);
}
if (esdNodePropObj.get("name").equals(replaceConfigNodeProp)) {
if (replaceConfigNodeProp.equals("resourceType")) {
esdNodepropertiesList.remove(j);
ArrayList replaceNodePropList = (ArrayList) replaceConfigNodePropRules.get(replaceConfigNodeProp);
esdNodepropertiesList.addAll(replaceNodePropList);
} else if (replaceConfigNodeProp.equals("comments"))
esdNodePropObj.put("name",replaceConfigNodePropRules.get(replaceConfigNodeProp));
break;
}
}
}
}
}
解决方法
有几种重构方法可以降低代码的圈复杂度。无论使用何种估计方法,关键思想是减少通过代码的线性独立路径的数量。
一般来说,可以实现:
- 通过使用提前返回:当条件允许时退出方法而不是等待单个退出点。
- 避免不需要的
else
语句。 - 避免嵌套循环。在某些情况下,您可以创建一个新方法来实现所需的功能。
- 一般使用较小的方法。这不仅降低了代码的圈复杂度,而且让测试代码变得更加容易。
在您的特定情况下,我建议您:
- 在
replaceConfigNodePropRules == null
时提前退出。 - 尝试创建更小的方法来处理嵌套的 configNode 对象,而不是使用循环。
最后,请记住,这并不总是可以降低复杂性。以下是一些自然会有点复杂的函数 - 验证用户输入或解析是示例。