具有复合条件和短路的环形复杂性

Cor*_*oss 5 testing unit-testing graph-theory graph cyclomatic-complexity

我正在大学的软件质量保证课程中学习Cyclomatic Complexity,当你在谓词语句或节点中有复合条件时,我很难理解它是如何工作的.我已经看到了Cyclomatic Complexity的多个定义,其主要用于我的课堂

V(G) = # of predicate nodes (with outdegree = 2) + 1
Run Code Online (Sandbox Code Playgroud)

因此,对于像这样的程序图,我们将具有两个圈复数:

V(G) = 2
Run Code Online (Sandbox Code Playgroud)

程序图的圈复杂度为2

我也看到了Cyclomatic复杂性的定义

V(G) = # edges - # nodes + 2
Run Code Online (Sandbox Code Playgroud)

这也适用于上面给出的图表.但是,我们有谓词节点的复合条件.我们认为语言和系统设置为自动短路,在我看来左下方的图表必须扩展到图表.如果是这种情况,如下所示,Cyclomatic复杂度是否变为3,即使在真实的源代码中,我们可能只有一个if语句或者它仍然是V(G)= 2?.

这是令人困惑的,因为我看到的Cyclomatic复杂性的大多数定义都在讨论谓词节点,而且我理解谓词它们可能包含多个短路条件.如果不是这种情况,似乎短路行为在提高性能的同时,实际上会在考虑时提高Cyclomatic的复杂性.如果给出了源代码,那么在我们计算出圈复杂度之前,是否必须将所有条件分解到它们自己的节点中,例如左边的图形? 程序图扩展为显示短路行为

小智 2

在 C(C++、Java、C#)中,“&&”运算符使复杂性增加了 1,因为它被定义为使用短路求值。在这种情况下,圈复杂度将为 3。

请参阅http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htm

“布尔运算符要么会增加复杂性,要​​么不会增加任何复杂性,具体取决于它们是否具有可能导致有条件执行副作用的短路求值语义。”

图 4-4 具有带注释的源代码和相应的流程图,演示了如何确定复杂性。

另请参见IF((A>B) AND (C>D)) 和 IF((A>B) OR (C>D)) 的圈复杂度