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

圈复杂度:需要帮助优化java代码吗,java,cyclomatic-complexity,Java,Cyclomatic Complexity,需要帮助优化这个java代码。圈复杂度是20,需要15 private static void replaceNodeProperties(HashMap configNodeProperties, JSONArray esdNodepropertiesList) { HashMap replaceConfigNodePropRules = (HashMap) configNodeProperties.get("replace"); if (replac

需要帮助优化这个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;
          }
        }
      }
    }
  }
私有静态void replaceNodeProperties(HashMap configNodeProperties,JSONArray EsdNodeProperties列表)
{
HashMap ReplaceConfigNodeProperties=(HashMap)configNodeProperties.get(“替换”);
if(replaceConfigNodeProRules!=null){
对于(对象replaceConfigNodeProp:replaceConfigNodeProRules.keySet()){
对于(int j=0;j
有几种重构方法可以降低代码的圈复杂度。无论使用何种估计方法,关键思想是减少通过代码的线性独立路径的数量

一般来说,您可以通过以下方式实现:

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

  • replaceConfigNodeProRules==null
    时提前退出
  • 尝试创建较小的方法来处理嵌套的configNode对象,而不是使用循环

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

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