Aikido

Come eliminare la duplicazione del codice: ridurre il debito tecnico

Bug logico

Regola
Elimina la duplicazione evidente all'interno dello stesso file.
I blocchi di codice duplicato aumentano l'onere
di manutenzione e il rischio di aggiornamenti incoerenti.
Linguaggi supportati: 45+

Introduzione

Il codice copiato e incollato all'interno di un singolo file crea problemi di manutenzione che si aggravano nel tempo. Quando la stessa logica compare in più punti, la correzione dei bug e l'aggiornamento delle funzionalità devono essere applicati a ogni singola occorrenza. È inevitabile che gli sviluppatori dimentichino uno dei duplicati, generando un comportamento incoerente in cui la stessa operazione produce risultati diversi a seconda del percorso di esecuzione del codice. Questa incoerenza è difficile da sottoporre a debug perché a prima vista la logica duplicata sembra identica e le differenze emergono solo dopo un'attenta analisi.

Perché è importante

Propagazione dei bug: Se è presente un bug nel codice duplicato, correggerlo in un punto non significa risolverlo ovunque. Gli sviluppatori spesso correggono la prima occorrenza senza rendersi conto che ne esistono copie altrove, lasciando il bug attivo in condizioni differenti.

Onere di manutenzione: Ciascun blocco duplicato raddoppia i costi di manutenzione. Modificare la logica richiede di individuare e aggiornare ogni copia e, man mano che i file crescono, il tracciamento dei duplicati diventa più complesso.

Esempi di codice

❌ Non conforme:

class OrderProcessor {
    async processStandardOrder(order) {
        if (!order.items || order.items.length === 0) {
            throw new Error('Order must have items');
        }
        const total = order.items.reduce((sum, item) => 
            sum + (item.price * item.quantity), 0);
        const tax = total * 0.08;
        const finalAmount = total + tax;
        return { total: finalAmount, tax };
    }
    
    async processExpressOrder(order) {
        if (!order.items || order.items.length === 0) {
            throw new Error('Order must have items');
        }
        const total = order.items.reduce((sum, item) => 
            sum + (item.price * item.quantity), 0);
        const tax = total * 0.08;
        const expressfee = 15.99;
        const finalAmount = total + tax + expressFee;
        return { total: finalAmount, tax, expressFee };
    }
}

Perché è errato: La logica di convalida e il calcolo del totale sono duplicati. Se l'aliquota fiscale cambia o la convalida richiede miglioramenti, entrambi i metodi devono essere aggiornati. Uno sviluppatore potrebbe aggiornare il calcolo delle tasse in un metodo dimenticandosi dell'altro, causando così prezzi incoerenti.

✅ Conforme:

class OrderProcessor {
    validateOrder(order) {
        if (!order.items || order.items.length === 0) {
            throw new Error('Order must have items');
        }
    }
    
    calculateSubtotal(items) {
        return items.reduce((sum, item) => 
            sum + (item.price * item.quantity), 0);
    }
    
    calculateTax(amount) {
        return amount * 0.08;
    }
    
    async processStandardOrder(order) {
        this.validateOrder(order);
        const subtotal = this.calculateSubtotal(order.items);
        const tax = this.calculateTax(subtotal);
        return { total: subtotal + tax, tax };
    }
    
    async processExpressOrder(order) {
        this.validateOrder(order);
        const subtotal = this.calculateSubtotal(order.items);
        const tax = this.calculateTax(subtotal);
        const expressFee = 15.99;
        return { total: subtotal + tax + expressFee, tax, expressFee };
    }
}

Perché questo è importante: La logica di convalida, calcolo e gestione delle tasse è centralizzata in singoli metodi. Modificare l'aliquota fiscale significa modificare un solo metodo, senza dover cercare duplicati in tutto il file. Ciascun metodo di supporto può essere testato indipendentemente e tutti i tipi di ordine ereditano automaticamente eventuali miglioramenti o correzioni di bug.

Conclusione

La duplicazione all'interno dello stesso file è spesso la più semplice da risolvere e offre vantaggi immediati. Estrai la logica duplicata in funzioni o metodi di supporto non appena noti il pattern. La regola del tre suggerisce che, quando un blocco di codice compare tre volte, è il momento di effettuare il refactoring. Non aspettare che la duplicazione si diffonda nell'intero file prima di intervenire.

FAQ

Hai domande?

Quanta duplicazione è accettabile prima di procedere al refactoring?

La regola del tre rappresenta un ottimo punto di riferimento: non appena del codice simile compare tre volte, è opportuno estrarlo. Tuttavia, usa il tuo giudizio. Due blocchi duplicati complessi potrebbero richiedere un'estrazione immediata, mentre tre semplici dichiarazioni di variabili potrebbero non averne bisogno. Valuta la probabilità di modifica e il costo dell'incongruenza. La logica critica per la sicurezza o le regole di business complesse dovrebbero essere deduplicate immediatamente.

Cosa fare se il codice duplicato presenta piccole variazioni?

Parametriza le differenze. Se due blocchi di codice differiscono solo per i valori delle variabili, passali come parametri a una funzione condivisa. Se il flusso della logica differisce leggermente, utilizza il pattern strategy o parametri opzionali con valori predefiniti sensati. A volte la duplicazione con differenze chiare è preferibile a un'astrazione complessa che oscura l'intento: bilancia quindi i principi DRY con la leggibilità.

‍

Dovrei estrarre la duplicazione anche se questo allunga il codice?

Di norma, sì. Una funzione con un nome descrittivo spesso chiarisce l'intento meglio del codice duplicato in-line, anche se il conteggio totale delle linee aumenta. I vantaggi della manutenzione in un unico punto superano le preoccupazioni legate alla brevità. Tuttavia, se l'estrazione crea un'indirezione eccessiva per cui la lettura del codice richiede di saltare attraverso più chiamate di funzione, valuta se l'astrazione sia realmente appropriata.

Come identificare il codice duplicato nei file di grandi dimensioni?

Cerca pattern di copia-incolla come condizioni if ripetute, cicli identici o strutture di funzione simili. Molti IDE evidenziano la duplicazione strutturale. Durante la code review, se noti del codice familiare mentre leggi un file, effettua una ricerca. L'ispezione manuale è spesso il metodo più rapido per la duplicazione interna a un file. Quando effettui il refactoring, parti dai duplicati più evidenti che compaiono a breve distanza l'uno dall'altro.

E per quanto riguarda il codice di gestione degli errori duplicato?

Estrai la gestione degli errori in funzioni riutilizzabili oppure utilizza pattern basati su decorator o middleware. Se più funzioni condividono la stessa struttura try-catch con logica di registrazione e trasformazione degli errori identica, si tratta di una duplicazione che vale la pena eliminare. Crea utility di gestione degli errori che racchiudano le operazioni con log di coerenza, tentativi di ripetizione (retry) o comportamenti di fallback, e usa queste utility anziché ripetere la logica di gestione degli errori.

Conviene fare il refactoring della duplicazione nel codice legacy che non sto modificando attivamente?

Applica la regola del boy scout: lascia il codice più pulito di come lo hai trovato, ma non fare refactoring del codice che non stai toccando. Se stai modificando una funzione e noti duplicazioni nello stesso file, correggile come parte della tua modifica. Evita di creare grandi PR di refactoring per il codice legacy a meno che il debito tecnico non stia bloccando nuove funzionalità. Un miglioramento incrementale durante il normale sviluppo è più sostenibile.

Come faccio a prevenire la duplicazione fin dall'inizio?

Prima di fare copia-incolla del codice, chiediti se non sia il caso di estrarre una funzione. Durante la code review, segnala i pattern duplicati e richiedi l'estrazione. Stabilisci convenzioni di team che scoraggino la duplicazione, ad esempio imponendo funzioni di supporto per operazioni ripetute più di due volte. Utilizza checklist per la revisione del codice che verifichino specificamente la presenza di duplicazioni. La prevenzione è più semplice della correzione.

Metti in sicurezza ora

Metti in sicurezza il tuo codice, il cloud e il runtime in un unico sistema centralizzato.
Trova e risolvi le vulnerabilità rapidamente e automaticamente.

Nessuna carta di credito richiesta | Risultati della scansione in 32 secondi.