Metriche per programmi Java
Angelo Gargantini Informatica III (B)
2010
Misure statiche di programmi
● Una serie di misure sui programmi da usare come indici di qualità/quantità
● Esempi:
● Numero di linee di codice
● Numero di commenti
● Quanti if hai usato...
Useremo questi tool
● Javac:
● warning di Javac (aumenta il livello)
● es.: Uso di deprectated, generics, ...
● PMD
● http://pmd.sourceforge.net/
● Metrics
● http://metrics.sourceforge.net/
● Jdepend
● http://andrei.gmxhome.de/jdepend4eclipse/
Altri tools
● FindBugs
●
● CheckStyle
● STAN
● Vedi il tutorial su ilias !!!!
PMD
● PMD scans Java source code and looks for potential problems like:
● Possible bugs - empty try/catch/finally/switch statements
● Dead code - unused local variables, parameters and private methods
● Suboptimal code - wasteful String/StringBuffer usage
● Overcomplicated expressions - unnecessary if statements, for loops that could be while loops
● Duplicate code - copied/pasted code means copied/pasted bugs
PMD rules
● Many rules divided into categoeries
● Some examples:
● Code
– ExcessiveMethodLength
● Design
– UseSingleton (a class with only static methods)
● Strings
– UseEqualsToCompareStrings (== used instead of equals)
...
How to run PMD
● Demo !!
PMD - CPD
● Finding duplicate code
● Try to extract common methods ...
metrics
● Alcune metriche di complessità:
● McCabe Cyclomatic Complexity
● Misura il numero di percorsi computazionali di un metodo
● Weighted Methods per Class (WMC)
● Lack of Cohesion of Methods
● Split classes
Mectrics plugin
● Demo
JDepend
● JDepend traverses Java class file directories and generates design quality metrics for each Java package. JDepend allows you to
automatically measure the quality of a design in terms of its extensibility, reusability, and
maintainability to manage package dependencies effectively.
Running Jdepend
● Select a folder,
● RunJdepend
output
Metriche di stabilità
Nom e
Metrica Definizione
CC Classi concrete Il numero di classi concrete in un package P
AC Classi astratte Il numero di classi astratte o di interfacce in un package P Ca Accoppiamento
afferente (afferent coupling)
Il numero di package che dipendono da classi del package P
Ce Accoppiamento efferente (efferent coupling)
Il numero di package da cui dipendono le classi del package P
A Astrattezza La percentuale di classi astratte del package P, definita come il rapporto AC / (AC + CC)
I Instabilità Il rapporto fra l'accoppiamento efferente e l'accoppiamento totale Ce / (Ce + Ca). E' un indicatore della difficoltà di
modificare il package P (se infatti è alto, ciò significa che molte classi dipendono da esso).
Situazione ideale
Cosa fare
● Spostare delle classi concrete in package instabili
● Rendere astratte classi in packages stabili
Dipendenza di packaes
● Un package A che importa da un altro B e B importa da A
● Oppure indirette
Cosa fare
● Rompere i cicli è molto difficile
● Vedere dove è il ciclo e spostare metodi/classi
● Rivela in genere un problema di progettazione
Quando usare questi tools
● Usa queste metriche fin dall'inizio
● Altrimenti se devi rimodificare il codice quando sei avanti con il progetto può essere
problematico
refactoring
● Una volta scoperto i punti critici del vostro software cosa fare?
● I punti critici sono detti anche “bad smell”...
● “refactoring”