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))