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 3: Een eigen module importeren

Helpers in een eigen bestand zetten en er precies uithalen wat je nodig hebt.

Van één bestand naar twee

In taak 2 heb je je code opgesplitst in kleine helper-functies. Die staan nu nog allemaal in hetzelfde bestand als je hoofdscript. Zodra dat bestand groeit, loop je opnieuw vast:

# monitor.py — helpers en uitvoering door elkaar

def is_valid_temp(temperature):
    return 0 <= temperature <= 100

def format_reading(temperature):
    return f"Temperatuur: {temperature}°C (max: 100°C)"

# ... nog 8 helpers ...

readings = [45, 120, 80]
for temperature in readings:
    if is_valid_temp(temperature):
        print(format_reading(temperature))

Drie concrete problemen

  1. Niet herbruikbaar. Een tweede script dat is_valid_temp() nodig heeft, moet de functie kopiëren — precies de duplicatie uit US1.
  2. Niet los te testen. Je kunt de helpers niet aanroepen zonder dat het hele script gaat draaien.
  3. Onoverzichtelijk. Je scrolt langs tien definities voordat je ziet wat het script eigenlijk doet.

De oplossing: een eigen module

Elk .py-bestand in dezelfde map is een module die je kunt importeren. De bestandsnaam zonder .py is de modulenaam:

😩 Alles in monitor.py
# monitor.py
def is_valid_temp(temperature):
    return 0 <= temperature <= 100

def format_reading(temperature):
    return f"Temperatuur: {temperature}°C"

readings = [45, 120, 80]
for temperature in readings:
    ...

# 1 bestand, alles vermengd
✨ helpers.py + main.py
# helpers.py — alleen definities
def is_valid_temp(temperature):
    return 0 <= temperature <= 100

def format_reading(temperature):
    return f"Temperatuur: {temperature}°C"

# main.py — alleen uitvoering
from helpers import is_valid_temp
from helpers import format_reading

readings = [45, 120, 80]

De importregel ontleed

from helpers import is_valid_temp, format_reading
#    ^^^^^^^        ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^
#    bestandsnaam   welke namen je wilt gebruiken
#    zonder .py

# Daarna gebruik je ze alsof je ze hier zelf had geschreven:
print(format_reading(45))

Interactieve demo — wat draait er wanneer?

Kies welk bestand je start. Zet de schakelaar aan of uit om te zien wat if __name__ == "__main__": doet:

Import-simulator
Kies een bestand om te starten…
Vuistregel: in een module staan alleen definities (def en constanten). Alles wat écht iets doet, staat in je hoofdscript achter if __name__ == "__main__":.
>_ Probeer het voorbeeld

Hieronder staat main.py. De module helpers bestaat al en bevat load_readings(), is_valid_temp() en format_reading(). Het script gebruikt een functie die nog niet geïmporteerd is — draai het en los de fout op. Deze tester draait geen echte Python, maar controleert je importregels en rekent de uitvoer na.

Probeer daarna: haal de main-guard weg, of importeer een functie die niet bestaat.

Klik op de knop om de uitvoer te zien.

Opdracht: drone_helpers.py

Scenario: je vluchtscript uit taak 2 bevat inmiddels acht helper-functies en de opstartcode door elkaar. Je wilt de helpers in een eigen bestand zetten, zodat je hoofdscript alleen nog het vluchtplan uitvoert — en zodat je de helpers kunt testen zonder dat er een drone in de lucht komt.

Gegeven constanten:

VALID_DIRECTIONS = ["forward", "back", "left", "right", "up", "down"]
MIN_DISTANCE = 20
MAX_DISTANCE = 500

Je taak: splits je project in drone_helpers.py en main.py. Bepaal zelf welke functies waar horen en hoe je ze importeert.

Acceptatiecriteria:

  • drone_helpers.py bevat alleen definities en constanten — geen code die iets uitvoert
  • main.py importeert de helpers met from drone_helpers import ...
  • Alle uitvoercode in main.py staat achter if __name__ == "__main__":
  • Met de drone vliegt main.py het plan uit taak 2 precies zoals vóór het splitsen
  • import drone_helpers in een leeg bestand geeft geen enkele uitvoer