Cyklomatická komplexita

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Cyklomatická komplexita, neboli podmínková složitost je metrika indikující složitost zdrojového kódu.

Video (4:45)

Jedná se o jednu z hlavním metrik, díky které lze posoudit jeho kvalitu.

Udává počet různých cest skrze zdrojový kód. K čemu je to dobré? Díky tomu lze blíže odpovědět na 3 otázky:

  1. Je kód dobře testovatelný?
  2. Je kód snadno čitelný?
  3. Je kód dostatečně spolehlivý?

Pomáhá nám to také určit počet testů, které bychom měli na kódu provádět.

Jak se počítá?

Dle vzorce:

M = E – N + 2P

M = cyklomatická komplexita
E = hran v grafu
N = uzlů v grafu
P = připojených komponent - ukončení

Grafem se myslí CFG (control flow graph). Ten může vypadat následovně:

Zjednodušené lze ale říct, že:

cyklomatická komplexita = počet rozhodnutí + 1

Jako rozhodnutí lze považovat:

?
&&
||
or
and
xor
case
catch
elseif
for
foreach
if
while

Příklady

Příklad 1

function index() {
}

Cyklomatická komplexita je: 1, a to z důvodu, že existuje jediná cesta, kterou lze kódem projít. Žádný rozhodovací faktor zde není.

Příklad 2

function index($a, $b) {
    if ($a == $b) {
        $value = 1;
    } else {
        $value = 2;
    }

    return $value;
}

Cyklomatická komplexita je: 2, a to z důvodu, že existují 2 cesty, kterými lze kódem projít. Je zde 1 rozhodovací faktor.

Příklad 3

function index($a, $b) {
    if ($a == $b && $a > 1) {
        $value = 1;
    } else {
        $value = 2;
    }

    return $value;
}

Cyklomatická komplexita je: 3, a to z důvodu, že existují 3 cesty, kterými lze kódem projít. Jsou zde 2 rozhodovací faktory.

Příklad 4

function index($a, $b) {
    $value = 1;

    for ($i=$a;$i<$b;$i++) {
        $value++;
    }

    return $value;
}

Cyklomatická komplexita je: 2, a to z důvodu, že je zde 1 rozhodovací faktor. Napříč grafem jsou dvě cesty, kterými lze projít a to je možno vidět na grafu zobrazeném výše, který reprezentuje právě tuto funkci.

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře