我正在大学的软件质量保证课程中学习Cyclomatic Complexity,当你在谓词语句或节点中有复合条件时,我很难理解它是如何工作的。我已经看到了Cyclomatic Complexity的多个定义,其主要用于我的班级
V(G) = # of predicate nodes (with outdegree = 2) + 1
因此,对于像这样的程序图,我们的圈复数为2:
V(G) = 2
我也看到了Cyclomatic复杂性的定义为
V(G) = # edges - # nodes + 2
这也适用于上面给出的图表。但是,我们有谓词节点的复合条件。我们认为语言和系统设置为自动短路,在我看来左下方的图表必须扩展到图表。 如果是这种情况,如下所示,Cyclomatic复杂度是否变为3,即使在实际源代码中,我们可能只有一个if语句或者它仍然是V(G)= 2? 。
这很令人困惑,因为我看到的Cyclomatic复杂性的大多数定义都在讨论谓词节点,而且我理解谓词它们可能包含多个短路条件。如果不是这种情况,似乎短路行为在提高性能的同时,实际上会在考虑时提高Cyclomatic的复杂性。 如果给出了源代码,在我们计算出圈复杂度之前,是否必须将所有条件分解到自己的节点(例如左边的图形)?
答案 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))