Poprawność kodu powinna być sprawdzana na każdym etapie produkcji oprogramowania. Do dyspozycji są wszelkie typy testów (jednostkowe, integracyjne obciążenia itp.). Wszystkie wymienione testy sprawdzają jednak czy kod wykonuje swoje zadanie w oczekiwany sposób. Nie sprawdzają jakości napisanego kodu. Testy nie wykażą, że dany kod jest napisany w sposób mało elegancki. Jednym z najskuteczniejszych rozwiązań jest tzw. code review (recenzjonowanie kodu). Polega to na tym, że dany fragment kodu jest przeglądany i analizowany przez różnych programistów. Każdy z nich ocenia czy kod jest napisany w sposób poprawny, umożliwiający dalsze rozszerzenia. Moi zdaniem jest to najlepsze rozwiązanie jednak nie zawsze możliwe i praktykowane. Dlatego w poście przedstawię rozwiązanie czysto matematyczne – metryki oprogramowania.
Doskonałym narzędziem obliczającym przeróżne metryki kodu jest nDepend. Za darmo można ściągać wersję akademicką, trial lub przeznaczoną wyłącznie do projektów typu Open-Source. Ponadto program integruje się z Visual Studio (również VS 2010), znacząco ułatwiając stałą kontrolę nad kodem. W tym poście nie będę zajmować się opisem konkretnych metryk. Wszystkie metryki opisane są w dokumentacji dołączonej do nDepend. W przyszłych postach planuje opisać tylko kilka, według mnie najciekawszych metryk (m.in. złożoność cyklomatyczna).
Aby zintegrować nDepend z Visual Studio należy odpalić plik NDepend.Install.VisualStudioAddin.exe:
Po instalacji w VS pojawi się dodatkowe menu:
Na początek przeprowadźmy analizę kodu – wybieramy nDepend->Run Analysis. Po chwili pojawi się wygenerowany raport w formie pliku html. Raport przedstawia wiele metryk, podzielonych na kategorie:
-
Metryki aplikacji – bardzo ogólne, głównie informacyjne. Określają ile w projekcie jest bibliotek, klas, linii kodu itp.
-
Metryki bibliotek – wartości liczone dla każdej bibliotek w projekcie.
-
Abstrakcyjność i niestabilnośc – wizualne przedstawienie metryki “Distance from main sequence”.
-
Zależności między bibliotekami.
-
Lista złamanych metryk oraz zasad (np. gdy metoda zawiera za mało komentarzy).
-
Metryki typów (klasy, typy enumeryczne).
Ponadto program umożliwia łatwe znalezienie konkretnej metody za pomocą języka zapytań. Przykładowo aby znaleźć metodę o nazwie SubmitOrder wystarczy wpisać:
SELECT TYPES WHERE (NameLike "SubmitOrder\i") AND !IsInFrameworkAssembly
Za pomocą zapytać CQL można wyszukać metody dla których dana metryka posiada konkretną wartość lub określony zbiór wartości.
nDepend umożliwia również wygenerowanie macierzy zależności:
Polecam zainstalowanie programu i przejrzenie jego możliwości. Oczywiście żadne metryki nie zastąpią ciągłej kontroli kodu przez człowieka ale mogą znacząco wpłynąć na jakość pisanego kodu.