gpt4 book ai didi

PMD - 三元运算符的 NPath 复杂性非常高(?

转载 作者:行者123 更新时间:2023-12-03 21:48:54 25 4
gpt4 key购买 nike

我正在使用 PMD 生成一些关于项目的代码质量报告。
我不明白 NPath 复杂性检查的结果。
我创建了一个展示结果的枯燥类(这不是真正的类,但它使用相同的模式):

import java.util.*;

public class SOFExample {

private final Map<String, Date> magicMap = new HashMap<String, Date>();
protected static final long UNKNWOWN = 0L;
private static final class MyCal { long aTime; long bTime; long cTime; long dTime;}

public void usefullMethod(final List<MyCal> myCals) {

final Date a = magicMap.get("a");
final Date b = magicMap.get("b");
final Date c = magicMap.get("c");
final Date d = magicMap.get("d");

final long aTime = a == null ? UNKNWOWN : a.getTime();
final long bTime = b == null ? UNKNWOWN : b.getTime();
final long cTime = c == null ? UNKNWOWN : c.getTime();
final long dTime = d == null ? UNKNWOWN : d.getTime();

for (MyCal myCal : myCals) {
if(myCal.aTime == UNKNWOWN) myCal.aTime = aTime;
if(myCal.bTime == UNKNWOWN) myCal.bTime = bTime;
if(myCal.cTime == UNKNWOWN) myCal.cTime = cTime;
if(myCal.dTime == UNKNWOWN) myCal.dTime = dTime;
}
}
}

PMD结果:

The method usefullMethod() has an NPath complexity of 10625



如果我添加一个以相同方式初始化的新变量,我会得到:

The method usefullMethod() has an NPath complexity of 103125



如果我全部更换?使用 if-else 结构,然后我得到了这个:

The method usefullMethod() has an NPath complexity of 1056



为什么我用三元“?”得到了这么高的结果运算符(operator)?

这段代码有什么问题? (在此演示代码中很容易提取获取默认值的方法,但在实际代码中可能无法实现)

最佳答案

使示例更简单,该类的 nPath 值为 2。很明显为什么它是 2 - 代码中显然有两条执行路径。

package test;

import java.util.*;

public class Test {

private static final long UNKNWOWN = -1;

public void method(Date a) {
long aTime;

if (a == null) {
aTime = UNKNWOWN;
} else {
aTime = a.getTime();
}
}
}

这个类的 nPath 值为 5。问题是为什么 - 仍然有两个逻辑路径通过代码。
package test;

import java.util.*;

public class Test {

private static final long UNKNWOWN = -1;

public void method(Date a) {
final long aTime = a == null ? UNKNWOWN : a.getTime();
}
}

然而, algorithm使用如下:
int npath = complexitySumOf(node, 0, data);     
npath += 2;

它增加了所有 child 的复杂性,然后为三元增加了两个。简单 java 节点返回的最小复杂度为 1。 AbstractSyntaxTree 显示有三个子节点。因此 3 + 2 是 5。
<ConditionalExpression beginColumn="36" beginLine="11" endColumn="69" endLine="11" ternary="true">
<EqualityExpression beginColumn="36" beginLine="11" endColumn="44" endLine="11" image="==">
<PrimaryExpression beginColumn="36" beginLine="11" endColumn="36" endLine="11">
<PrimaryPrefix beginColumn="36" beginLine="11" endColumn="36" endLine="11">
<Name beginColumn="36" beginLine="11" endColumn="36" endLine="11" image="a"/>
</PrimaryPrefix>
</PrimaryExpression>
<PrimaryExpression beginColumn="41" beginLine="11" endColumn="44" endLine="11">
<PrimaryPrefix beginColumn="41" beginLine="11" endColumn="44" endLine="11">
<Literal beginColumn="41" beginLine="11" charLiteral="false" endColumn="44" endLine="11" floatLiteral="false" intLiteral="false" singleCharacterStringLiteral="false" stringLiteral="false">
<NullLiteral beginColumn="41" beginLine="11" endColumn="44" endLine="11"/>
</Literal>
</PrimaryPrefix>
</PrimaryExpression>
</EqualityExpression>
<Expression beginColumn="48" beginLine="11" endColumn="55" endLine="11">
<PrimaryExpression beginColumn="48" beginLine="11" endColumn="55" endLine="11">
<PrimaryPrefix beginColumn="48" beginLine="11" endColumn="55" endLine="11">
<Name beginColumn="48" beginLine="11" endColumn="55" endLine="11" image="UNKNWOWN"/>
</PrimaryPrefix>
</PrimaryExpression>
</Expression>
<PrimaryExpression beginColumn="59" beginLine="11" endColumn="69" endLine="11">
<PrimaryPrefix beginColumn="59" beginLine="11" endColumn="67" endLine="11">
<Name beginColumn="59" beginLine="11" endColumn="67" endLine="11" image="a.getTime"/>
</PrimaryPrefix>
<PrimarySuffix argumentCount="0" arguments="true" arrayDereference="false" beginColumn="68" beginLine="11" endColumn="69" endLine="11">
<Arguments argumentCount="0" beginColumn="68" beginLine="11" endColumn="69" endLine="11"/>
</PrimarySuffix>
</PrimaryExpression>
</ConditionalExpression>

如果您在三元运算符中有一个复杂的表达式,它计算的差异将更加普遍。至于代码有什么问题,它已经有 9 个分支(8 个三元运算符和一个循环),即使没有整个 nPath 计算也很高。无论如何,我都会重构它。

关于PMD - 三元运算符的 NPath 复杂性非常高(?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com