Als developer, wil ik code die ik vaker nodig heb één keer opschrijven in een functie, zodat ik een wijziging op één plek doe en een fout niet op drie plekken tegelijk zit.
Taak 1: Herhaling op meerdere plekken
Dezelfde code drie keer betekent drie mogelijke bugs. DRY-principe: Don't Repeat Yourself.
Dezelfde code op meerdere plekken
Je schrijft een script dat temperaturen valideert. Geldige waarde: 0–100 graden. Je schrijft deze check drie keer:
Wijzigen = veel werk. Stel bereik moet 10–95 zijn. Pas drie plekken aan.
Fouten worden mee gekopieerd. Typfout op plek 1 → door copy-paste staat hij ook op plek 2 en 3.
Inconsistentie groeit. Na maanden weet je niet meer: zijn alle kopieën gelijk?
😩 Drie kopieën (probleem)
if temp1 < 0 or temp1 > 100:
print("Ongeldig")
# ... code ...
if temp2 < 0 or temp2 > 100:
print("Ongeldig")
# ... code ...
if temp3 < 0 or temp3 > 100:
print("Ongeldig")
✨ Eén functie (oplossing)
def is_valid(t):
return 0 <= t <= 100
if not is_valid(temp1):
print("Ongeldig")
if not is_valid(temp2):
print("Ongeldig")
if not is_valid(temp3):
print("Ongeldig")
Interactieve demo
Hoeveel regels bespaar je? Typ op hoeveel plekken dezelfde code staat en druk op Enter:
besparing_calculator.py
Voer getal in tussen 2 en 10
$
Bijvoorbeeld: 3 betekent dezelfde code op 3 plekken
Vuistregel: Zie je dezelfde code meer dan eens? Maak er een functie van. Dit is het DRY-principe: Don't Repeat Yourself.
Waarom duplicatie slecht is — diepgang
Code-duplicatie is één van de meest voorkomende bronnen van bugs en onderhoudsproblemen. Hieronder zie je waarom, met voorbeelden uit de praktijk.
Scenario 1: Eenvoudige validatie herhaald
Je controleert sensoren op drie plekken:
cpu = 65
disk = 120
memory = 80
# Plek 1 — CPU-check
if cpu < 0 or cpu > 100:
print("CPU ongeldig")
# ... veel code ...
# Plek 2 — Disk-check (identieke logica)
if disk < 0 or disk > 100:
print("Disk ongeldig")
# ... veel code ...
# Plek 3 — Memory-check (identieke logica)
if memory < 0 or memory > 100:
print("Memory ongeldig")
Dezelfde check, drie keer. De waarde verschilt, maar de logica is identiek. Dit is het klassieke voorbeeld van "copy-paste code".
Scenario 2: String-validatie — een regel die niet past
# Plek 1 — gebruikersnaam controleren
username = "alice"
if len(username) < 3 or len(username) > 20 or not username.isalpha():
print("Gebruikersnaam ongeldig")
# ... 50 regels andere code ...
# Plek 2 — wachtwoord controleren (gekopieerd van plek 1)
password = "secret123"
if len(password) < 3 or len(password) > 20 or not password.isalpha():
print("Wachtwoord ongeldig") # ← wordt ALTIJD geprint bij een cijfer
De controle is overgenomen van de gebruikersnaam. Maar isalpha() eist dat er alleen
letters in staan. Voor een gebruikersnaam klopt dat, voor een wachtwoord niet: "secret123"
wordt afgekeurd. Bij kopiëren neem je regels mee die op de nieuwe plek niet kloppen.
Dezelfde formule drie keer. Makkelijk om `* 100` op één plek te vergeten, of een haakje fout te zetten.
Vier kritieke problemen met duplicatie
1. Wijzigingen vereisen meerdere edits
De minimale afstand moet van 0 naar 20 graden. Je moet drie plekken aanpassen:
if value < 20 or value > 100: # Plek 1 — aangepast naar 20
if value < 20 or value > 100: # Plek 2 — aangepast naar 20
if value < 0 or value > 100: # Plek 3 — VERGETEN! Nog steeds 0
Nu draait plek 3 nog steeds met oude logica. Dit wordt een onzichtbare bug — het script draait, maar gedraagt zich inconsistent.
2. Bugs vermenigvuldigen zich
Stel je maakt een typfout in het origineel:
if value < 0 or value > 1000: # TYPO: 1000 i.p.v. 100
print("Ongeldig")
Als je dit copy-paste naar alle kopieën, verspreidt dezelfde typfout zich naar alle drie plekken. Nu heb je drie bugs in plaats van één.
3. Lastig om te testen en debuggen
Stel validatie werkt niet. Je moet drie plekken checken om te zien welke kopie het probleem veroorzaakt. Is het plek 1? Plek 2? Plek 3? Zijn ze wel gelijk? Met tien kopieën zoek je je suf.
Met een functie test je het eenmalig. Eén fix, klaar.
4. Kost tijd en moeite — nu en straks
Copy-paste voelt snel, maar kost je uiteindelijk veel meer tijd:
Tijd om meerdere plekken te wijzigen
Tijd om bugs op te sporen (ze vertonen zich inconsistent)
Tijd om te onthouden: zijn alle kopieën gelijk?
Mentale overhead: je moet alle kopieën in je hoofd houden
Veelgemaakte fouten met duplicatie
Fout 1: Onvolledige copy-paste
# Origineel
if temp < 0 or temp > 100:
print("Temperatuur ongeldig")
# Copy naar plek 2 — maar halve kopie
if temp < 0: # FOUT: vergeten or temp > 100
print("Temperatuur ongeldig")
De kopie is onvolledig. Nu hebben twee "dezelfde" checks verschillende logica.
Fout 2: Variabele vergeten aan te passen
# Origineel
if cpu < 0 or cpu > 100:
print("CPU ongeldig")
# Copy naar disk-check — maar variabele vergeten
if cpu < 0 or cpu > 100: # FOUT! Checkt ALTIJD CPU, niet disk
print("Disk ongeldig")
Code is gekopieerd maar variabele niet aangepast. Nu checkt disk-validatie eigenlijk CPU. Dit soort bugs kunnen weken onopgemerkt blijven.
Fout 3: De melding klopt niet meer bij de controle
# Origineel
if disk > 90:
print(f"Schijf te vol: {disk}% (max: 90%)")
# Kopie — grens aangepast, melding niet
if memory > 80:
print(f"Geheugen te vol: {memory}% (max: 90%)") # FOUT: de grens is 80
De code werkt, maar de melding liegt. Wie de melding leest, denkt dat 85% nog mag.
Met één functie die de grens als waarde krijgt, staat de grens maar op één plek — ook in de melding.
Edge cases: wanneer is duplicatie OK?
Zeer kleine duplicatie (1-2 regels): Soms loont het niet om er een functie voor te maken. Functie-overhead kan groter zijn dan baat.
Maar: Zodra het groter wordt (>3 regels) of meer plekken (>2x) herhaald is, loont het zeker.
Hoe duplicatie herkennen?
Zoek naar "copy-paste"-patronen: code die lijkt op wat je net schreef
Kijk naar magic numbers (0, 100, 1000) die op meerdere plekken staan
Let op identieke if-conditions op verschillende plekken
Bedenk: "Als ik dit getal wil wijzigen, hoeveel plekken moeten dat doen?" Meer dan één = duplicatie!
Zoek naar lijnen die te veel op elkaar lijken — subtiele verschillen (variabele naam) met dezelfde structuur
Interactieve demo — dieper ingaan
Probeer verschillende aantallen kopieën. Hoe meer kopieën, hoe meer besparing, maar ook meer kans op bugs:
Wacht niet tot je 10 kopieën hebt. Pak het aan zodra je het patroon ziet. Je toekomstige ik zal je dankbaar zijn.
>_Probeer het voorbeeld
Drie servers, drie keer dezelfde controle. Draai het voorbeeld en kijk naar de uitvoer.
Probeer daarna: de grens moet van 90 naar 80. Op hoeveel plekken moet je iets
aanpassen? En wat gebeurt er als je er één vergeet?
Klik op de knop om de uitvoer van het voorbeeld te zien.
Opdracht: Duplicatie herkennen — en de fout erin vinden
Scenario: een collega heeft een script geschreven dat drie logbestanden controleert
(access.log, error.log, debug.log). De controle is twee keer gekopieerd. Het script draait zonder
foutmelding — toch zit er een fout in. Zet de code in log_check.py en draai hem.
access_log = ["GET /", "POST /api", "GET /home"]
error_log = ["Error 500", "Timeout", "Connection refused"]
debug_log = ["Debug: starting", "Debug: loaded config"]
# Validatie access.log
print("Check access_log...")
if not access_log:
print("Log is leeg")
elif len(access_log) > 1000:
print("Log is te lang")
else:
print("Access log OK")
# Validatie error.log
print("Check error_log...")
if not error_log:
print("Log is leeg")
elif len(error_log) > 1000:
print("Log is te lang")
else:
print("Error log OK")
# Validatie debug.log
print("Check debug_log...")
if not debug_log:
print("Log is leeg")
elif len(error_log) > 1000:
print("Log is te lang")
else:
print("Debug log OK")
Wat je moet doen: zet je antwoorden als commentaar bovenaan log_check.py.
Je hoeft de code nog niet te herschrijven — dat doe je in taak 2.
Acceptatiecriteria:
Je noemt welk blok op drie plekken terugkomt en hoeveel regels het telt
Je hebt de kopieerfout gevonden en legt uit waarom je hem niet aan de uitvoer ziet
Je hebt een manier bedacht om de fout zichtbaar te maken in de uitvoer (andere lijstinhoud of een andere grens), en die getest
Je noteert op hoeveel plekken je iets moet aanpassen als de grens van 1000 naar 30 gaat
Je geeft twee redenen waarom deze manier van werken fouten uitlokt
Extra: Getal-duplicatie
Scenario: hetzelfde getal (1000) staat op meerdere plekken in het script. Zo'n los getal
zonder naam heet een magic number. Ook dat is duplicatie: de betekenis van het getal staat nergens,
en bij een wijziging moet je alle plekken vinden.
Hints:
Een waarde die nooit verandert, geef je bovenaan een naam in HOOFDLETTERS
Kies een naam die zegt wat het getal betekent, niet welk getal het is
Na je aanpassing mag het getal nog maar op één plek in het script staan
Acceptatiecriteria:
Het getal 1000 staat nog maar één keer in het script, als constante met een duidelijke naam
De kopieerfout uit de opdracht is hersteld
Als je de constante op 2 zet, meldt het script bij access_log en error_log dat het log te lang is