Czym jest złożoność cyklomatyczna?

Opublikowano: 08.02.2024 - tagi: Kod Jakość Metryka Refaktoring

Czytelny kod

Kod częściej się czyta, niż pisze. Więc logiczne jest to, że warto skupić się na pisaniu kodu, który jest łatwo zrozumiały dla programisty.

Na czytelność kodu składa się kilka czynników, jak na przykład: odpowiednie nazewnictwo, liczba linijek kodu itp.

Innym ważnym czynnikiem jest złożoność kodu. Im bardziej kod jest złożony, tym trudniej się go czyta.

Jedną z metryk, która pozwala na zmierzenie złożoności kodu, jest: złożoność cyklomatyczna.

Złożoność cyklomatyczna

Informuje ona o liczbie ścieżek prowadzących w kodzie. Mierzy się ja w funkcji/metodzie.

Dzięki tej informacji wiesz nie tylko, jak bardzo złożona jest funkcja/metoda, ale także o minimalnej ilości testów potrzebnych do napisania, aby w pełni pokryć kod testami.

Minimalna wartość złożoności cyklomatycznej wynosi: 1.

Ile to za dużo?

Do jakiej wartości złożoności cyklomatycznej powinniśmy dążyć? Nie ma na to jasnej odpowiedzi, ale im mniejsza wartość, tym lepiej.

Autor książki: Zrównoważony kod. Dobre praktyki i heurystyki dla inżynierów oprogramowaniaMark Seemann proponuje, żeby maksymalna wartość wynosiła 7. Dlaczego akurat 7? Argumentuje to tym, że mózg człowieka dysponuje pamięcią krótko terminową. Jest ona ograniczona. Kiedy programista natrafia w metodzie na wiele instrukcji warunkowych lub/i pętli stara się "ogarnąć", jak działa ten kod. Im bardziej jest on złożony, tym trudniej go zrozumieć. Dlatego warto ograniczyć złożoność cyklomatyczną do stałej wartości i się tego konsekwentnie trzymać.

Jeśli złożoność cyklomatyczna wynosi więcej niż ustalona wartość powinieneś zrefaktorować kod, w wyniku czego ta wartość się zmniejszy.

Jak to policzyć?

Złożoność cyklomatyczną liczy się w prosty sposób: zaczynasz od wartości 1, licznik zwiększasz za każdym, gdy napotkasz w kodzie: instrukcje warunkowe i pętle.

Sam proces liczenia złożoności cyklomatycznej warto zautomatyzować, instalując na przykład jakąś bibliotekę do statycznej analizy kodu.

Przykłady

Przykład 1

function doSomething() {
	console.log('Hello World!');
}

Złożoność cyklomatyczna wynosi: 1.

Przykład 2

function checkSomething(a) {
	if (a > 5) {
		return true;
	}
	return false;
}

Złożoność cyklomatyczna wynosi: 2.

Przykład 3

function iterate(max) {
	let counter = 1;
	while (counter <= max) {
		console.log(`counter: ${counter}`);
		counter++;
	}
}

Złożoność cyklomatyczna wynosi: 2.

Przykład 4

function getColorInHex(color) {
	switch(color) {
		case 'red':
		return '#ff0000';
		
		case 'green':
		return '#00ff00';
		
		case 'blue':
		return '#0000ff';
		
		default:
		return 'not found';
	}
}

Złożoność cyklomatyczna wynosi: 5.

W przypadku instrukcji switch liczymy wszystkie case i default co daje nam: 1 + 4 = 5.

Przykład 5

function sayHello(name) {
	let userName = name ?? 'stranger';
	console.log(`Hello ${userName}!`);
}

Złożoność cyklomatyczna wynosi: 2.