Złożoność cyklomatyczna (ang. cyclomatic complexity), inaczej „liczba McCabe'a”, to metryka oprogramowania opracowana przez Thomasa J. McCabe'a w 1976 i używana do pomiaru stopnia skomplikowania programu.
Podstawą do wyliczeń jest liczba dróg w schemacie blokowym danego programu, co oznacza wprost liczbę punktów decyzyjnych w tym programie. Opisuje to artykuł McCabe’a z zasobów IEEE.
Wzór na obliczanie złożoności to:
v(G) = E – N + 2P
Gdzie:
- E to liczna krawędzi/połączeń w grafie,
- N to liczba węzłów grafu,
- P to liczba rozłącznych części grafu (np. wywoływany graf lub podprocedura).
Dla grafów reprezentujących proste programy lub metody P =1.
Przykład:
Przykładowa funkcja, w której punkt wyjścia jest połączony z powrotem do punktu wejścia. Ten wykres ma 9 krawędzi, 8 węzłów i 1 połączony komponent, co również daje złożoność cyklomatyczną przy użyciu alternatywnego sformułowania (9 - 8 + 2*1 = 3):
Korzyści:
Zakłada się, że czym mniejsza złożoność cyklomatyczna, tym lepszy kod. Do największych zalet takiego podejścia należą:
- zmniejszenie sprzęgania (ang. coupling) kodu. Im wyższa liczba cyklomatycznej złożoności, tym bardziej powiązany jest kod. Kod wysoce sprzężony jest trudny do zmiany,
- łatwość zrozumienia kodu wzrasta wraz ze spadkiem złożoności. Przy wyższej wartości złożoności programista musi radzić sobie z większą liczbą ścieżek w kodzie, co często może prowadzić do błędów,
- łatwość testowania. Jeśli metoda ma złożoność cyklomatyczną 10, oznacza to, że istnieje 10 niezależnych ścieżek w tejże metodzie. Oznacza to również, że do przetestowania wszystkich (różnych) ścieżek w kodzie potrzeba co najmniej 10 przypadków testowych. Im mniejsza liczba, tym łatwiej jest przetestować kod.
Wartości złożoności cyklomatycznej v(G) interpretowane są w następujący sposób:
- od 1 do 10 – kod dość prosty, stwarzający nieznaczne ryzyko,
- od 11 do 20 – kod złożony, powodujący ryzyko na średnim poziomie,
- od 21 do 50 – kod bardzo złożony, związany z wysokim ryzykiem,
- powyżej 50 – kod niestabilny, grożący bardzo wysokim poziomem ryzyka.
Część badań pokazuje korelację między złożonością cyklomatyczną a częstością występowania defektów w funkcji lub metodzie. Największa złożoność zwykle skutkuje największą liczbą defektów. Również korelacja między złożonością cyklomatyczną a rozmiarem programu (zazwyczaj mierzona w wierszach kodu) została praktycznie udowodniona. Międzynarodowe normy bezpieczeństwa, takie jak ISO 26262, wymuszają niską złożoność kodu.