gpt4 book ai didi

java - 圈复杂度、连接条件和可读性

转载 作者:行者123 更新时间:2023-12-03 05:58:15 24 4
gpt4 key购买 nike

考虑以下方法(在 Java 中 - 请忽略内容):

public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null) {
return false;
}
if (getClass() != object.getClass()) {
return false;
}
if (hashCode() != object.hashCode()) {
return false;
}
return true;
}

我有一些插件可以计算:eV(g)=5V(g)=5 - 也就是说,它计算基本和通用 CC。

现在,我们可以将上面的方法写成:

public boolean equals2(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
return hashCode() == object.hashCode();
}

这个插件计算 eV(g)=3V(g)=3 .

但是我怎么理解CC呢,值应该是一样的! CC 不是计算代码行数,而是计算独立路径。因此,加入两个 if一行并不能真正减少 CC。事实上,它只会降低内容的可读性。

我说得对吗?

编辑

忘记分享这个用于快速计算 CC 的方便小表:从初始(默认)值一 (1) 开始。为以下每一项出现的情况添加一 (1):

  • if声明
  • while声明
  • for声明
  • case声明
  • catch声明
  • &&|| boolean 运算
  • ?:三元运算符和?:埃尔维斯运算符(operator)。
  • ?.空检查运算符

编辑2

我证明我的插件不能正常工作,因为当我将所有内容内联在一行中时:

public boolean equals(Object object) {
return this == object || object != null && getClass() == object.getClass() && hashCode() == object.hashCode();
}

它返回 CC == 1,这显然是错误的。无论如何,问题依然存在:CC 是否减少了

[A] 5 -> 4,或

[B] 4 -> 3

最佳答案

长话短说...

你的方法是计算 CC 的好方法,你只需要决定你真正想用它做什么,并根据需要进行相应的修改。

对于第二个示例,CC=3 和 CC=5 似乎都不错。

说来话长...

计算 CC 的方法有很多种。您需要决定您的目的是什么,并且您需要知道您的分析的局限性。

McCabe 的原始定义实际上是控制流图的圈复杂度(来自图论)。要计算该值,您需要一个控制流程图,这可能需要比当前的分析更精确的分析。

静态分析器希望快速计算指标,因此它们不分析控制流,但它们计算接近控制流的复杂性指标。因此,有几种方法......

例如,您可以阅读有关 SonarQube 的 CC 指标的讨论 here或 SourceMeter 如何计算 McCC here 的另一个示例.

常见的是,这些工具对条件语句进行计数,就像您一样。但是,这些指标并不总是等于独立执行路径的数量……至少,它们给出了很好的估计。

计算 CC 的两种不同方法(McCabe 和 Myers 的扩展):

V_l(g) = number of decision nodes + 1
V_2(g) = number of simple_predicates in decision nodes + 1

如果您的目标是估计测试用例的数量,那么 V2 就是适合您的选择。但是,如果您想要衡量代码理解程度(例如,您想要识别难以维护并应在代码中简化的方法),V1 更容易计算并且对您来说足够了。

此外,静态分析器还测量许多额外的复杂性指标(例如嵌套级别)。

关于java - 圈复杂度、连接条件和可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852354/

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