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 1: Alles in één bestand

Waarom grote scripts lastig worden en hoe je dit oplost.

Het probleem: alles in één bestand

Naarmate scripts groeien, worden ze lastig te hanteren. Alles op één hoop leidt tot problemen.

Monolithisch script — 200+ regels

# payroll.py — alles in één bestand

def load_employees():
    ...    # 20 regels: gegevens klaarzetten

def is_valid_email(email):
    ...    # 15 regels: controles

def calculate_salary(hours, rate):
    ...    # 15 regels: berekeningen

def format_payslip(name, salary):
    ...    # 30 regels: loonstrook opmaken

def send_notification(email, text):
    ...    # 25 regels: bericht versturen

# Hoofdlogica
employees = load_employees()
for employee in employees:
    if is_valid_email(employee["email"]):
        salary = calculate_salary(employee["hours"], employee["rate"])
        payslip = format_payslip(employee["name"], salary)
        send_notification(employee["email"], payslip)

Problemen die optreden

  • Moeilijk navigeren: 200 regels doorzoeken voor één functie
  • Testen lastig: wil je één functie testen? Hele script moet draaien
  • Herbruik moeilijk: moet je validate_email in ander script? Copy-paste...
  • Fouten in alles: bug in één plaats raakt potentieel alles

Interactieve demo — bestandsstructuur vergelijken

Keuze:
Klik op een structuur...
Inzicht: tot ongeveer 100–150 regels is één bestand goed te overzien. Daarboven zoek je steeds langer, en raakt een wijziging sneller iets wat je niet bedoelde.
>_ Probeer het voorbeeld

Een klein programma waarin helpers en uitvoercode nog in één bestand staan. Straks knip je dit op in modules; nu kijk je eerst wat er allemaal in zit.

Probeer daarna: zet een streep (# ----) tussen de delen die bij elkaar horen. Hoeveel onderwerpen tel je?

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

Opdracht: Het vliegscript opknippen

Scenario: een klasgenoot heeft een script geschreven dat de drone een vierkant laat vliegen. Het werkt, maar constanten, controles, vliegbewegingen en de opstartcode staan door elkaar in één bestand. Jij knipt het op, zodat de controles te gebruiken zijn zonder drone. Daarna vlieg je het vierkant opnieuw, om te bewijzen dat er niets kapot is gegaan.

Gegeven:

# square_flight.py — alles in één bestand
from djitellopy import Tello

MIN_BATTERY = 30
SIDE = 60

def battery_ok(battery):
    return battery >= MIN_BATTERY

def format_status(battery, height):
    return f"Accu: {battery}% (min: {MIN_BATTERY}%) | hoogte: {height} cm"

def fly_square(tello, side):
    for i in range(4):
        tello.move_forward(side)
        tello.rotate_clockwise(90)

tello = Tello()
tello.connect()
battery = tello.get_battery()
print(format_status(battery, tello.get_height()))

if battery_ok(battery):
    tello.takeoff()
    fly_square(tello, SIDE)
    print(format_status(tello.get_battery(), tello.get_height()))
    tello.land()
else:
    print("Niet opgestegen: accu te laag")

Je taak: verdeel dit script over vier bestanden: één voor de constanten, één voor de controles, één voor de vliegbewegingen en een hoofdscript. Bepaal zelf de bestandsnamen en welke functie waar hoort.

Acceptatiecriteria:

  • Elk bestand gaat over één onderwerp, en de naam van het bestand zegt welk
  • Het bestand met controles kun je importeren en gebruiken terwijl de drone uit staat
  • Elke constante staat maar op één plek en wordt geïmporteerd waar hij nodig is
  • Het hoofdscript bevat geen def, en importeert alleen wat het echt gebruikt
  • Met de drone vliegt het vierkant precies zoals vóór het opknippen, met de status ervoor en erna