Java 将其认知复杂性从59降低到允许的15

Java 将其认知复杂性从59降低到允许的15,java,Java,我正在研究代码逻辑。基于我在下面代码中所写的逻辑,我得到了声纳警告,以降低其复杂性。 我如何重构下面的代码,将其认知复杂性从59降低到允许的15 for (int i = 0; i < dataList.getTotalCount(); i++) { listObj = (TariffRateGroupDTO) dataList.get(i); if (listObj != null && listObj.getTxnMode().equals("

我正在研究代码逻辑。基于我在下面代码中所写的逻辑,我得到了声纳警告,以降低其复杂性。 我如何重构下面的代码,将其认知复杂性从59降低到允许的15

for (int i = 0; i < dataList.getTotalCount(); i++) {
    listObj = (TariffRateGroupDTO) dataList.get(i);
    if (listObj != null && listObj.getTxnMode().equals("U")) {
        if (listObj.getFlightCondition() == null || listObj.getFlightCondition().isEmpty()) {
            TariffRateGroupDTO fc = getFlightCondition(listObj.getId(), listObj);
            flightCondition = fc.getFlightCondition();
            if (flightCondition != null) {
                ArrayList obj = (ArrayList) checkFlightCondition(flightCondition);
                if (obj != null && !obj.isEmpty()) {
                    ValidationException ve = new ValidationException();
                    ValidationError valError = (ValidationError) obj.get(0);
                    ve.setErrorCode(valError.getMessage() + " at row [" + (i+1) +"]");
                    throw ve;
                }
            }
        }else {
            flightCondition = listObj.getFlightCondition();
            if (flightCondition != null) {
                ArrayList obj = (ArrayList) checkFlightCondition(flightCondition);
                if (obj != null && !obj.isEmpty()) {
                    ValidationException ve = new ValidationException();
                    ValidationError valError = (ValidationError) obj.get(0);
                    ve.setErrorCode(valError.getMessage());
                    throw ve;
                }
            }
        }
    }
}
for(int i=0;i
这部分代码实际上并不复杂,可能您的类中还有其他内容。你可以阅读有关认知复杂性及其重要性的文章

在这里,我为您提供了一些关于如何降低代码复杂性的想法(您也可以将它们用于代码的其他部分):

  • 将代码拆分为多个私有方法
  • 私有方法可在类似情况下重复使用(例如,
    if(flightCondition!=null)
    中的两个部分可替换为一个以
    ErrorCode
    为参数的方法)
  • obj!=空&!obj.isEmpty()
    可以用一些外部库重写(对于Apache Commons集合,可以这样做:
    CollectionUtils.isNotEmpty(obj)
  • if(flightCondition!=null)
    可能可以移动到
    checkFlightCondition()
    方法中(如果它符合业务逻辑)
  • 不太相关,但是像
    listObj.getTxnMode().equals(“U”)
    这样的条件通常可以翻转到
    “U.equals”(listObj.getTxnMode())
    ,这也将提供隐式的空值安全检查

另外,我没有在这段代码中提到任何其他问题(就像其他人在评论中所做的那样)因为它与问题无关。

至少对我们来说,通过正确格式化代码,您可以降低认知复杂性。将其拆分为多个较小的方法。代码中存在大量冗余。感觉逻辑没有经过仔细考虑,有人只是不断添加代码。此外:自Java 5.现在可能是开始使用它们的时候了。圈复杂度主要与嵌套决策的级别有关,因此请尝试减少分支。但这段代码的问题比这更严重。首先要消除对
ArrayList
和rawtypes的所有强制转换。返回集合的函数永远不需要返回
null
-改为返回空集合。侧注:未来,请尝试在编辑代码时以显示此类度量和其他提示的方式配置开发环境。对于大多数静态分析器,有许多IDE的插件(例如,用于eclipse的sonarlint扩展等)这样的话,在你达到59的复杂度之前,你会得到警告。