【问题标题】:cyclomatic complexity: Need help in optimizing java code圈复杂度:在优化 Java 代码方面需要帮助
【发布时间】:2021-03-16 05:50:11
【问题描述】:

在优化此 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;
          }
        }
      }
    }
  }

【问题讨论】:

  • 你使用什么圈复杂度算法(例如 McCabe、Prater)?
  • 您是否需要降低其复杂性,还是您的 IDE 只是将其标记为复杂?我认为我会尝试做的第一个想法是将内部 for 循环提取到它自己的方法中。
  • 我的 IDE 中的声纳将其标记为复杂。可以通过为 for 循环创建 2 个小方法来解决此问题。

标签: java cyclomatic-complexity


【解决方案1】:

有几种重构方法可以降低代码的圈复杂度。不管使用哪种估计方法,关键思想是通过代码减少线性独立路径的数量。

一般情况下是可以实现的:

  • 通过使用提前返回:在条件允许时退出方法,而不是等待单个退出点。
  • 避免不需要的else 语句。
  • 避免嵌套循环。在某些情况下,您可以创建一个新方法来实现所需的功能。
  • 一般使用较小的方法。这不仅降低了代码的圈复杂度,而且使您的代码更容易测试。

在你的特殊情况下,我建议你:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多