Kopieer-plak in app-ontwikkeling — wat het is, waarom het gevaarlijk is en hoe je het kunt vermijden

Auteur: IT Sectr Gepubliceerd: 2026-07-27 Leestijd: 10 min

Kopieer-plak (copy-paste) — is de praktijk van het kopiëren van codefragmenten van de ene plaats naar de andere zonder aanpassing aan de nieuwe context. Meestal kopieert de ontwikkelaar een blok uit een bestaande module, brengt minimale wijzigingen aan en plakt het in de nieuwe — samen met bugs, verouderde opmerkingen en overbodige afhankelijkheden. Volgens TIOBE Code Quality Survey (2025) bevatten projecten met een hoog niveau van kopieer-plak drie keer meer defecten per duizend regels code dan projecten met een uniforme abstractie. Code duplicatie — de belangrijkste leverancier van technische schuld: elke kopie vereist apart onderhoud en het oplossen van een bug op één plek garandeert niet dat deze ook op andere plekken wordt opgelost.

Belangrijkste punten

  • Kopieer-plak — code kopiëren zonder begrip en aanpassing, de belangrijkste bron van technische schuld.
  • Gevaar van kopieer-plak: bugs vermenigvuldigen zich in het project, reparatie in één kopie repareert de andere niet.
  • DRY (Don't Repeat Yourself) — het belangrijkste principe dat het ontstaan van kopieer-plak voorkomt.
  • Hulpmiddelen voor het zoeken naar duplicaten: PMD CPD, SonarQube, ESLint met duplicatieregels.
  • Refactoring van kopieer-plak — het extraheren van gemeenschappelijke code naar een functie, klasse of bibliotheek.

Wat is kopieer-plak?

Kopieer-plak (copy-paste programming) — is het overbrengen van bestaande code naar een nieuwe plek met kleine wijzigingen of zonder wijzigingen. De term wordt in pejoratieve zin gebruikt: het suggereert dat de ontwikkelaar de oplossing niet ontwerpt, maar mechanisch een kant-en-klaar blok kopieert, vaak zonder volledig te begrijpen hoe het werkt.

Kopieer-plak komt in twee soorten voor: gerechtvaardigd (intentional) en toevallig (accidental). Gerechtvaardigd — wanneer de ontwikkelaar opzettelijk code kopieert met het plan voor latere refactoring (maar het plan wordt vaak niet uitgevoerd). Toevallig — wanneer duplicatie onopgemerkt ontstaat, bijvoorbeeld twee ontwikkelaars schrijven onafhankelijk dezelfde logica voor verschillende schermen.

Volgens het rapport SonarQube State of Clean Code (2025) vormt gedupliceerde code gemiddeld 12–18 procent van het totale codevolume in commerciële projecten. Tegelijkertijd zijn de kosten van het oplossen van een bug in gedupliceerde code 2,5 keer hoger dan in code met een uniforme implementatie, omdat de ontwikkelaar alle kopieën moet vinden en repareren.

Het belangrijkste hulpmiddel in de strijd tegen kopieer-plak is het principe DRY (Don't Repeat Yourself). Het absoluut stellen van DRY is echter ook gevaarlijk: soms is kopiëren gerechtvaardigd wanneer twee kopieën onafhankelijk van elkaar moeten evolueren. Het is belangrijk onderscheid te maken tussen “toevallige duplicatie” (die moet worden geëlimineerd) en “noodzakelijke duplicatie” (die moet worden gedocumenteerd).

Waarom kopieer-plak gevaarlijk is

Het eerste en belangrijkste gevaar — vermenigvuldiging van bugs. Als er in de broncode een defect zit, wordt dit samen met de code naar alle nieuwe plaatsen gekopieerd. Wanneer het defect wordt ontdekt en in de bronmodule wordt gerepareerd, blijven de kopieën ongerepareerd. De ontwikkelaar heeft misschien niet eens door dat de bug in vijf verschillende bestanden bestaat.

Het tweede gevaar — ongelijke evolutie. Twee kopieën van hetzelfde algoritme krijgen in de loop der tijd verschillende aanpassingen. In de ene kopie is validatie van randwaarden toegevoegd, in de andere — is het uitvoerformaat gewijzigd. Na een paar maanden wordt het onmogelijk te bepalen welke versie “correct” is en verliest het project consistentie in gedrag.

Het derde gevaar — toename van testvolume. Elke kopieer-plak vereist zijn eigen tests. Als de gemeenschappelijke logica in één functie wordt geëxtraheerd, kan deze met één testsuite worden gedekt en hergebruikt. Bij duplicatie moet elke kopie afzonderlijk worden getest — dit vermenigvuldigt de CI-doorlooptijd en de omvang van de te onderhouden testbasis.

Het vierde gevaar — illusie van productiviteit. Kopieer-plak creëert een vals gevoel van snelheid: de ontwikkelaar voegt snel code in en ziet dat het scherm werkt. Maar deze “snelheid” verandert in technische schuld die met rente moet worden terugbetaald wanneer er een bug wordt gevonden in het gedupliceerde blok of wanneer de bedrijfslogica moet worden gewijzigd.

Waarom ontwikkelaars code kopiëren

Inzicht in de oorzaken van kopieer-plak helpt bij het opzetten van de juiste preventie. Meestal kopiëren ontwikkelaars code niet uit luiheid, maar vanwege tijdsdruk, gebrek aan kennis of een onhandige architectuur.

De eerste reden — deadlines. Wanneer een scherm in twee dagen moet worden gemaakt en een vergelijkbaar scherm al bestaat, kopieert de ontwikkelaar het in zijn geheel en verandert alleen wat de gebruiker ziet. Voor refactoring met het extraheren van een gemeenschappelijke component is geen tijd — de klant verwacht een resultaat. Het gevolg is een tweede scherm met 80 procent gemeenschappelijke code, maar met een onafhankelijke wijzigingsgeschiedenis.

De tweede reden — gebrek aan uniforme abstractie. Als er in het project geen gemeenschappelijke component is voor een typische taak (bijvoorbeeld een lijstscherm met pull-to-refresh), zal elke ontwikkelaar zijn eigen implementatie schrijven of die van de buurman kopiëren. Architectuurbeslissingen die aan het begin van het project worden genomen, beïnvloeden direct de hoeveelheid toekomstige kopieer-plak.

De derde reden — angst om werkende code te breken. De ontwikkelaar weet dat de bestaande module werkt. Refactoring met het extraheren van gemeenschappelijke code kan de bestaande functionaliteit aantasten. Als de testdekking laag is, weegt het risico op breken zwaarder dan het waargenomen voordeel van refactoring, en kiest de ontwikkelaar voor de veilige weg — kopiëren.

Elimineer oorzaken, niet symptomen. Het verkorten van deadlines en het invoeren van code review zal het probleem niet oplossen als er in het project geen gemeenschappelijke architectuurbasis is. Investeer tijd in het creëren van herbruikbare componenten in een vroeg stadium — dit is de enige manier om de verleiding van kopieer-plak in de toekomst te verminderen.

Hulpmiddelen voor het detecteren van duplicaten

Het zoeken naar kopieer-plak wordt uitgevoerd door automatische analyzers die codefragmenten vergelijken en overeenkomsten boven een bepaalde drempel bepalen. De beste hulpmiddelen werken op AST-niveau (abstracte syntaxisboom) en negeren opmaak, variabelenamen en opmerkingen.

PMD CPD (Copy-Paste Detector) — het meest gebruikte hulpmiddel voor Java, Kotlin, Swift, JavaScript, Python en C++. CPD analyseert tokens van broncode en vindt duplicaten langer dan een ingesteld minimaal aantal tokens (standaard 100). Het instellen van de drempel is de sleutel tot een kwalitatief resultaat: een te lage drempel geeft veel vals-positieven (veelvoorkomende patronen zoals imports), een te hoge drempel mist echte duplicaten.

PMD CPD uitvoeren 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 integreert de duplicatendetector rechtstreeks in de Quality Gate. De regel Duplicated Blocks (%) toont het aandeel gedupliceerde code. Een drempel van 5 procent wordt als gezond beschouwd voor commerciële projecten. Overschrijding blokkeert promotie naar de releasetak. SonarQube groepeert duplicaten bovendien op type: exacte kopieën (exact match) en structurele kopieën (met gewijzigde namen).

Voor JavaScript en TypeScript worden duplicaten gezocht met ESLint en de plugin eslint-plugin-sonarjs (regel no-duplicate-string) en met het hulpmiddel jscpd, dat 150+ talen ondersteunt. jscpd is bijzonder handig voor monorepo's: het vindt duplicaten tussen pakketten, niet alleen binnen één module.

Refactoringstrategieën voor gedupliceerde code

Refactoring van kopieer-plak komt neer op één principe: extraheer wat gemeenschappelijk is en parametriseer de verschillen. De specifieke techniek hangt af van de omvang van de duplicatie en de context.

Het eenvoudigste geval — duplicatie binnen één klasse (bijvoorbeeld twee methoden met dezelfde logica maar verschillende typen). Oplossing — generaliseren via generieken of de methode hergebruiken met een typeparameter. Als de duplicatie meerdere klassen omvat — extraheer de gemeenschappelijke code naar een utility-klasse of extensiefunctie.

Een complexer geval — duplicatie op scherm- of moduleniveau. Hier helpt het simpelweg extraheren van een functie niet, omdat de UI-structuur, levenscycluslogica en databinding worden gedupliceerd. Oplossing — maak een gemeenschappelijke basisklasse voor het scherm of een samengestelde View-component en geef de verschillen door via parameters of protocol.

swift
// voor - twee kopieën van dezelfde UITableViewController
class UserListController: UITableViewController {
    private let viewModel = UserListViewModel()
    // 40 regels code
}

class ProductListController: UITableViewController {
    private let viewModel = ProductListViewModel()
    // dezelfde 40 regels maar met Product in plaats van User
}

// na - gedeelde basisklasse
class ListViewController<T: ListViewModel>: UITableViewController {
    let viewModel: T
    // 40 regels code - slechts één keer

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

Het meest complexe geval — duplicatie tussen microservices of bibliotheken. Het extraheren van gemeenschappelijke code kan leiden tot cyclische afhankelijkheden of ongewenste koppeling. In dergelijke gevallen kan kopieer-plak een bewuste beslissing zijn: twee teams onderhouden onafhankelijke diensten en een gedeelde bibliotheek veroorzaakt meer problemen dan het oplost. Het belangrijkste is om een dergelijke beslissing te documenteren en regelmatig te controleren of de kopieën niet zo ver uit elkaar zijn gegroeid dat het tijd is voor unificatie.

Preventie van kopieer-plak op teamniveau

Preventie van kopieer-plak is effectiever dan refactoring van reeds gedupliceerde code. De belangrijkste preventieve maatregelen liggen in de organisatie van het ontwikkelproces, niet in technologieën.

De eerste maatregel — code review met nadruk op duplicatie. De checklist van de review moet het punt bevatten: “Bevat deze PR code die al in het project bestaat?”. Als de reviewer kopieer-plak ziet, blokkeert hij de merge totdat de gemeenschappelijke component is geëxtraheerd. Deze vereiste moet worden vastgelegd in de Definition of Done van het team.

De tweede maatregel — gedeelde componentenbibliotheek. Elk UI-patroon dat op twee of meer schermen voorkomt, moet worden geëxtraheerd naar een gemeenschappelijke module. Maak een gedeelde module in het project en maak het een verplicht toegangspunt voor alle UI-componenten. Als een component niet bestaat — maak hem eerst aan, gebruik hem dan pas op het scherm.

De derde maatregel — automatisering in CI/CD. Voeg een stap toe aan de pipeline met het controleren van gedupliceerde code (PMD CPD, jscpd, SonarQube). Overschrijding van de drempel — buildfout. De ontwikkelaar kan geen PR mergen die het aandeel kopieer-plak boven het toegestane niveau verhoogt. Dit verlegt de verantwoordelijkheid van code review naar automatisering en garandeert dat geen enkel duplicaat wordt gemist.

Voer de cultuur in van “één implementatie — één plek”. Als u een mogelijkheid tot hergebruik ziet, stel refactoring dan niet uit. Elke kopieer-plak die “voor later” wordt bewaard, vermenigvuldigt zich en verandert in onbeheersbare technische schuld.

Veelgestelde vragen

Is kopieer-plak altijd slecht?

Nee, er zijn scenario's van bewuste duplicatie: verschillende microservices die onafhankelijk moeten evolueren; code gekopieerd voor een experiment met een verwijderplan; sjabloon-DTO's voor verschillende API-versies. Het belangrijkste is om de reden te documenteren en een verificatietermijn voor refactoring in te stellen.

Hoe onderscheid je kopieer-plak van gezond hergebruik?

Kopieer-plak — wanneer twee delen van de code hetzelfde doen maar geen gemeenschappelijke abstractie hebben. Gezond hergebruik — wanneer gemeenschappelijke code is geëxtraheerd naar een functie, klasse of module en de verschillen zijn geparametriseerd. Als het wijzigen van de logica correcties op drie of meer plaatsen vereist — is het kopieer-plak.

Welke hulpmiddelen zoeken naar kopieer-plak in iOS-projecten?

PMD CPD ondersteunt Swift en Objective-C. Voor Xcode zijn er plug-ins zoals SwiftCop en een ingebouwde duplicatendetector in AppCode. SonarQube analyseert ook Swift-projecten en toont gedupliceerde blokken rechtstreeks in de pull request.

Wat te doen als kopieer-plak al bestaat maar er geen tijd is voor refactoring?

Maak een technische taak aan voor refactoring van elke grote kopie. Stel prioriteiten: schermen die vaak veranderen — eerst, stabiele — daarna. Besteed voor elke nieuwe PR die gedupliceerde code aanraakt 15–20 procent van de tijd aan geleidelijke consolidatie.

Helpen AI-hulpmiddelen bij het detecteren van kopieer-plak?

Ja, moderne AI-assistenten (GitHub Copilot, Codeium) kunnen context analyseren en het extraheren van gemeenschappelijke code voorstellen bij het detecteren van repetitieve patronen. Ze vervangen echter geen automatische analyzers — gebruik Copilot voor preventie en CPD / SonarQube voor detectie.

Samenvatting

  • Kopieer-plak — codeduplicatie door kopiëren zonder aanpassing, de belangrijkste bron van technische schuld.
  • Vermenigvuldiging van bugs: reparatie in één kopie repareert andere niet, defecten verspreiden zich door het project.
  • Belangrijkste oorzaken: deadlines, gebrek aan gemeenschappelijke abstractie, angst om werkende code te breken bij refactoring.
  • Zoekhulpmiddelen: PMD CPD, SonarQube, jscpd, ESLint sonarjs/no-duplicate-string, SwiftCop.
  • Refactoring: extraheren van gemeenschappelijke code naar een functie, generieke klasse of gemeenschappelijke component met parametrisering van verschillen.
  • Preventie: code review met duplicatiecontrole, gedeelde componentenbibliotheek, duplicatiecontrole in CI.
  • Culturele regel: één implementatie — één plek. Bewuste duplicatie documenteren en termijnen bewaken.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook