Aikido

Beseitigung von Code-Duplizierung: Reduzierung technischer Schulden

Logischer Fehler

Regel
Beseitigen Sie Offensichtlich innerhalb einer Datei Duplikate.
Duplizierte Code Blöcke erhöhen Wartung
Aufwand und das Risiko von inkonsistenten Aktualisierungen.
Unterstützte Sprachen: 45+

Einführung

Kopierter Code in einer einzigen Datei verursacht Wartungsalpträume, die sich mit der Zeit häufen. Wenn dieselbe Logik an mehreren Stellen auftaucht, müssen Fehlerbehebungen und Funktionsaktualisierungen auf jedes Vorkommen angewendet werden. Die Entwickler übersehen unweigerlich eines der Duplikate, was zu einem inkonsistenten Verhalten führt, bei dem derselbe Vorgang unterschiedliche Ergebnisse liefert, je nachdem, welcher Codepfad ausgeführt wird. Diese Inkonsistenz ist schwer zu beheben, da die duplizierte Logik auf den ersten Blick identisch aussieht und die Unterschiede erst nach einem sorgfältigen Vergleich sichtbar werden.

Warum das wichtig ist

Fehlerfortpflanzung: Wenn ein Fehler in dupliziertem Code vorhanden ist, führt die Behebung an einer Stelle nicht dazu, dass er überall behoben wird. Die Entwickler beheben das erste Vorkommen, ohne zu bemerken, dass an anderer Stelle Kopien existieren und der Fehler unter anderen Bedingungen aktiv bleibt.

Wartungsaufwand: Jeder duplizierte Block verdoppelt die Wartungskosten. Eine Änderung der Logik erfordert das Auffinden und Aktualisieren jeder Kopie, und je größer die Dateien werden, desto schwieriger wird es, Duplikate zu finden.

Code-Beispiele

❌ Nicht konform:

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 };
    }
}

Warum ist das falsch: Die Validierungslogik und die Gesamtberechnung sind doppelt vorhanden. Wenn sich der Steuersatz ändert oder die Validierung erweitert werden muss, müssen beide Methoden aktualisiert werden. Ein Entwickler könnte die Steuerberechnung in einer Methode aktualisieren, aber die andere vergessen, was zu einer inkonsistenten Preisgestaltung führt.

✅ Konform:

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 };
    }
}

Warum das wichtig ist: Validierung, Berechnung und Steuerlogik sind in einzelnen Methoden zentralisiert. Wenn Sie den Steuersatz ändern, müssen Sie nur eine Methode ändern und nicht in der Datei nach Duplikaten suchen. Jede Hilfsmethode kann unabhängig getestet werden, und beide Auftragstypen erben automatisch alle Verbesserungen oder Fehlerbehebungen.

Schlussfolgerung

Duplizierung innerhalb einer Datei ist oft am einfachsten zu beheben und bietet sofortige Vorteile. Extrahieren Sie duplizierte Logik in Hilfsfunktionen oder -methoden, sobald Sie das Muster bemerken. Die Dreierregel besagt, dass es Zeit für ein Refactoring ist, sobald der Code dreimal vorkommt. Warten Sie nicht darauf, dass sich die Duplikation über die gesamte Datei ausbreitet, bevor Sie sich damit befassen.

FAQs

Haben Sie Fragen?

Wie viel Duplikation ist vor dem Refactoring akzeptabel?

Die Dreierregel ist ein guter Leitfaden: Sobald ein ähnlicher Code dreimal auftaucht, sollten Sie ihn herausnehmen. Seien Sie jedoch vorsichtig. Zwei komplexe duplizierte Blöcke könnten eine sofortige Extraktion rechtfertigen, drei einfache Variablendeklarationen hingegen nicht. Berücksichtigen Sie die Wahrscheinlichkeit von Änderungen und die Kosten von Inkonsistenzen. Sicherheitskritische Logik oder komplexe Geschäftsregeln sollten sofort dedupliziert werden.

Was ist, wenn der duplizierte Code kleine Abweichungen aufweist?

Parametrisieren Sie die Unterschiede. Wenn sich zwei Codeblöcke nur in den Variablenwerten unterscheiden, übergeben Sie diese als Parameter an eine gemeinsame Funktion. Wenn sich der logische Ablauf geringfügig unterscheidet, verwenden Sie Strategiemuster oder optionale Parameter mit sinnvollen Standardwerten. Manchmal ist eine Duplizierung mit klaren Unterschieden besser als eine komplexe Abstraktion, die die Absicht verschleiert, so dass ein Gleichgewicht zwischen DRY-Prinzipien und Lesbarkeit besteht.

Sollte ich Duplikate entfernen, auch wenn der Code dadurch länger wird?

Normalerweise ja. Eine Funktion mit einem beschreibenden Namen verdeutlicht die Absicht oft besser als duplizierter Inline-Code, auch wenn die Gesamtzahl der Zeilen steigt. Die Vorteile der Ein-Punkt-Wartung überwiegen die Bedenken hinsichtlich der Kürze. Wenn die Extraktion jedoch zu einer übermäßigen Umleitung führt, bei der man beim Lesen des Codes mehrere Funktionsaufrufe durchlaufen muss, sollte man überdenken, ob die Abstraktion angemessen ist.

Wie kann ich doppelten Code in großen Dateien erkennen?

Achten Sie auf Copy-Paste-Muster wie wiederholte if-Bedingungen, identische Schleifen oder ähnliche Funktionsstrukturen. Viele IDEs weisen auf strukturelle Duplikationen hin. Wenn Sie bei der Codeüberprüfung vertrauten Code sehen, während Sie eine Datei durchlesen, suchen Sie danach. Eine manuelle Inspektion ist oft am schnellsten, um Duplikationen innerhalb einer Datei zu finden. Beginnen Sie beim Refactoring mit den offensichtlichsten Duplikaten, die in der Datei nahe beieinander liegen.

Was ist mit doppeltem Code zur Fehlerbehandlung?

Extrahieren Sie die Fehlerbehandlung in wiederverwendbare Funktionen oder verwenden Sie Dekoratoren/Middleware-Muster. Wenn mehrere Funktionen dieselbe Try-Catch-Struktur mit identischer Fehlerprotokollierung und -transformation verwenden, ist das eine Doppelung, die es zu vermeiden gilt. Erstellen Sie Dienstprogramme für die Fehlerbehandlung, die Operationen mit konsistenter Protokollierung, Wiederholungen oder Fallback-Verhalten umhüllen, und verwenden Sie dann diese Dienstprogramme, anstatt die Fehlerbehandlungslogik zu wiederholen.

Lohnt es sich, Duplikate in veraltetem Code, den ich nicht aktiv ändere, zu refaktorisieren?

Wenden Sie die Pfadfinderregel an: Verlassen Sie den Code sauberer, als Sie ihn vorgefunden haben, aber refaktorisieren Sie keinen Code, den Sie nicht anfassen. Wenn Sie eine Funktion ändern und eine Duplizierung innerhalb derselben Datei feststellen, beheben Sie diese als Teil Ihrer Änderung. Erstellen Sie keine großen Refactoring-PRs für alten Code, es sei denn, technische Schulden blockieren neue Funktionen. Inkrementelle Verbesserungen während der normalen Entwicklung sind nachhaltiger.

Wie verhindere ich, dass es überhaupt zu Überschneidungen kommt?

Fragen Sie vor dem Einfügen von Code, ob Sie stattdessen eine Funktion extrahieren sollten. Weisen Sie bei der Codeüberprüfung auf doppelte Muster hin und fordern Sie die Extraktion. Legen Sie Teamkonventionen fest, die Duplikationen verhindern, wie z. B. die Forderung nach Hilfsfunktionen für Operationen, die mehr als zweimal wiederholt werden. Verwenden Sie Checklisten für die Codeüberprüfung, die speziell nach Duplikaten suchen. Vorbeugen ist einfacher als Abhilfe schaffen.

Starten Sie kostenlos

Sichern Sie Ihren Code, Cloud und die Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell  automatisch.

Keine Kreditkarte erforderlich | Scanergebnisse in 32 Sekunden.