Cos'è il refactoring del codice?
Cambiare la struttura interna del codice senza alterarne il comportamento osservabile, a piccoli passi, sotto test.
Il refactoring del codice è la pratica di cambiare la struttura interna di un programma senza modificarne il comportamento osservabile: stesso input, stesso output, ma codice più chiaro, più semplice da leggere e più economico da modificare in futuro. La definizione è di Martin Fowler, che nel libro Refactoring (1999, seconda edizione 2018) lo descrive come una serie di piccole trasformazioni, ciascuna quasi impercettibile, che sommate danno un cambiamento significativo. Correggere un bug esce dalla definizione: se il comportamento cambia, si tratta di una modifica funzionale. Riscrivere da zero è un'altra cosa ancora: il refactoring interviene sul codice esistente, un passo verificabile alla volta, mantenendo il sistema funzionante e rilasciabile per tutta la durata del lavoro. L'obiettivo dichiarato da Fowler è rendere il codice più facile da capire e più economico da cambiare, non renderlo "più elegante" in astratto: ogni trasformazione deve poter essere motivata da una modifica futura che diventa più semplice grazie a essa.
Leggi anche: Extreme Programming · Metodo di sviluppo software degli anni Novanta: pratiche tecniche come test scritti prima del codice e programmazione in coppia, per modifiche a basso costo.
Perché serve una rete di test prima di cominciare
Il refactoring funziona solo se esiste un modo rapido e affidabile per accorgersi che il comportamento è cambiato quando non doveva: senza quella rete, ogni trasformazione è una scommessa silenziosa. È per questo che Fowler lega a doppio filo il refactoring ai test automatici, in particolare con la base ampia della piramide dei test: i test unitari, veloci ed economici, sono quelli che si eseguono dopo ogni piccola modifica per confermare che nulla si è rotto. Refactoring senza test, nella pratica, assomiglia più a una riscrittura fatta a pezzi, con tutto il rischio di una riscrittura e nessuna delle garanzie del refactoring.
Come si ripaga il debito tecnico
Il refactoring è il meccanismo con cui il debito tecnico viene effettivamente ripagato, non solo nominato in una riunione: è il lavoro concreto di estinguere il capitale, mentre convivere con le scorciatoie senza mai intervenire equivale a pagarne solo gli interessi all'infinito. Su un sistema che sta perdendo terreno rispetto al proprio scopo, il refactoring mirato è spesso l'alternativa più economica alla sostituzione progressiva, riservata ai casi in cui la base di codice è compromessa oltre il punto in cui piccoli passi bastano; su un sistema legacy la prima domanda è sempre quale dei due si applica, perché scegliere quello sbagliato costa mesi.
L'AI cambia la velocità, non il principio
Gli assistenti di codice possono proporre e applicare trasformazioni di refactoring molto più rapidamente di un tempo, ma il principio resta lo stesso: nessuna trasformazione entra senza passare dai test, e il codice generato va comunque letto e capito da chi lo mantiene, non solo eseguito. Uno degli usi migliori dell'AI qui è proprio il rovescio del refactoring: individuare i segnali di codice generato senza revisione che diventeranno il prossimo debito da ripagare.
Un esempio concreto
Un'azienda di logistica ha un modulo di calcolo delle tariffe che nessuno vuole più toccare: una sola funzione lunga centinaia di righe, con le eccezioni per cliente aggiunte una sopra l'altra. Prima di aggiungere un nuovo listino, il team scrive test che fissano le tariffe attuali su un campione di spedizioni reali, poi estrae una regola alla volta in funzioni con un nome, rieseguendo i test dopo ogni passo. Le tariffe restano identiche, il nuovo listino diventa una funzione in più invece di un'altra eccezione.
Perché conta per chi decide
Per chi non scrive codice, il refactoring va messo a budget come manutenzione ricorrente, non come un progetto una tantum da approvare e chiudere: nella pratica descritta da Fowler è continuo e intrecciato al lavoro di feature, senza fasi separate che bloccano le consegne. Il segnale che serve intervenire si misura: stime che raddoppiano rispetto allo storico, rilasci sempre più rari, un modulo che il team evita di toccare.
Termini correlati
- Extreme Programming · Metodo di sviluppo software degli anni Novanta: pratiche tecniche come test scritti prima del codice e programmazione in coppia, per modifiche a basso costo.
- Piramide dei test · Modello che distribuisce lo sforzo di test su più test unitari, meno di integrazione, pochi end-to-end.
- Strangler fig pattern · Sostituire un sistema legacy per gradi, instradando il traffico verso il nuovo finché il vecchio non serve più.
- Sistema legacy · Un'applicazione ancora critica e difficile da cambiare: stack obsoleto, competenze rare, senza supporto del fornitore.
- AI code smell · I difetti ricorrenti del codice scritto da LLM e agenti: funziona alla demo, ma la manutenzione costa più del previsto.
Se ti ricorda un sistema che nessuno vuole più toccare, è quello che rimetto in ordine.
VEDI SOFTWARE RESCUE