我正在大学的软件质量保证课程中学习圈复杂性,当您在谓词语句或节点中有复合条件时,我很难理解它是如何工作的。我见过多种圈复杂度的定义,我在课堂上使用的主要定义是
V(G) = # of predicate nodes (with outdegree = 2) + 1
因此,对于这样的程序图,我们的圈复杂度为 2:
V(G) = 2
我还看到了给出的圈复杂度的定义
V(G) = # edges - # nodes + 2
这也适用于上面给出的图表。但是,我们有谓词节点的复合条件。我们考虑为自动短路设置的语言和系统,在我看来,左下角的图表必须扩展到图表。如果是下面这样的情况,圈复杂度是否会变为 3,即使在真正的源代码中,我们可能只有一个 if 语句,还是仍然是 V(G) = 2?.
这很令人困惑,因为我看到的大多数圈复杂度的定义都在谈论谓词节点,而且据我所知,谓词可能包含多个短路条件。如果不是这种情况,那么短路行为似乎在提高性能的同时,在考虑时实际上会提高循环复杂度。如果给出源码,是不是所有的条件都要分解成自己的节点,比如左图,才能计算圈复杂度?