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ý.
Jak jsem sliboval v minulém článku, tak dnes se rozepíšu více o tom, proč a jak kontroluji kvalitu kódu. Pozor na jednu věc, a to že kvalita kódu není to samé jako kvalita softwaru (jak si často programátoři myslí), ale je to pouze jedna z částí.
Kvalita softwaru je závislá především na její definici. Například norma ISO/IEC 9126:1991 (sic starší, avšak stále použitelná) udává šest charakteristik:
- Funkčnost
- Bezporuchovost
- Použitelnost
- Účinnost
- Udržovatelnost
- Přenostelnost
Kvalita kódu spadá především pod 5. udržovatelnost a je vidět, že software jako celek musí splňovat mnohem více vlastností. Z toho si lze tedy odvodit, že kvalitní kód není vždy zárukou kvalitního softwaru a je potřeba k tomu tak přistupovat.
Metriky kvality návrhu kódu
Vybral jsem si několik metrik (existuje jich celá hromada), kterými zdrojový kód ověřuji:
Efferent Coupling / Počet odchozích závislostí (CE)
Měří počet typů dat, které třída pro svoji funkčnost potřebuje. To tedy zahrnuje dědičnost, implementaci rozhraní, typy parametrů, typy proměnných a výjimky. Jako mezní hodnotu mám nastavenou na 50.
Depth of Inheritance Tree / Hloubka zanoření ve stromu dědičnost (DIT)
Udává počet zanoření dědičnosti, tedy že třída je závislá na jiné a ta na další a tak dále. Dle různých doporučení mám jako maximální hodnotu 6.
Number of Methods / Počet metod (NOM)
Zde není moc co vysvětlovat, prostě hodnota počtu metod v jedné třídě. Zde to mám omezené na 20.
Cyclomatic Complexity Number / Cyklomatická složitost (CCN)
Toto číslo udává počet různých cest programem a defakto říká kolik testů by mělo být napsáno. Vypočítá se součtem klauzulí:
- case
- if
- elseif
- for
- foreach
- while
Používám ji jako omezení u metod a na jednu metodu mám limit 15.
Lines of Code / Řádků kódu (LOC)
Zcela jasná metrika :) Na jednu metodu mám omezení na 20 řádků.
Kde jsem vzal ta konkrétní čísla?
Nejsou z mé hlavy, ale jsou to doporučení, které jsem v některých zdrojích našel. Nemyslím si ale, že by to mělo brát úplně dogmaticky, takže jsem si je přizpůsobil tak, jak mi vyhovují.
Proč?
Jelikož se snažím, aby můj kód byl napsán dobře.
Aplikace
Do svého frameworku jsem si napsal rozšíření vycházející z PDepend, které mi kód průběžně kontroluje a říká, kde hranici překračuji a mám to rovnou na očích na vývojové liště. Balíček lze ale použít i samostatně bez frameworku: gephart/quality.
Na vývojové liště potom „chyby“ vypadají následovně:
Zdroje:
http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=FC27CBB86A5EBFDFDB65F267A46F741D?doi=10.1.1.102.7392&rep=rep1&type=pdf
http://www.jarchitect.com/Metrics
https://pdepend.org/documentation/software-metrics/index.html
https://phpmd.org/rules/index.html
http://www.literateprogramming.com/mccabe.pdf
ROUDENSKÝ, Petr. Kvalita softwaru: teorie a praxe. Prostějov: Computer Media, 2016. ISBN 978-80-7402-294-4.
Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)