Aikido

Comment éliminer la duplication du code : réduire la dette technique

Bogue logique

Règle
Éliminer évidentes à l'intérieur d'un à l'intérieur d'un même fichier.
Le code code blocs augmentent la maintenance
maintenance et et le risque de incohérentes. incohérentes.
Langues prises en charge : 45+

Introduction

Le code copié-collé dans un seul fichier crée des cauchemars de maintenance qui s'aggravent avec le temps. Lorsque la même logique apparaît à plusieurs endroits, les corrections de bogues et les mises à jour de fonctionnalités doivent être appliquées à chaque occurrence. Les développeurs oublient inévitablement l'un des doublons, ce qui entraîne un comportement incohérent où la même opération produit des résultats différents selon le chemin de code exécuté. Cette incohérence est difficile à déboguer car la logique dupliquée semble identique à première vue, et les différences n'apparaissent qu'après une comparaison minutieuse.

Pourquoi c'est important

Propagation des bogues : Lorsqu'un bogue existe dans un code dupliqué, le fait de le corriger à un endroit ne le corrige pas partout. Les développeurs corrigent la première occurrence sans se rendre compte que des copies existent ailleurs, laissant le bogue actif dans d'autres conditions.

Charge de maintenance : Chaque bloc dupliqué double les coûts de maintenance. Pour modifier la logique, il faut trouver et mettre à jour chaque copie et, au fur et à mesure que les fichiers augmentent, il devient plus difficile de repérer les doublons.

Exemples de code

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

Pourquoi c'est faux : la logique de validation et le calcul du total sont dupliqués. Si le taux d'imposition change ou si la validation doit être améliorée, les deux méthodes doivent être mises à jour. Un développeur peut mettre à jour le calcul de la taxe dans une méthode mais oublier l'autre, ce qui entraîne des incohérences dans la tarification.

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

Pourquoi cela est-il important ? La validation, le calcul et la logique fiscale sont centralisés dans des méthodes uniques. Modifier le taux d'imposition revient à modifier une seule méthode, et non à rechercher des doublons dans le fichier. Chaque méthode d'aide peut être testée indépendamment, et les deux types de commandes héritent automatiquement de toutes les améliorations ou corrections de bogues.

Conclusion

La duplication à l'intérieur d'un fichier est souvent la plus facile à corriger et offre des avantages immédiats. Extrayez la logique dupliquée dans des fonctions ou des méthodes d'aide dès que vous remarquez le schéma. La règle des trois suggère qu'une fois que le code apparaît trois fois, il est temps de le remanier. N'attendez pas que la duplication s'étende à l'ensemble du fichier pour vous en occuper.

FAQ

Vous avez des questions ?

Quel est le degré de duplication acceptable avant de procéder à un remaniement ?

La règle des trois est une bonne ligne directrice : lorsqu'un code similaire apparaît trois fois, il faut l'extraire. Toutefois, il faut faire preuve de discernement. Deux blocs complexes dupliqués peuvent justifier une extraction immédiate, alors que trois simples déclarations de variables peuvent ne pas l'être. Tenez compte de la probabilité de changement et du coût de l'incohérence. La logique essentielle à la sécurité ou les règles commerciales complexes doivent être dédupliquées immédiatement.

Que se passe-t-il si le code dupliqué comporte de petites variations ?

Paramétrer les différences. Si deux blocs de code ne diffèrent que par les valeurs des variables, passez-les en tant que paramètres à une fonction partagée. Si le flux logique diffère légèrement, utilisez un modèle de stratégie ou des paramètres facultatifs avec des valeurs par défaut raisonnables. Parfois, la duplication avec des différences claires est préférable à une abstraction complexe qui obscurcit l'intention, il faut donc trouver un équilibre entre les principes DRY et la lisibilité.

Dois-je extraire les doublons même si cela rallonge le code ?

En général, oui. Une fonction avec un nom descriptif clarifie souvent mieux l'intention qu'un code dupliqué en ligne, même si le nombre total de lignes augmente. Les avantages de la maintenance en un seul point l'emportent sur les problèmes de brièveté. Toutefois, si l'extraction crée une indirection excessive où la lecture du code nécessite de passer par de multiples appels de fonction, il convient de reconsidérer l'opportunité de l'abstraction.

Comment identifier le code dupliqué dans des fichiers volumineux ?

Recherchez des modèles de copier-coller tels que des conditions "if" répétées, des boucles identiques ou des structures de fonction similaires. De nombreux IDE mettent en évidence la duplication structurelle. Lors de l'examen du code, si vous voyez un code familier en lisant un fichier, recherchez-le. L'inspection manuelle est souvent la plus rapide pour détecter les duplications à l'intérieur d'un même fichier. Lors du remaniement, commencez par les doublons les plus évidents qui apparaissent à proximité les uns des autres dans le fichier.

Qu'en est-il de la duplication du code de gestion des erreurs ?

Extraire la gestion des erreurs dans des fonctions réutilisables ou utiliser des décorateurs/modèles intermédiaires. Si plusieurs fonctions partagent la même structure try-catch avec une journalisation et une transformation des erreurs identiques, il s'agit d'une duplication qui mérite d'être éliminée. Créez des utilitaires de gestion des erreurs qui enveloppent les opérations avec une journalisation cohérente, des tentatives ou un comportement de repli, puis utilisez ces utilitaires au lieu de répéter la logique de gestion des erreurs.

Cela vaut-il la peine de refactoriser la duplication dans un code existant que je ne modifie pas activement ?

Appliquez la règle du boy-scout : laissez le code plus propre que vous ne l'avez trouvé, mais ne remaniez pas le code que vous ne touchez pas. Si vous modifiez une fonction et que vous remarquez une duplication dans le même fichier, corrigez-la dans le cadre de votre changement. Ne créez pas de PRs de refactoring importants pour le code existant à moins que la dette technique ne bloque les nouvelles fonctionnalités. L'amélioration progressive au cours du développement normal est plus durable.

Comment éviter les doublons ?

Avant de copier-coller du code, demandez si vous ne devriez pas plutôt extraire une fonction. Lors de l'examen du code, signalez les modèles dupliqués et demandez l'extraction. Établissez des conventions d'équipe qui découragent la duplication, par exemple en exigeant des fonctions d'aide pour les opérations répétées plus de deux fois. Utiliser des listes de contrôle pour la révision du code qui recherchent spécifiquement les doublons. La prévention est plus facile que la correction.

Obtenir la sécurité gratuitement

Sécurisez votre code, votre cloud et votre environnement d'exécution dans un système central.
Trouvez et corrigez rapidement et automatiquement les vulnérabilités.

Aucune carte de crédit n'est requise | Scanner les résultats en 32sec.