5

我在大学的软件质量保证课程中学习了Cyclomatic复杂性,我很难理解在谓词语句或节点中有复合条件时它是如何工作的。我所看到的圈复杂度,主这在我的课堂上使用我的多个定义是使用复合条件和短路循环复杂性

V(G) = # of predicate nodes (with outdegree = 2) + 1 

所以对于一个方案图,如这一点,我们将有两个圈复杂度:

V(G) = 2 

Program graph with cyclomatic complexity of two

我还见过给出

V(G) = # edges - # nodes + 2 
0123圈复杂度的定义

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

这很令人困惑,因为我看到的Cyclomatic复杂性的大多数定义都在讨论谓词节点,并且据我了解谓词,它们可能包含多个短路条件。如果不是这样,似乎短路行为在提高性能的同时,在考虑时实际上会提高环复杂性。 如果给出了源代码,那么在计算圈复杂度之前,是否必须将所有条件分解为它们自己的节点,例如左边的图形? Program graph expanded to show short circuiting behavior

回答

2

在C(C++,Java和C#),因为它定义为使用短路评价 “& &” 操作符加一的复杂性。在这种情况下,圈复杂度将是3

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

“布尔运算符一方或没有增加的复杂性,这取决于他们是否有短路计算语义,可能导致副作用的条件执行“。

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

另请参阅Cyclomatic complexity of IF((A>B) AND (C>D)) and IF((A>B) OR (C>D))