poniedziałek, 7 września 2009

NDepend. Wiesz z kim tańczysz?

Po konkretnej nieobecności w trybie online powracam do życia - z kolejnymi wpisami znanej treści, tym razem słów kilka o niezwykle użytecznym narzędziu: NDepend.

Czym jest owy NDepend? To narzędzie dla .NET, którego autorem jest Patrick Smacchia. Służy ono do badania i raportowania złożoności oraz jakości tworzonego kodu. Na chwilę obecną posiada 82 metryki wyświetlające bardzo szczegółowe dane. Dodatkowo generator raportów sprawiają, że nawet “nieprogramista” może ocenić w jakiej kondycji jest dostarczony mu kod – narzędzie wszechstronne oraz wręcz nieograniczone. Możliwość integracji z NAnt-em lub MSBuild-em dostarczają automatów do wykonywania tego wszystkiego o czym troszkę napisze za chwilę.

Zacznijmy od początku. Po uruchomieniu NDependa wskazujemy zestaw bibliotek, które chcemy poddać analizie. Nie mam nic mądrego pod ręką, dlatego posłużę się bibliotekami MbUnit.

1 

Program od razu przystępuję do akcji, a oczom naszym ukazuje się dłuuugi raport.

2

I tak, na pierwszy rzut widzimy:

ilość instrukcji IL, ilość linii, kodu, (uwaga) pokrycie kodu przez komentarze, ilość klas, ilość typów itd. O ile niektóre z tych danych, z praktycznego punktu widzenia, możemy potraktować statystycznie, o tyle już np. zależności między samymi klasami, martwy kod, konwencje nazewnicze mogą być tym, czego właśnie szukamy.

Kto, kogo, gdzie…

Wspomniane zależności między modułami mogą być bardzo skomplikowane, przedzieranie się pomiędzy nimi za pomocą Reflectora często po kilkudziesięciu minutach powoduje odruch wymiotny na widok kolejnego “dziedzica”. Na szczęście NDepend jest w stanie to wszystko ogarnąć i mimo że kod nadal pozostaje zakręcony, to my w tym gąszczu powiązań dość szybko możemy dojść do celu.

4

Refaktoryzacja kodu z tym okienkiem staje się wiele prostsza. Często graf może wydawać się zbyt obszerny:

DiagramBoxAndArrowGraphBig

Na szczęście do dyspozycji mamy dodatkowe dokowalne okienko: Dependency Matrix:

5

Skóra węża?

Kolejnym bardzo interesującym widokiem jest okno Metrics. Przypomina ono nieco skórę węża (tak, widzę tam skórę węża :-) ), a ma za zadanie wykonanie rentgena naszego kodu: każda bryła w ogólności symbolizuje klasę, która to składa się z mniejszych kwadracików – naszych metod. Im metoda ma więcej linii kodu, tym kwadracik jest większy. Sczegółowość możemy zawężać przełącznikiem widniejącym u góry okienka, natomiast zbiorcze informacje widzimy w okienku Info.

6

CQL

To nie wszystko! NDepend posiada wbudowany interpreter języka zwanego CQL (Code Query Language). Dzięki niemu piszemy kwerendy zbliżone do języka SQL, które to pozwalają odpytywać się NDependa o interesujące nas dane o naszym kodzie.

Operator projekcji: SELECT

  • METHODS – odpytania do metod
  • FIELDS – odpytania do pól
  • TYPES – odpytania do typów
  • NAMESPACES – odpytania do  przestrzeni nazw
  • ASSEMBLIES – odpytania operujące na bibliotekach

Operator informujący: WARN

  • WARN IF – jeśli spełniony jest warunek

Aby utworzyć kwerendę należy skorzystać z okna CQL Query Edition, które posiada wbudowane podpowiadanie składni z możliwością wizualnego modyfikowania jej parametrów:

7

Przykłady:

1. Wyświetl metody publiczne, które mają więcej niż 30 linii kodu:

SELECT METHODS WHERE NbLinesOfCode > 30 AND IsPublic

2. Wyświetl 10 najbardziej złożonych metod i uszereguj metody ze względu na ich złożoność:

SELECT TOP 10 METHODS ORDER BY CyclomaticComplexity

3. Moja konwencja nazewnicza zabrania nazywania pól statycznych zaczynających się od przedrostka m_ Ostrzeż mnie jeśli znajdziesz takie wystąpienia:

WARN IF Count > 0 IN SELECT FIELDS WHERE NameLike "^m_" AND IsStatic

Słowo końcowe

NDepend to naprawdę niezły kombajn, kilka godzin może okazać się niewystarczające, aby zgłębić możliwości jakie drzemią w tym narzędziu. Warto go poznać, gdyż może uratować nam skórę podczas następnej refaktoryzacji kodu.


Promuj

4 komentarze:

Procent pisze...

Kiedyś próbowałem zapoznać się z tym narzędziem, zacząłem nawet pisać o nim posta, i... okazało się że nie potrafię znaleźć dla niego zastosowania. Owszem, fajnie popatrzeć na statystyki, ale żeby naprawdę regularnie z niego korzystać? Nie potrafię sobie tego wyobrazić. MOŻE przy naprawdę dużych projektach jak analizowane przez Patricka NHibernate czy SharpDevelop, ale w codziennej pracy...
Warto wiedzieć, że do VS 2010 zostanie dołączonych kilka funkcji rodem z NDepend pozwalających na przeprowadzenie mniej skomplikowanej analizy.

Dariusz Tarczyński pisze...

@Procent
Ja dla NDependa widzę 2 typy zastosowań:
1. Na "życzenie": kiedy musimy wydzielić jakąś bibliotekę z innej, wtedy przydaje się opisany graf zależności.
2. Na automacie: w połączeniu z Continuous Integration może uzupełnić np. StyleCopa dająć ogólny pogląd o tym co się dzieje w buildowanych projektach - wiadomo pewnie nikt tego nie będzie co buld-a czytał, ale fajny feature :-)

Gutek pisze...

A mnie wlasnie czeka post na jego temat... ;)

i szczerze mam takie same watpliwosci co Procent, dlatego tez od... mhhh miesiaca sie zastanawiam w jaki sposob to zademonstrowac tak by moje watpliwosc co do korzystania z nDepend poszly sobie daleko

Dariusz Tarczyński pisze...

@Gutek
No to Gutek myśl, myśl bo Ci Patrick zabierze licencję ;-)