0%

Van werkende code naar programmaontwerp · oefening

Wanneer gegevens en gedrag uiteenlopen

In de vorige les gebruikte de quiz check_answer om te bepalen of een ingevoerd antwoord goed was. De quiz moet overal hetzelfde oordeel geven. Stel daarom dat we een tweede mogelijkheid toevoegen: een bericht dat de cursist "Correct" of "Try again" vertelt.

Beide mogelijkheden moeten dezelfde vraag beantwoorden:

Komt dit ingevoerde antwoord overeen met het verwachte antwoord?

Het verwachte antwoord is opgeslagen in een vraagdictionary:

question = {
    "prompt": "Which keyword starts a function?",
    "answer": "def",
}

De controlefunctie accepteert spaties en verschillen in hoofdletters:

def is_correct(question, response):
    cleaned = response.strip().lower()
    expected = question["answer"].lower()
    return cleaned == expected

Zo tellen zowel "def" als " DEF " als goed.

Het probleem: een tweede functie gebruikt een andere controle

Stel dat de nieuwe berichtfunctie haar eigen vergelijking schrijft:

def result_message(question, response):
    if response == question["answer"]:
        return "Correct"
    return "Try again"

Deze vergelijking verwijdert geen spaties en negeert hoofdletters niet. De twee delen van dezelfde quiz zijn het nu oneens over " DEF ":

  • is_correct geeft True terug;

  • result_message geeft "Try again" terug.

Dat verschil is het probleem waar de titel van deze les op doelt.

  • Gegevens zijn de informatie die het programma bewaart, zoals de vraagtekst en het verwachte antwoord.

  • Gedrag is het werk dat het programma met die informatie uitvoert, zoals een ingevoerd antwoord controleren.

  • Het gedrag is uiteengelopen wanneer twee delen van het programma dezelfde regel verschillend implementeren.

Je hoeft die termen niet uit je hoofd te leren. De praktische les is eenvoudig: schrijf geen twee afzonderlijke versies van een regel als twee mogelijkheden dezelfde regel moeten volgen.

Hergebruik de ene controlefunctie

Elke mogelijkheid die het oordeel nodig heeft, kan is_correct aanroepen. Een puntenfunctie kan bijvoorbeeld de gedeelde controle hergebruiken:

def points_earned(question, response):
    if is_correct(question, response):
        return question["points"]
    return 0

De scoreberekening en de berichtfunctie kunnen nu dezelfde antwoordcontrole gebruiken. Als de vergelijkingsregel van de quiz later verandert, is er één plek om die bij te werken.

Waarom is is_correct aanroepen vanuit result_message beter dan de vergelijking herhalen?

De oefening voert precies dit herstel uit. Je leert geen nieuwe syntaxis. Je laat twee bekende functies hetzelfde oordeel geven door de gedeelde regel op één plek te houden.

Opdracht

Herstel result_message zodat de functie is_correct aanroept om het antwoord te controleren.

Herhaal de regel voor opschoning of vergelijking niet. De drie afgedrukte berichten moeten Correct, Correct en Try again zijn.