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 ● ● Metrics ● ● http://pmd.sourceforge.net/ 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 – ● Design – ● UseSingleton (a class with only static methods) Strings – ● ExcessiveMethodLength ... 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à 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 Il numero di package che dipendono da classi del package P afferente (afferent coupling) Ce Accoppiamento Il numero di package da cui dipendono le classi del package efferente (efferent P coupling) 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). D Distanza dalla sequenza principale La distanza del package P dalla retta di equazione A + I = 1. E' un indicatore del compromesso raggiunto dal package fra astrattezza (A = 1, I = 0) e instabilità (A = 0, I = 1). Nom e 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”