Archive for the ‘NDepend’ Category

SELECT * FROM CODE WHERE SHIT HAPPENS

Wednesday, March 10th, 2010

For lang tid siden fik jeg tilbud om en licens til NDepend mod en omtale af produktet på min blog. Diverse vigtigere opgaver så som at blive far for anden gang tog derimod tiden fra projektet, og jeg fik således ikke gjort noget ved. I forbindelse med den nyeste version af NDepend var Patrick Smacchia, som står bag produktet, dog så flink at kippe med flaget endnu en gang og tak for det. NDepend er bestemt et kig værd også uden en gratis licens.

NDepend er et værktøj, der kan analysere .NET assemblies. Navnet antyder, at det primært er analyse af afhængigheder mellem assemblies, der er NDepends force, men tag ikke fejl, NDepend kan så meget mere end det.

I gang med NDepend

Det er let at komme i gang med NDepend. Vi kan enten lave et selvstædigt projekt og importere relevante assemblies, eller vi kan udnytte NDepends integration med Visual Studio og koble det på en solution.

Derefter analyserer NDepend de valgte assemblies. Den første rapport er en liste over hvilke assemblies, de valgte assemblies afhænger af. Hvis der er mangler på denne liste, risikerer vi fejl under afvikling af applikationen.

Vi kan nu udføre en grundigere analyse, der kigger de valgte assemblies igennem og opsamler informationer om afhængigheder og kodekonstruktioner.

NDepend

Afhængighederne mellem de forskellige assemblies kan visualiseres på forskellige måder. En matrice giver det store overblik, og en graf viser, hvordan de enkelte komponenter bruger hinanden. Begge dele er interaktive, og vi kan således grave os ned i detaljerne efter behov. Meget brugbart.

Der er også den underlige månelandskabsoversigt, som man ofte ser afbilledet i forbindelse med omtale af NDepend. Den havde jeg indledningsvis lidt svært ved at se ideen med. Den vender vi tilbage til.

Selvom oversigterne er særdeles brugbare, så er det CQL, der står som den største killer feature ved NDepend for mit vedkommende. CQL er et SQL-lignende sprog til at lave forespørgsler mod koden. Vi kan således få vist alle metoder med mere end et bestemt antal linjer, alle metoder med mere end et bestemt antal parametre og så videre. Det er let at filtrere bestemte namespaces, typer og så videre fra, så på ingen tid kan vi få skruet meget detaljeret og specifik rapportering om vores kode sammen. Nedenstående forespørgsel finder f.eks. alle metoder med mere end 30 linjers kode:

SELECT METHODS WHERE
  NbILInstructions > 30
  ORDER BY NbILInstructions DESC

Vi kan bruge AND og OR og så videre, og kender man lidt SQL, er det let at blive dus med syntaksen. Hastigheden er et kapitel for sig. Selv med mange assemblies får man resultaterne med det samme.

Desværre tillader den nuværende syntaks ikke joins mellem de forskellige kilder, så det er f.eks. ikke mulig først at udvælge et antal typer og derefter undersøge deres metoder. Vi kan komme ud om nogle af begrænsningerne ved at specificere yderligere where-betingelser, men en egentlig join ville give lidt ekstra.

Her kommer månelandskabsgrafen til sin ret. Når vi laver en forespørgsel, farver NDepend de relevante områder af denne graf afhængig af hvor mange metoder i de givne assemblies, der opfylder vores forespørgsel. Jo mere farve, desto flere hits så at sige. Det gøre det meget let, at finde ud af hvilke assemblies, der er mest berørt af vores forespørgsel.

Den specielle graf giver mening med CQL

Forespørgslerne kan tilmed laves til regler, således at de kan inkluderes som en del af vores build job, og derved kan vi få rapporteret uhensigtsmæssigheder på samme måde, som vi kender det fra eksempelvis FxCop.

En sammenligning af FxCop og NDepend er nærliggende, for med NDepends CQL-baserede regler, er der et vist overlap de to imellem. I modsætning til FxCop er NDepend dog utrolig let at komme i gang med. Der er få, men gode regler, og derfor får man ret brugbar information out of the box. Min erfaring med FxCop er, at det kan være svært at indføre på eksisterende projekter, fordi der simpelthen er så mange regler og muligheder, og man ender hurtig med at bruge lang tid på at få noget brugbart ud af det. Det er som sagt ikke tilfældet med NDepend.

Man kommer hurtig i gang og på grund af det geniale forespørgselssprog er det let, at tilpasse produktet til de aktuelle behov.

I like it!