Copypaste dans le développement d'applications — ce que c'est, pourquoi c'est dangereux et comment l'éviter

Auteur : IT Sectr Publié le : 2026-07-27 Temps de lecture : 10 min

Le copypaste (copier-coller) est la pratique qui consiste à copier des fragments de code d'un endroit à un autre sans les adapter au nouveau contexte. Le plus souvent, le développeur copie un bloc d'un module existant, apporte des modifications minimes et le colle dans un nouveau — avec les bogues, les commentaires obsolètes et les dépendances superflues. Selon la TIOBE Code Quality Survey (2025), les projets avec un niveau élevé de copypaste contiennent trois fois plus de défauts pour mille lignes de code que les projets avec une abstraction unifiée. La duplication de code est la principale source de dette technique : chaque copie nécessite une maintenance séparée, et corriger un bogue à un endroit ne garantit pas sa correction ailleurs.

Points essentiels

  • Copypaste — copier du code sans compréhension ni adaptation, principale source de dette technique.
  • Danger du copypaste : les bogues se multiplient dans tout le projet, corriger une copie ne corrige pas les autres.
  • DRY (Don't Repeat Yourself) — le principe fondamental qui empêche le copypaste.
  • Outils de détection : PMD CPD, SonarQube, ESLint avec des règles de duplication.
  • Refactorisation du copypaste — extraire le code commun dans une fonction, une classe ou une bibliothèque.

Qu'est-ce que le copypaste ?

Copypaste (programmation par copier-coller) consiste à déplacer du code existant vers un nouvel endroit avec peu ou pas de modifications. Le terme est utilisé de manière péjorative : il implique que le développeur ne conçoit pas une solution, mais copie mécaniquement un bloc tout fait, souvent sans comprendre complètement son fonctionnement.

Le copypaste est de deux types : intentionnel et accidentel. Intentionnel — quand un développeur copie délibérément du code avec l'intention de le refactoriser plus tard (mais le plan est souvent abandonné). Accidentel — quand la duplication survient sans être remarquée, par exemple, deux développeurs écrivent indépendamment la même logique pour des écrans différents.

Selon le rapport SonarQube State of Clean Code (2025), le code dupliqué représente en moyenne 12 à 18 pour cent du volume total de code dans les projets commerciaux. Parallèlement, le coût de correction d'un bogue dans du code dupliqué est 2,5 fois plus élevé que dans du code à implémentation unique, car le développeur doit trouver et corriger toutes les copies.

L'outil principal contre le copypaste est le principe DRY (Don't Repeat Yourself). Cependant, absolutiser le DRY est aussi dangereux : parfois copier est justifié lorsque deux copies doivent évoluer indépendamment l'une de l'autre. Il est important de distinguer la « duplication accidentelle » (qui doit être éliminée) de la « duplication nécessaire » (qui doit être documentée).

Pourquoi le copypaste est dangereux

Le premier danger, le plus critique, est la propagation des bogues. Si le code d'origine a un défaut, il est copié partout avec le code. Lorsque le défaut est découvert et corrigé dans le module d'origine, les copies restent non corrigées. Le développeur peut même ignorer que le bogue existe dans cinq fichiers différents.

Le deuxième danger est l'évolution inégale. Deux copies du même algorithme accumulent des modifications différentes au fil du temps. Une copie ajoute une validation des valeurs limites, une autre modifie le format de sortie. Après quelques mois, il devient impossible de savoir quelle version est la « bonne », et le projet perd sa cohérence comportementale.

Le troisième danger est l'augmentation du volume de tests. Chaque instance de copypaste nécessite ses propres tests. Si la logique commune est extraite dans une seule fonction, elle peut être couverte par un ensemble de tests et réutilisée. Avec la duplication, chaque copie doit être testée séparément — cela multiplie le temps d'exécution de l'IC et la taille de la base de tests à maintenir.

Le quatrième danger est l'illusion de productivité. Le copypaste crée une fausse impression de vitesse : le développeur colle rapidement le code et voit que l'écran fonctionne. Mais cette « vitesse » se transforme en dette technique qui devra être remboursée avec intérêts lorsqu'un bogue sera trouvé dans le bloc dupliqué ou qu'un changement de logique métier sera nécessaire.

Pourquoi les développeurs copient du code

Comprendre les raisons du copypaste aide à établir une prévention appropriée. La plupart du temps, les développeurs copient du code non par paresse, mais à cause de la pression des délais, du manque de connaissances ou d'une architecture inadaptée.

La première raison est les délais serrés. Lorsqu'un écran doit être créé en deux jours et qu'un écran similaire existe déjà, le développeur le copie entièrement et ne modifie que ce que l'utilisateur voit. Il n'y a pas de temps pour refactoriser et extraire un composant partagé — le client exige des résultats. En conséquence, un deuxième écran apparaît avec 80 pour cent de code partagé mais un historique de modifications indépendant.

La deuxième raison est l'absence d'abstraction unifiée. Si le projet ne dispose pas d'un composant partagé pour une tâche typique (par exemple, un écran de liste avec pull-to-refresh), chaque développeur écrira sa propre implémentation ou copiera celle du voisin. Les décisions architecturales prises au début du projet influencent directement la quantité de copypaste futur.

La troisième raison est la peur de casser du code qui fonctionne. Le développeur sait que le module existant fonctionne. Refactoriser pour extraire du code partagé peut affecter les fonctionnalités existantes. Si la couverture de tests est faible, le risque de casse dépasse le bénéfice perçu de la refactorisation, et le développeur choisit la voie sûre — copier.

Traitez les causes, pas les symptômes. Réduire les délais et introduire la revue de code ne résoudra pas le problème si le projet manque d'une base architecturale solide. Investissez du temps dans la création de composants réutilisables dès les premières étapes — c'est le seul moyen de réduire la tentation du copypaste à l'avenir.

Outils de détection des doublons

La détection du copypaste est effectuée par des analyseurs automatiques qui comparent des fragments de code et identifient les correspondances au-dessus d'un seuil donné. Les meilleurs outils fonctionnent au niveau AST (Arbre de Syntaxe Abstraite) et ignorent le formatage, les noms de variables et les commentaires.

PMD CPD (Copy-Paste Detector) est l'outil le plus courant pour Java, Kotlin, Swift, JavaScript, Python et C++. CPD analyse les tokens du code source et trouve les doublons plus longs qu'un nombre minimum de tokens spécifié (par défaut 100). Configurer le seuil est essentiel pour des résultats de qualité : un seuil trop bas génère de nombreux faux positifs (schémas courants comme les imports), un seuil trop haut laisse passer de vrais doublons.

Exécuter PMD CPD via Gradle

groovy
plugins {
    id 'pmd'
}

pmd {
    toolVersion = '7.0.0'
    ruleSetFiles = files("pmd-rules.xml")
}

tasks.register('cpd') {
    doLast {
        exec {
            workingDir = projectDir
            commandLine 'cpd',
                '--minimum-tokens', '75',
                '--language', 'kotlin',
                '--files', 'src/main/kotlin',
                '--format', 'xml',
                '--failOnViolation', 'true'
        }
    }
}

SonarQube intègre un détecteur de doublons directement dans le Quality Gate. La règle Duplicated Blocks (%) affiche le pourcentage de code dupliqué. Un seuil de 5 pour cent est considéré comme sain pour les projets commerciaux. Le dépasser bloque la promotion vers la branche de release. SonarQube regroupe également les doublons par type : correspondances exactes et copies structurelles (avec des identifiants renommés).

Pour JavaScript et TypeScript, les doublons sont détectés avec ESLint utilisant le plugin eslint-plugin-sonarjs (règle no-duplicate-string) et l'utilitaire jscpd, qui prend en charge plus de 150 langages. jscpd est particulièrement pratique pour les monorepos : il trouve des doublons entre les paquets, pas seulement à l'intérieur d'un seul module.

Stratégies de refactorisation du code dupliqué

La refactorisation du copypaste se résume à un principe : extraire la partie commune et paramétrer les différences. La technique spécifique dépend de l'étendue de la duplication et du contexte.

Le cas le plus simple est la duplication au sein d'une même classe (par exemple, deux méthodes avec la même logique mais des types différents). La solution est de généraliser avec des génériques ou de réutiliser une méthode avec un paramètre de type. Si la duplication couvre plusieurs classes — extrayez le code commun dans une classe utilitaire ou une fonction d'extension.

Un cas plus complexe est la duplication au niveau de l'écran ou du module. Ici, le simple fait d'extraire une fonction n'aide pas, car la structure de l'interface utilisateur, la logique du cycle de vie et la liaison de données sont toutes dupliquées. La solution est de créer une classe de base d'écran commune ou un composant de vue composite, et de passer les différences via des paramètres ou un protocole.

swift
// before - two copies of the same UITableViewController
class UserListController: UITableViewController {
    private let viewModel = UserListViewModel()
    // 40 lines of code
}

class ProductListController: UITableViewController {
    private let viewModel = ProductListViewModel()
    // same 40 lines but with Product instead of User
}

// after - generic base class shared
class ListViewController<T: ListViewModel>: UITableViewController {
    let viewModel: T
    // 40 lines of code - once only

    init(viewModel: T) {
        self.viewModel = viewModel
        super.init(style: .plain)
    }
}

Le cas le plus complexe est la duplication entre microservices ou bibliothèques. Extraire du code partagé peut entraîner des dépendances circulaires ou un couplage injustifié. Dans de tels cas, le copypaste peut être une décision consciente : deux équipes maintiennent des services indépendants, et une bibliothèque partagée crée plus de problèmes qu'elle n'en résout. L'essentiel est de documenter cette décision et de vérifier régulièrement si les copies ont suffisamment divergé pour justifier une unification.

Prévention du copypaste au niveau de l'équipe

Prévenir le copypaste est plus efficace que refactoriser du code déjà dupliqué. Les principales mesures préventives résident dans l'organisation du processus de développement, pas dans la technologie.

La première mesure est la revue de code axée sur la duplication. La liste de contrôle de la revue doit inclure l'élément : « Ce PR contient-il du code qui existe déjà dans le projet ? » Si le relecteur voit du copypaste — il bloque la fusion jusqu'à ce que le composant partagé soit extrait. Cette exigence doit faire partie de la Définition de Fini de l'équipe.

La deuxième mesure est une bibliothèque de composants partagée. Chaque motif d'interface utilisateur qui apparaît sur deux écrans ou plus doit être extrait dans un module commun. Créez un module partagé dans le projet et faites-en le point d'entrée obligatoire pour tous les composants d'interface. Si un composant n'existe pas — il est d'abord créé, puis utilisé sur l'écran.

La troisième mesure est l'automatisation dans CI/CD. Ajoutez une étape de vérification de code dupliqué au pipeline (PMD CPD, jscpd, SonarQube). Le dépassement du seuil entraîne un échec de construction. Le développeur ne peut pas fusionner un PR qui augmente le ratio de copypaste au-dessus du niveau autorisé. Cela déplace la responsabilité de la revue de code vers l'automatisation et garantit qu'aucun doublon ne passe inaperçu.

Favorisez une culture de « une implémentation — un endroit. » Si vous voyez une opportunité de réutilisation — ne remettez pas la refactorisation à plus tard. Chaque copypaste laissé « pour plus tard » se multiplie et se transforme en dette technique ingérable.

Questions fréquentes

Le copypaste est-il toujours mauvais ?

Non, il existe des scénarios de duplication consciente : différents microservices qui doivent évoluer indépendamment ; du code copié pour une expérience avec un plan de suppression ; des DTO modèles pour différentes versions d'API. L'essentiel est de documenter la raison et de fixer un délai de vérification pour la refactorisation.

Comment distinguer le copypaste de la réutilisation saine ?

Le copypaste, c'est quand deux parties de code font la même chose mais n'ont pas d'abstraction commune. La réutilisation saine, c'est quand le code commun est extrait dans une fonction, une classe ou un module, et que les différences sont paramétrées. Si un changement de logique nécessite des modifications à trois endroits ou plus — c'est du copypaste.

Quels outils détectent le copypaste dans les projets iOS ?

PMD CPD prend en charge Swift et Objective-C. Pour Xcode, il existe des plugins comme SwiftCop et un détecteur de doublons intégré dans AppCode. SonarQube analyse également les projets Swift, montrant les blocs dupliqués directement dans les pull requests.

Que faire si le copypaste existe déjà et qu'il n'y a pas de temps pour refactoriser ?

Créez un ticket technique pour la refactorisation de chaque copie importante. Définissez des priorités : les écrans qui changent fréquemment en premier, les stables ensuite. Pour chaque nouveau PR qui touche du code dupliqué, consacrez 15 à 20 pour cent du temps à la consolidation progressive.

Les outils d'IA aident-ils à détecter le copypaste ?

Oui, les assistants IA modernes (GitHub Copilot, Codeium) peuvent analyser le contexte et suggérer l'extraction de code partagé lorsqu'ils détectent des motifs répétés. Cependant, ils ne remplacent pas les analyseurs automatiques — utilisez Copilot pour la prévention et CPD / SonarQube pour la détection.

Résumé

  • Copypaste — dupliquer du code en copiant sans adaptation, principale source de dette technique.
  • Propagation des bogues : corriger une copie ne corrige pas les autres, les défauts se propagent dans le projet.
  • Causes principales : délais serrés, absence d'abstraction partagée, peur de casser du code fonctionnel lors de la refactorisation.
  • Outils de détection : PMD CPD, SonarQube, jscpd, ESLint sonarjs/no-duplicate-string, SwiftCop.
  • Refactorisation : extraire le code commun dans une fonction, une classe générique ou un composant partagé avec paramétrage des différences.
  • Prévention : revue de code avec vérification de la duplication, bibliothèque de composants partagée, vérification CI des doublons.
  • Règle culturelle : une implémentation — un endroit. Documenter la duplication consciente et la surveiller régulièrement.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi