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

时间:2013-03-06 06:57:07

标签: unit-testing testing graph graph-theory cyclomatic-complexity

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

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

因此,对于像这样的程序图,我们的圈复数为2:

V(G) = 2

Program graph with cyclomatic complexity of two

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

V(G) = # edges - # nodes + 2

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

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

1 个答案:

答案 0 :(得分:2)

在C(C ++,Java,C#)中,“&&”运算符为复杂性增加了一个,因为它被定义为使用短路评估。在这种情况下,Cyclomatic Complexity将是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))