5

Studiuję złożoność cykliczności w moim kursie Software Assurance jakości na Uniwersytecie i ciężko jest mi zrozumieć, jak to działa, gdy masz złożone warunki w oświadczeniu lub węźle predykatu. Widziałem wiele definicji Złożoność cykliczna, którego podstawowym Wykorzystałem w mojej klasie jestZłożoność cykliczna z warunkami złożonymi i zwarciem

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

Tak na wykresie programu takiego jak ten mielibyśmy cyclomatic złożoność dwa:

V(G) = 2 

Program graph with cyclomatic complexity of two

widziałem też definicje złożoności danej cyclomatic jak

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

Który działa również dla powyższego wykresu. Jednakże mamy warunki złożone dla węzłów predykatów. Rozważamy język i system skonfigurowany do automatycznego zwarcia, wydaje mi się, że wykres na dole po lewej stronie musiałby zostać rozszerzony do wykresu. W takim przypadku, jak poniżej, złożoność cykliczna staje się 3, nawet jeśli w prawdziwym kodzie źródłowym, możemy mieć tylko jedno wyrażenie if lub czy nadal jest V (G) = 2?.

Jest to mylące, ponieważ większość definicji złożoności cyklicznej mówi o węzłach predykatów, a ponieważ rozumiem predykaty, mogą one zawierać wiele warunków zwarciowych. Jeśli tak nie jest, wydaje się, że zachowanie zwarciowe, przy jednoczesnym zwiększeniu wydajności, w rzeczywistości bierze pod uwagę złożoność cykliczną. Jeśli podano kod źródłowy, czy wszystkie warunki muszą zostać podzielone na własne węzły, takie jak wykres po lewej, zanim będziemy mogli obliczyć złożoność cykliczności? Program graph expanded to show short circuiting behavior

Odpowiedz

2

W języku C (C++, Java, C#) operator "& &" dodaje jeden do złożoności, ponieważ jest zdefiniowana używać ocenę zwarciem. Złożoność cykliczna w tym przypadku byłoby 3.

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

„operatory logiczne dodać jeden lub nic do złożoności, w zależności od tego, czy mają one semantykę oceny zwarcia, które może prowadzić do warunkowego wykonywania efektów ubocznych . "

Rysunek 4-4 zawiera opatrzony adnotacjami kod źródłowy i odpowiadający mu wykres przepływu, który pokazuje stopień złożoności.

Zobacz także Cyclomatic complexity of IF((A>B) AND (C>D)) and IF((A>B) OR (C>D))