Le metriche più comuni per misurare la complessità (o semplicità, se si considera la semplicità l'opposto della complessità) sono la complessità ciclomatica di McCabe e le metriche della complessità di Halstead .
La complessità ciclomatica misura il numero di percorsi distinti attraverso una data unità, generalmente un metodo o una funzione, sebbene possa anche essere calcolata su una classe. Con l'aumentare del numero di percorsi, diventa più difficile ricordare il flusso di dati attraverso un determinato modulo, che è correlato al concetto di memoria di lavoro . Un'elevata complessità ciclomatica tende a 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 un'elevata complessità ciclomatica a tassi di difetti elevati. Tipicamente, una complessità ciclomatica di 10 indica che un'unità deve 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. La difficoltà, che è il (numero di operatori unici / 2) * (numero totale di operandi / numero di operandi unici), è legata alla capacità di leggere e comprendere il codice per attività come l'apprendimento del sistema o l'esecuzione di una revisione del codice. Ancora una volta, puoi contare questo a livello di sistema, a livello di classe o a livello di metodo / funzione. Ci sono alcuni post sul calcolo di queste misurazioni qui e qui .
Il semplice conteggio delle righe di codice può anche darti un'idea di complessità. Più righe di codice significano che c'è più da leggere e comprendere in un modulo. Sarei titubante nell'usarlo come misura autonoma. 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 dei test e nell'esecuzione delle revisioni del codice, che possono essere o meno 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, parametri scritti in (esposti agli utenti esterni, passati per riferimento), e variabili globali scritte. Ancora una volta, un alto fan-in e fan-out potrebbero essere indicativi di un modulo che potrebbe essere difficile da capire.
In paradigmi specifici, potrebbero esserci anche altre misure o metriche utili. Ad esempio, nel mondo orientato agli oggetti, il monitoraggio dell'accoppiamento (desiderio basso), della coesione (desiderio alto) e della profondità dell'eredità (desiderio basso) può essere utilizzato per valutare quanto sia semplice o complicato un sistema.
Naturalmente, è importante rendersi conto che molte misure e metriche sono semplicemente indicatori. Devi usare il tuo giudizio per determinare se è necessario refactoring per aumentare la semplicità o se non vale la pena farlo. È possibile effettuare le misurazioni, calcolare le metriche e conoscere il codice, ma non si desidera progettare il sistema in base ai numeri. Alla fine, fai ciò che ha senso.