1. `
Universita degli studi di Milano Bicocca
Facolt` di Scienze Matematiche Fisiche e Naturali
a
Corso di Laurea in Informatica
Understand your code
Presentazione di
M. Bonini, L. La Torre, L. Mariot, L. Poto, M.Previtali, A. Ranchetti, D. Ranchetti, M. Susani
Anno Accademico 2010/2011
Scrum team 2 Understand your code
2. Introduzione
Understand ` un ambiente commerciale multi-piattaforma e
e
multi-linguaggio sviluppato da SciTools che ha lo scopo di aiutare
l’utente durante le fasi di reverse engineering. Permette di:
1 calcolare metriche
2 esplorare viste che rappresentano diverse caratteristiche del
codice
Supporta:
Ada
Jovial
C++
Delphi/Pascal
C#
PL/M
FORTRAN
VHDL
Java
Scrum team 2 Understand your code
3. Funzionalit`
a
Tra le molte funzionalit` di Understand ` possibile effettuare
a e
l’analisi di molte metriche. Le metriche pi` significative sono:
u
CountLineCode : Linee di codice
Cyclomatic : Numero ciclomatico (Edge - Nodi +
Componenti Connesse)
MaxNesting : Massimo livello di annidamento per le strutture
di controllo
PercentLackOfCohesion : Valore tra 0 e 100, un valore basso
indica una alta coesione tra classi e metodi
SumCyclomatic : Somma delle complessit` ciclomatiche di
a
funzioni annidate
Una volta selezionato un elemento nel grafo ad albero all’interno
del Project Metrics Browser, ` possibile esportare i valori ottenuti
e
tramite Understand in formato CSV o HTML.
Scrum team 2 Understand your code
4. Il software analizzato
Il software analizzato ` Gantt Project v. 1.11.1. Gantt ` una
e e
applicazione desktop per la gestione di progetto e
dell’organizzazione del lavoro. Esso ` scritto in Java ed ` composto
e e
da:
549 classi
318 files
29211 linee di codice
Questi dati sono stati ottenuti tramite i report di cui parleremo in
seguito.
Scrum team 2 Understand your code
6. Metric Charts
In aggiunta alla semplice visualizzazione testuale ` possibile
e
ottenere una rappresentazione grafica delle metriche. La loro
generazione ` molto semplice, basta utilizzare i comandi presenti
e
sotto il menu Metrics. In particolare ` possibile visualizzare:
e
1 Code Volume Distribution
2 File Volume
3 Avarage Complexity
4 Sum Complexity
5 Metric TreeMap
Scrum team 2 Understand your code
7. Code Volume Distribution
Questo grafico rappresenta la distribuzione delle linee di codice nel progetto in termini di:
CountLineBlank: linee di codice vuote.
CountLineCodeDecl: numero di linee contenente codice dichiarativo.
CountLineCodeExe: numero di linee contenente codice sorgente eseguibile.
CountLineComment: numero di linee contenente commenti.
Dal grafico osserviamo che la ripartizione ` abbastanza uniforme, le linee vuote sono in numero minore, le linee di
e
codice eseguibile sono le pi` diffuse.
u
Scrum team 2 Understand your code
8. File Volume
Indica semplicemente da quanti files ` composto il progetto.
e
Scrum team 2 Understand your code
9. Avarage Complexity
Vengono rappresentate mediante un istogramma alcune misure di complessit`.
a
AvgCyclomatic: complessit` ciclomatica media di tutti i metodi e di tutte le funzioni innestati.
a
MaxCyclomatic: complessit` ciclomatica massima di tutti i metodi e di tutte le funzioni innestati.
a
MaxNesting: livello di innestamento massimo di strutture di controllo in una funzione.
Notiamo che c’` un forte squilibrio tra la complessit` ciclomatica massima e quella media e questo indica che ci
e a
sono classi che sono molto pi` complicate della media e sulle quali e quindi consigliabile operare modifiche atte a
u
migliorare il codice.
Scrum team 2 Understand your code
10. Sum Complexity
CountPath: Numero di percorsi unici attraverso un blocco di codice,
senza contare le uscite anomale o goto.
SumCyclomatic: somma della complessit` ciclomatica di tutte le funzioni
a
innestate.
SumEssential: somma della complessit` essenziale di tutte le funzioni
a
innestate.
Scrum team 2 Understand your code
11. Metric TreeMap
Questo strumento fornisce una vista particolarmente interessante che ci
permette di visualizzare una determinata caratteristica del codice che stiamo
analizzando in funzione di una seconda caratteristica. Il menu per la
generazione di tale grafico ci fornisce le seguenti possibilit`:
a
Scrum team 2 Understand your code
12. Metric TreeMap
In questo esempio sono stati scelti come parametri il numero di
linee per classe e la massima complessit` ciclomatica. Notiamo che
a
nella maggior parte dei casi le classi pi` complesse coincidono con
u
le classi di maggiori dimensioni. Grazie all’editor integrato `
e
possibile mettere subito mano al codice.
Scrum team 2 Understand your code
13. Project Overview Charts
Tramite la funzione di Project Overview Charts ` possibile avere
e
una panoramica generale sulle principali caratteristiche dell’intero
progetto analizzato. Per poter utilizzare questa funzione, dopo
aver aperto il progetto, bisogner` andare nel men` Project e
a u
selezionare Project Overview Charts. Tipi di output:
grafici a torta
istogrammi
tabelle
Scrum team 2 Understand your code
14. Code breakdown
Con questa analisi ` possibile capire,tramite un diagramma a torta,
e
la percentuale e il numero di linee di codice, linee di commento e
linee vuote.
Scrum team 2 Understand your code
15. Function breakdown
Questo strumento mostra, tramite un diagramma a torta, la
percentuale e il numero di funzioni di tipo Public, Private,
Protected e Default.
Scrum team 2 Understand your code
16. Class breakdown
Con questa analisi ` possibile capire, tramite un diagramma a
e
torta, la percentuale e il numero di classi di tipo Public, Private,
Protected e Default.
Il numero di classi con visibilit` Public sono in numero nettamente
a
maggiore alle altre con diversa visibilit`.
a
Scrum team 2 Understand your code
17. Most complex functions
`
E possibile identificare le cinque funzioni pi` complesse del
u
progetto, permettendo quindi al designer, se ` possibile, di spartire
e
le responsabilit` tra pi` funzioni, aumentando la mantenibilit` e la
a u a
semplicit` del progetto. Per complessit` si intende il numero di
a a
cammini linearmente indipendenti attraverso il grafo di controllo di
flusso.
Scrum team 2 Understand your code
18. Most complex files
Vengono mostrati i cinque files pi` complessi, identificando quindi
u
quei files che potrebbero essere scomposti per suddividere meglio le
responsabilit` e ridurre la complessit`. Per complessit` si intende la
a a a
media del numero di cammini linearmente indipendenti attraverso
il grafo di controllo di flusso per ogni metodo all’interno del File.
Scrum team 2 Understand your code
19. Reports
Understand genera una grande variet` di reports. I reports
a
rientrano in queste categorie:
Cross-Reference Reports mostrano informazioni simili a quelle
nel Browser Info, tranne che sono indicati tutte le entit`
a
insieme in ordine alfabetico.
Structure Reports mostrano la struttura del programma
analizzato.
Quality Reports mostrano aree in cui il codice potrebbe dover
essere esaminato.
Metric Reports indicano le metriche di base come il numero di
righe di codice e commenti.
`
E possibile creare i reports sia in formato HTML sia in formato
testuale. La generazione dei reports ` molto semplice; ` sufficiente
e e
andare nel menu Reports e poi cliccare Generate Reports.
Scrum team 2 Understand your code
21. I grafi
Per creare un grafo relativo ad una classe/package bisogna:
1 Selezionare il nodo architetturale d’interesse con il tasto
destro del mouse
2 Andare su Graphical Views e selezionare il grafo desiderato
(Depends on, Depended on By, Butterfly-Dependency Graph,
Internal Dependencies)
Scrum team 2 Understand your code
22. Caratteristiche comuni ai grafi
I grafi di dipendenza architetturale sono grafi orientati e pesati. I
vertici del grafo si dividono in due tipologie:
Classi, rappresentati da riquadri bianchi;
Package/cartelle rappresentati da riquadri colorati; facendo
doppio clic su questi ultimi, ` possibile espandere la
e
visualizzazione del grafo alle classi/sottocartelle contenute al
loro interno.
Gli archi orientati possono essere invece di due colori:
gli archi blu indicano una relazione di dipendenza semplice
gli archi rossi una relazione di mutua dipendenza
I pesi degli archi, infine, vengono determinati contando il numero
di chiamate alla classe (o package/cartella a cui appartiene) di
destinazione dell’arco.
Scrum team 2 Understand your code
23. Dependency graph
Un grafo delle dipendenze mostra come le varie classi presenti nel
progetto interagiscono tra loro. Attraverso un grafo delle
dipendenze ` quindi possibile osservare quali classi o cartelle
e
vengono maggiormente utilizzate e richiamate o quali nodi fanno
maggior uso di altre classi o cartelle all’interno del codice.
Scrum team 2 Understand your code
24. Depends on
Questo tipo di grafo ` disponibile per classi e package. Mostra le
e
classi e i package da cui dipende l’elemento sul quale ` stato
e
generato il grafo.
Scrum team 2 Understand your code
25. Depended On By
Questo tipo di grafo ` disponibile per classi e package. Mostra le
e
classi e i package che dipendono dall’elemento sul quale ` stato
e
generato il grafo.
Scrum team 2 Understand your code
26. Butterfly-Dependency
Questo tipo di grafo ` disponibile solo per package. Esso pu`
e o
essere considerato come l’unione dei grafi Depends on e Depended
on By generati su un elemento; mostra quali classi/package
dipendono dall’elemento sul quale ` stato generato il grafo e le
e
classi package da cui l’elemento dipende.
Scrum team 2 Understand your code
27. Internal dependencies
Questo tipo di grafo ` disponibile solo per package. Mostra le
e
dipendenze delle classi all’interno dell’elemento (package) su cui `
e
stato generato il grafo.
Scrum team 2 Understand your code
28. UML class diagram
Attraverso questo tipo di digramma ` possibile comprendere come si
e
comportano le classi all’interno del software. Ogni freccia indica che la
classe di partenza ` figlia della classe di destinazione.
e
Qui mostriamo solo un dettaglio del diagramma delle classi perch´ il
e
diagramma completo contiene 549 classi e la rappresentazione completa
del diagramma ` difficilmente fruibile.
e
Scrum team 2 Understand your code
29. Graph architecture
Attraverso il grafo dell’architettura ` possibile comprendere la
e
suddivisione e la ripartizione, in termini di file, del progetto. Questo pu`
o
servire a comprendere i macro-blocchi che costituiscono il sistema.
Ellissi
Rappresentano delle cartelle che a loro volta contengono altre
sottocartelle. Questi sono nodi interni (non possono essere foglie)
dell’albero generato con il grafo dell’architettura.
Riquadri
Rappresentano cartelle che al loro interno hanno solo file contenente
codice, ovvero non contengono altre sottocartelle. Questi sono sempre i
nodi foglia dell’albero generato attraverso il grafo dell’architettura.
Frecce
Le frecce che collegano due cartelle, servono a rappresentare la gerarchia.
In particolare una freccia uscente indica che la cartella di partenza
contiene al suo interno la cartella di destinazione.
Scrum team 2 Understand your code
31. Code Check
Un’ulteriore funzionalit` offerta dal tool consiste in una breve
a
analisi del codice. Essa permette di trovare alcuni difetti di
programmazione. Permette di rilevare:
errori di naming di variabili
funzioni troppo lunghe
funzioni troppo complesse
codice non raggiungibile
Scrum team 2 Understand your code
32. Code Check
`
E possibile esplorare i risultati per capire dove sono effettivamente
collocati gli errori rilevati.
Scrum team 2 Understand your code
33. Pregi e difetti
Pregi:
facile da installare e da
utilizzare
Difetti:
ha un editor per il codice
alcune viste, come il
integrato
diagramma delle classi,
` compatibile con molti
e sono di difficile
linguaggi di consultazione
programmazione
problemi ad esportare
ha molti tipi di viste che immagini in caso di viste
aiutano a comprendere molto complesse
velocemente le
caratteristiche del
software
Scrum team 2 Understand your code