Un refactoring può ridurre la duplicazione e, allo stesso tempo, rendere più difficili le modifiche se aggiunge astrazioni poco chiare o sposta la complessità altrove. Per valutarne il risultato, non basta confrontare un punteggio né verificare che i test passino: bisogna definire cosa si vuole migliorare, osservare diversi segnali e verificare se il sistema è diventato più facile da modificare.
Questa guida spiega come misurare la manutenibilità di un’applicazione PHP prima e dopo un refactoring, senza trasformare le metriche in obiettivi isolati. Il metodo è valido per una classe, un modulo o un flusso di business, purché si confronti lo stesso perimetro e si registri il contesto.
Perché una singola metrica non dimostra la manutenibilità

La manutenibilità è la capacità di comprendere, testare e modificare un sistema con un livello di rischio ragionevole. Nessun indicatore rappresenta da solo queste capacità. Meno righe non significano necessariamente meno complessità; una copertura maggiore non garantisce test utili; e un buon punteggio di analisi statica non rivela se il team comprende il design.
Inoltre, le metriche possono cambiare per ragioni estranee al refactoring: uno strumento aggiornato, regole di analisi diverse, variazioni del perimetro o codice generato incluso nel report. Per questo, un valore va interpretato insieme al metodo di calcolo, all’area analizzata e ai limiti noti.
L’obiettivo non è dimostrare che la modifica ha “migliorato il codice” in astratto. È verificare se ha risolto un problema concreto senza introdurre rischi sproporzionati.
Definire quale capacità di modifica si vuole migliorare
Prima di misurare, formula un’ipotesi verificabile e circoscritta. Per esempio: “Separare le regole di calcolo da questa classe dovrebbe consentire di testarle senza avviare il flusso HTTP” oppure “Ridurre le dipendenze di questo servizio dovrebbe limitare le modifiche necessarie per aggiungere una regola”. L’ipotesi individua un risultato atteso, non prescrive un’architettura di tendenza.
Definisci l’area e le operazioni interessate: classi, endpoint, comandi, job o regole di business. Annota anche cosa resta fuori, come un’integrazione esterna o un debito noto che non verrà affrontato. Senza questo perimetro, un confronto può mescolare l’effetto del refactoring con altre modifiche.
Conviene tradurre l’ipotesi in osservazioni pratiche. Dovrebbe essere più facile individuare la regola? Sarà possibile testarla senza un database reale? Diminuirà il numero di moduli da modificare per un cambiamento abituale? Scegli poche domande a cui il team possa rispondere con evidenze.
Stabilire una baseline prima di modificare il codice
Registra lo stato iniziale in una revisione identificabile del repository, usando gli stessi strumenti e la stessa configurazione che userai in seguito. Per un’area PHP, può essere utile combinare questi segnali:
- Complessità: esamina i metodi lunghi, i rami condizionali e i punti in cui si accumulano decisioni. La complessità ciclomatica può essere indicativa, ma da sola non descrive la difficoltà di comprendere una regola.
- Accoppiamento: individua le dipendenze dirette, le responsabilità sovrapposte e i collegamenti con l’infrastruttura. Osserva se una modifica obbliga a conoscere o toccare componenti non correlati.
- Duplicazione: individua la logica ripetuta, distinguendo la duplicazione accidentale da regole simili che devono evolvere separatamente.
- Test: registra quali comportamenti importanti sono coperti, quali test sono affidabili e quali dipendenze richiedono servizi esterni per eseguire un test.
- Operatività e rilascio: annota eventuali incidenti in produzione o regressioni rilevanti, le difficoltà nel rilasciare la modifica e i passaggi manuali associati, se pertinenti all’area.
Se usi l’analisi statica, conserva il nome dello strumento, le regole, la versione e il comando. Il numero, senza queste informazioni, non è riproducibile. Se la configurazione lo consente, separa anche il codice generato o esterno e annota le esclusioni.
Scegliere indicatori verificabili e registrarne i limiti
Seleziona gli indicatori in base all’ipotesi. Per un refactoring volto a isolare la logica, possono essere utili il numero di dipendenze necessarie per testarla, la presenza di test pertinenti ai comportamenti e il tempo che una persona del team impiega a individuare il punto da modificare. Per ridurre l’accoppiamento, si può osservare quanti componenti devono essere modificati per un’attività rappresentativa.
Non trasformare tempi o conteggi in verità universali: incidono la dimensione dell’attività, l’esperienza di chi la svolge e le interruzioni. Se li usi, registra queste condizioni e considera il risultato un segnale, non un confronto di produttività tra persone.
Documenta ogni indicatore con quattro informazioni: cosa misura, come si ottiene, quale risultato ci si aspettava e cosa non può dimostrare. Per esempio, il conteggio delle dipendenze può mostrare una riduzione, ma non prova che le nuove astrazioni siano facili da comprendere. La revisione tecnica deve verificarlo.
Confrontare prima e dopo con lo stesso metodo
Dopo il refactoring, ripeti l’analisi sullo stesso perimetro, con la stessa configurazione e, per quanto possibile, in condizioni equivalenti. Nella revisione, separa le modifiche funzionali da quelle strutturali. Se sono state apportate entrambe contemporaneamente, individua a quali modifiche si riferiscono le evidenze ed evita di attribuire l’intero risultato al refactoring.
Oltre alle metriche, prova una modifica reale o rappresentativa: correggere una regola, aggiungere una condizione di business o adattare un’integrazione. Verifica quali file è stato necessario modificare, quali test sono serviti e dove sono emersi dubbi. Non occorre creare un’attività artificiale se esiste già un lavoro comparabile; occorre però evitare di presentare un’impressione aneddotica come risultato conclusivo.
Un miglioramento coerente combina diversi segnali: per esempio, meno dipendenze per testare una regola, test più mirati e un percorso di modifica che il team sa spiegare. Se la complessità di un metodo diminuisce, ma la logica si disperde o il flusso diventa più difficile da seguire, il bilancio va riesaminato.
Integrare le misurazioni con la revisione e il feedback del team
La revisione tecnica deve verificare se le responsabilità sono più chiare, se i nomi riflettono il dominio e se le nuove interfacce rispondono a un’esigenza reale. Deve anche individuare i rischi introdotti: contratti duplicati, dipendenze invertite in modo poco chiaro, cambiamenti accidentali del comportamento o un nuovo livello che si limita a inoltrare le chiamate.
Il feedback del team fornisce evidenze sulla comprensione e sull’operatività. Chiedi se è più facile individuare la regola, scrivere un test o stimare il perimetro di una modifica. Collega le risposte a esempi concreti e registra i disaccordi: un’architettura può essere chiara per chi l’ha creata e opaca per chi mantiene il sistema.
In PHP, verifica inoltre che il refactoring rispetti i contratti esistenti: tipi, eccezioni, effetti collaterali, serializzazione e comportamento osservabile delle API. Un design interno più ordinato non compensa una regressione funzionale o un’incompatibilità imprevista.
Errori comuni nella misurazione della manutenibilità
- Inseguire la copertura: aumentare la percentuale può aggiungere test superficiali. Valuta se vengono testati i comportamenti e i casi di rischio, non solo se vengono eseguite le righe.
- Premiare meno righe: rendere il codice più compatto può nascondere decisioni e rendere più difficile rivedere le modifiche. La dimensione non è una misura diretta della chiarezza.
- Ottimizzare un punteggio: adattare il codice a uno strumento può lasciare irrisolto il problema di design. Esamina il significato della variazione e confermane l’effetto su un’attività reale.
- Confrontare perimetri diversi: mescolare nuovi file, codice escluso o regole modificate invalida l’analisi. Mantieni stabile il metodo o spiega le differenze.
- Ignorare il comportamento: un refactoring deve preservare il comportamento atteso, a meno che la modifica funzionale non sia definita e convalidata separatamente.
Breve modello per decidere come procedere

Al termine della valutazione, registra:
- Area e obiettivo: quale parte è stata sottoposta a refactoring e quale capacità di modifica si voleva migliorare.
- Baseline e metodo: revisione del codice, strumenti, configurazione, perimetro ed esclusioni.
- Segnali osservati: risultati prima e dopo, con i limiti di ogni indicatore.
- Convalida pratica: test, revisione tecnica ed evidenze relative a una modifica rappresentativa.
- Rischi residui: comportamenti non coperti, debito rinviato ed effetti operativi da verificare.
- Decisione: procedere se l’ipotesi è supportata e i rischi sono accettabili; adeguare il refactoring se i segnali sono contrastanti o c’è un problema di comprensione; fermarsi se il costo o il rischio supera il beneficio atteso.
La domanda finale non è se il codice abbia un punteggio migliore, ma se il team possa modificare quella parte con più chiarezza e controllo. Una baseline riproducibile, diversi segnali complementari e una revisione onesta consentono di prendere questa decisione senza confondere l’attività di refactoring con un miglioramento dimostrato.



