Le metriche più comuni per misurare la complessità (o semplicità, se si prende la semplicità per essere l'opposto della complessità) sono La complessità ciclopica di McCabe e le metriche di complessità di Halstead .
La complessità ciclomatica misura il numero di percorsi distinti attraverso una determinata unità, di solito un metodo o una funzione, sebbene possa anche essere calcolata su una classe. Con l'aumento del numero di percorsi, diventa più difficile ricordare il flusso di dati attraverso un determinato modulo, che è correlato al concetto di funzionante la memoria . L'elevata complessità ciclomatica tende ad indicare difficoltà nella capacità di testare un modulo - sono necessari più casi di test per coprire i vari percorsi attraverso il sistema. Ci sono stati anche studi che hanno collegato la complessità ciclomatica ad alti tassi di difetti. Tipicamente, una complessità ciclomatica di 10 indica che un'unità dovrebbe essere rivista e possibilmente refactored.
Le misure di complessità di Halstead utilizzano gli input di operatori e operandi totali e distinti per calcolare il volume, la difficoltà e lo sforzo di un pezzo di codice. Difficoltà, che è il (numero di operatori unici / 2) * (numero totale di operandi / numero di operandi univoci), è legato alla capacità di leggere e comprendere il codice per attività come l'apprendimento del sistema o l'esecuzione di una revisione del codice. Di nuovo, puoi contare su un livello di sistema, un livello di classe o un metodo / livello di funzione. Ci sono alcuni post sul calcolo di queste misure qui e qui .
Il semplice conteggio delle righe di codice può anche darti un'idea di complessità. Più righe di codice significa che c'è più da leggere e capire in un modulo. Sarei riluttante a usare questo come misura indipendente. Invece, lo userei con altre misurazioni, come il numero di difetti in un dato modulo per ottenere la densità dei difetti. Un'alta densità di difetti potrebbe indicare problemi nella scrittura di test e nell'esecuzione di revisioni del codice, che possono essere o non essere causati da codice complesso.
Fan-in e fan-out sono altre due metriche, correlate al flusso di dati. Come definito qui , fan in è la somma delle procedure chiamate, i parametri letti e le variabili globali lette e fan out è la somma delle procedure che chiamano una determinata procedura, i parametri scritti (esposti agli utenti esterni, passati per riferimento) e le variabili globali scritte in. Ancora una volta, un alto fan-in e fan-out potrebbe essere indicativo di un modulo che potrebbe essere difficile da capire.
In paradigmi specifici, potrebbero esserci altre misure o metriche che sono anche utili. Ad esempio, nel mondo orientato agli oggetti, l'accoppiamento di monitoraggio (desiderio basso), coesione (desiderio alto) e profondità dell'ereditarietà (desiderio basso) può essere utilizzato per valutare quanto semplice o complicato sia un sistema.
Naturalmente, è importante rendersi conto che un sacco di misure e metriche sono semplicemente degli indicatori. Devi usare il tuo giudizio per determinare se è necessario un refactoring per aumentare la semplicità o se non vale la pena di farlo. È possibile effettuare misurazioni, calcolare le metriche e conoscere il proprio codice, ma non si desidera progettare il sistema in base ai numeri. In definitiva, fai ciò che ha senso.