圈复杂度:需要帮助优化 Java 代码

问题描述

需要帮助优化此 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 语句。
  • 避免嵌套循环。在某些情况下,您可以创建一个新方法来实现所需的功能。
  • 一般使用较小的方法。这不仅降低了代码的圈复杂度,而且让测试代码变得更加容易。

在您的特定情况下,我建议您:

  1. replaceConfigNodePropRules == null 时提前退出。
  2. 尝试创建更小的方法来处理嵌套的 configNode 对象,而不是使用循环。

最后,请记住,这并不总是可以降低复杂性。以下是一些自然会有点复杂的函数 - 验证用户输入或解析是示例。