Sprint 5 · Functies & scope  ·  US3: Drone-helpers

Als developer van het vliegscript, wil ik mijn dronecode opdelen in kleine helpers in een eigen module, zodat mijn hoofdscript kort en leesbaar blijft en ik de helpers kan testen zonder dat de drone opstijgt.

Taak 2: Eén functie, één verantwoordelijkheid

Elke helper-functie krijgt één duidelijke taak en een naam die die taak beschrijft.

Het probleem: functies die alles doen

Functies die meerdere dingen tegelijk doen zijn lastig om te testen en aan te passen. Een goede helper-functie doet precies één ding: één berekening, één actie, of één controle.

Voorbeeld: alles door elkaar

def process_data(records):
    valid = []
    for r in records:
        # validatie
        if r["age"] > 0:
            # transformatie
            r["age_group"] = "volwassen" if r["age"] > 18 else "jong"
            # logging
            print(f"OK: {r['name']}")
            valid.append(r)
    return valid

Problemen

  • Lastig testen: wil je de validatie testen? Heel script moet draaien en printen.
  • Lastig wijzigen: verander de output-regel, en je breekt misschien de logica.
  • Lastig herbruiken: je kan de validatie niet in een ander script gebruiken.

Oplossing: split in helpers

def is_valid_age(age):
    return age > 0

def get_age_group(age):
    return "volwassen" if age > 18 else "jong"

def log_valid_record(name):
    print(f"OK: {name}")

def process_data(records):
    valid = []
    for r in records:
        if is_valid_age(r["age"]):
            r["age_group"] = get_age_group(r["age"])
            log_valid_record(r["name"])
            valid.append(r)
    return valid

Interactieve demo

Klik op een knop...
Vuistregel: Als je de functie moet uitleggen met "en ook", heb je er twee nodig. "Dit functie laadt data en controleert het" → splits in twee.
>_ Probeer het voorbeeld

Drie helpers die elk precies één ding doen: controleren, berekenen en tonen. Deze tester draait geen echte Python, maar rekent de uitvoer na op basis van de getallen en letters in je code.

Probeer: voeg een vierde student toe, verander de grenzen (90 → 85, 80 → 75), of schrijf een helper is_pass(grade) die True geeft bij A en B en roep hem aan.

Klik op de knop om de uitvoer van het voorbeeld te zien.

Opdracht: Een vluchtplan met helpers vliegen

Scenario: de drone krijgt een vluchtplan als lijst van stappen. Niet elke stap is bruikbaar: er staat een richting in die niet bestaat, en een stap die binnen te ver gaat. Jouw script vliegt de goede stappen en slaat de foute over — met een melding waarom. Dat bouw je niet als één grote lus vol if's, maar met kleine helpers die elk één ding doen.

Gegeven:

VALID_DIRECTIONS = ["forward", "back", "left", "right", "up", "down"]
MIN_DISTANCE = 20     # cm, kleiner kan de drone niet
MAX_DISTANCE = 200    # cm, binnen niet verder per stap

flight_plan = [
    {"direction": "forward", "distance": 100},
    {"direction": "left", "distance": 50},
    {"direction": "sideways", "distance": 50},
    {"direction": "back", "distance": 100},
    {"direction": "right", "distance": 250},
    {"direction": "right", "distance": 50},
]

Je taak: schrijf minstens vier helpers: één die een stap controleert, één die bij een richting de juiste drone-beweging opzoekt, één die een stap vliegt, en één die een logregel maakt. Het hoofdscript gebruikt ze om het plan te vliegen.

Acceptatiecriteria:

  • Elke helper doet één ding, en zijn naam zegt wat (controleren, opzoeken, vliegen, opmaken)
  • De controle-helper geeft terug óf een stap mag én waarom niet — en gebruikt daarvoor geen drone
  • De beweging wordt opgezocht in een dictionary met drone-methodes, niet met een if/elif-keten over richtingen
  • Met de drone: de vier geldige stappen worden gevlogen, de twee foute overgeslagen met een melding met waarde en grens
  • De drone landt altijd, ook als een commando halverwege een fout geeft