Qualche giorno fa ero alle prese con l’ottimizzazione di una grossa soluzione di Visual Studio, composta da decine di progetti fra cui un paio scritti in vb.net. La mia intenzione, essendo molto più ferrato in C# era di convertire questi scritti in VB.net, ma dovevo conoscere la struttura dell’intera soluzione ed in particolare le dipendenze fra i vari progetti. Le altre ottimizzazioni sarebbero venute dopo, in C#, cosa per me molto più facile!
Alla ricerca di uno strumento che mi consentisse di ricavare e rappresentare magari graficamente una matrice di dipendenza, sono capitato sul sito di NDepend.
In particolare ciò che mi ha attirato e convinto a provarlo è stata la possibilità di creare una Dependency Structure Matrix (http://www.ndepend.com/docs/dependency-structure-matrix-dsm), sia in forma grafica che in formato tabellare.
NDepend è uno strumento potentissimo, potete visionare le varie altre feature qui: http://www.ndepend.com/features/
Download e Installazione
E’ possibile ottenre una versione di prova della durata di 14 giorni scaricandola dal link http://www.ndepend.com/download.
La procedura di installazione è molto semplice, non c’è! NDepend viene fornito sotto forma di un file zip, basta decomprimerlo in una cartella a vostra scelta, magari non in ‘%ProgramFiles%\NDepend’ per evitare problemi di permessi, e poi sarà possibile eseguirlo sia in versione standalone (VisualNDepend.exe), oppure lanciare l’installer dell’estensione di Visual Studio (NDepend.VisualStudioExtension.Installer.exe).
Patrick Smacchia, creatore di NDepend, è stato inoltre così gentile da fornirmi una licenza MVP per provare a fondo lo strumento (ma questo non influirà sulla mia rcensione!). In tal caso è stato sufficiente copiare il file di licenza (nel mio caso NDependProLicense.xml) all’interno della stessa cartella in cui avete decompresso il file zip.
Utilizzo di NDepend
Per eseguire NDepend in modalità stand alone basta lanciare VisualNDepend.exe, e si aprirà la finestra seguente (l’immagine è della versione 6.0.1 Professional).

Possiamo ora scegliere cosa analizzare, partendo per esempio da una soluzione Visual Studio che da un set di assembly già compilati. Sulla sinistra trovate i link rapidi per avviare le varie possibilità. L’analisi si basa comunque sempre su un set di assembly, quindi anche se si seleziona una soluzione di Visual Studio, NDepend va alla ricerca degli assembly prodotti dalla compilazione.
Notare che è possibile installare, se già non lo si è fatto, l’estensione per Visual Studio, in maniera da poter sfruttare tutte le funzionalità di NDEpend direttamente all’interno dell’IDE Microsoft.
Per mostrare come funziona NDepend, ho scelto di analizzare la soluzione fornita da Telerik per gli esempi di utilizzo dei propri controlli WPF.
Quindi, dopo aver compilato tale soluzione, ho scelto il comando Analyze VS Solutions and VS Projects, che fra l’altro è evidenziato da una freccia lampeggiante, e selezionato nella schermata seguente, gli assemblies da analizzare:

Confermando l’avvio dell’analisi, alla fine della stessa otterremo una conferma del completamento e si potrà decidere come proseguire.

L’analisi è molto veloce, nel mio caso ho selezionato 77 assemblies, ed è stata terminata in 1 minuto e 4 secondi. Terminata questa fase, apparirà la seguente schermata di conferma e se avete lasciato il check selezionato su Build Report di aprirà anche una pagina web con un report di riepilogo.
Analisi dei risultati
La cosa più semplice da fare, soprattutto le prime volte, per prendere familiarità con i vari strumenti, e cliccare su View NDepend Dashboard, che che aprirà la sezione Dashboard con un riepilogo dell’analisi effettuata.

Sulla sinistra avrete a disposizione un browser delle classi analizzate, simile a quello di Visual Studio, mentre al centro della schermata potete già dare un’occhiata panoramica a quello che costituisce la soluzione. Per esempio linee totali di codice, numero di tipi, percentuali di commenti, complessità media, e sulla destra anche il risultato dell’analisi rispetto a delle regole standard. Da cui è facilissimo navigare nelle altre sezioni.
Intanto oltre alla Dashboard, è possibile passare rapidamente alle altre sezioni:Dependency Graph, Dependency Matrix, Metrics e così via.
Mentre cliccando sui link, per esempio quello che indica il numero di 10 regole critiche violate, verrà aggiornato il Query Explorer in basso, che mostra intanto le varie categorie di regole:

Facendo click su ogni query, verrà eseguita la query CQLinq stessa (vedi paragrafo seguente) che mostrerà i risultati nel pannello a sinistra.
Per esempio fra i miei risultati, mi viene indicato che 2 metodi hanno troppi parametri, se voglio conoscere quali sono esattamente, magari per poterli semplificare, l’esecuzione della query mi mostrerà il seguente risultato:

quindi otteniamo sia il nome del metodo incriminato, e il numero dei suoi parametri.
Ogni regola funziona così, c’è una corrispondente query, e cliccandoci viene eseguita e ne vediamo subito i risultati. Ad un primo impatto l’interfaccia è forse un pò complessa da digerire, con un sacco di tooltip, e possibilità di navigazione. Ma una volta capito il meccanismo è semplice orientarsi.
Dependency Graph e Matrix
La sezione che più mi interessava per il mio progetto lavorativo, era quella relativa alle dipendenze. Volevo ottenere le dipendenze fra i vari assembly del progetto ma anche fra i vari tipi. NDepend consente di ottenere tali dipendenze sia in maniera grafica che mediante una matrice.
La prima possibilità è veloce da capire ma in caso di progetti complessi è spesso incomprensibile! Date un’occhiata all’intero grafico ottenuto con l’esempio:

Naturalmente è possibile filtrare i nodi visualizzati, per esempio escludendo gli assembly di terze parti, o navigando verso grafi di dipendenza più semplici, con un click con il destro che mostra un menù con decine di possibilità.
Per un’analisi più puntuale e magari per esportare i risultati, potete passare alla visualizzazione a matrice, che mostra i nodi su righe e colonne e nelle varie intersezioni consente di leggere quali sono gli eventuali livelli di dipendenza. Qui è comodissimo il tooltip che appare posizionandosi su ogni quadratino colorato, nel quale viene spiegato qual’è il nodo sulla riga e quello sulla colonna e perchè sono dipendenti.
Nella stessa matrice è possibile ottenere informazioni su cicli di dipendenza, evidenziati con un bordo rosso e dei quadrati neri. Anche in questo caso con un click con il tasto destro è possibile passare a dettagli maggiori, mentre con la barra degli strumenti in alto è possibile filtrare e configurare quali informazioni sono quelle che ci interessano maggiormente.

CQLinq
Fra le funzioni più potenti, vi è la possibilità di scrivere e personalizzare delle query LINQ per analizzare il contenuto degli assembly, mediante un apposito provider detto CQLinq, ovvero Code Query over Linq. NDepend ne fornisce già circa 200 pronte all’uso e utilizzate internamente per le analisi standard. Ma siete liberi di scriverne anche di personalizzate, il tutto con l’ausilio di intellisense e compilazione automatica.
Per esempio la seguente query consente di ottenere l’elenco dei metodi che hanno più di 200 linee di codice:

A questo punto solo la vostra fantasia può porre limiti alle analisi che potete eseguire sul vostro codice!
Documentazione
Sul sito ufficiale NDepend trovate una sezione di documentazione, molto completa, con video, tutorial, ed approfondimenti sulle varie feature. In particolare vi consiglio di dare un’occhiata al video Getting Started per capire come installare e cominciare a prendere confidenza con le potenzialità dello strumento.
Prezzi
Dopo la trial di 14 giorni, per continuare ad usare NDepend (non ne potete probabilmente fare più a meno) dovete acquistare una licenza. I prezzi sono senz’altro accessibili, a mio parere. date un’occhiate al listino, ma 299€ per una licenza 1 seat è un costo equo, a mio parere.
Considerazioni finali
NDepend è un tool potentissimo, molto stabile e veloce. La curva di apprendimento può essere un pò ripida, ma dopo che aver preso padronanza dei vari strumenti messi a disposizione, in particolare della possibilità di scrivere le proprie query, potete analizzare le vostre applicazioni (o quelle di terze parti) in ogni loro dettaglio ed ascoltando i suggerimenti basate sulle regole standard migliorerete moltissimo la loro qualità.
Mi sento assolutamente di consigliarlo ad ogni sviluppatore .NET, ed in particolare a chi magari deve mettere le mani ad un progetto complesso ed iniziare a conoscerlo nel più breve tempo, e per chi, sempre alle prese con progetti di una certa dimensione, ha il compito di ottimizzarlo.