0%

Vom funktionierenden Code zum Programmentwurf · Übung

Wenn Daten und Verhalten auseinanderdriften

In der vorigen Lektion entschied das Quiz mit check_answer, ob eine eingegebene Antwort richtig war. Das Quiz sollte überall zum selben Ergebnis kommen. Stell dir deshalb vor, wir ergänzen eine zweite Funktionalität: eine Meldung, die der lernenden Person "Correct" oder "Try again" anzeigt.

Beide Funktionalitäten müssen dieselbe Frage beantworten:

Stimmt diese eingegebene Antwort mit der erwarteten Antwort überein?

Die erwartete Antwort ist in einem Frage-Dictionary gespeichert:

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

Die Prüffunktion akzeptiert Leerzeichen und Unterschiede in der Groß- und Kleinschreibung:

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

Zum Beispiel zählen sowohl "def" als auch " DEF " als richtig.

Das Problem: Eine zweite Funktion prüft anders

Angenommen, die neue Meldungsfunktion schreibt ihren eigenen Vergleich:

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

Dieser Vergleich entfernt keine Leerzeichen und berücksichtigt die Groß- und Kleinschreibung. Die beiden Teile desselben Quiz beurteilen " DEF " jetzt unterschiedlich:

  • is_correct gibt True zurück;

  • result_message gibt "Try again" zurück.

Diese Abweichung ist das Problem, das der Titel dieser Lektion benennt.

  • Daten sind die vom Programm gespeicherten Informationen, etwa der Fragetext und die erwartete Antwort.

  • Verhalten ist die Arbeit, die das Programm mit diesen Informationen ausführt, etwa eine eingegebene Antwort zu prüfen.

  • Das Verhalten ist auseinandergedriftet, wenn zwei Programmteile dieselbe Regel unterschiedlich umsetzen.

Du musst diese Begriffe nicht auswendig lernen. Die praktische Erkenntnis ist einfach: Wenn zwei Funktionalitäten derselben Regel folgen müssen, schreibe keine zwei getrennten Versionen dieser Regel.

Verwende die eine Prüffunktion erneut

Jede Funktionalität, die das Urteil braucht, kann is_correct aufrufen. Zum Beispiel kann eine Funktion zur Punkteberechnung die gemeinsame Prüfung wiederverwenden:

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

Die Punkteberechnung und die Meldungsfunktion können jetzt dieselbe Antwortprüfung verwenden. Wenn sich die Vergleichsregel des Quiz später ändert, gibt es eine Stelle, an der du sie anpassen musst.

Warum ist es besser, is_correct aus result_message aufzurufen, als den Vergleich zu wiederholen?

Die Übung nimmt genau diese Korrektur vor. Du lernst keine neue Syntax. Du bringst zwei vertraute Funktionen zur Übereinstimmung, indem du die gemeinsame Regel an einer Stelle hältst.

Aufgabe

Korrigiere result_message so, dass es is_correct aufruft, um die Antwort zu prüfen.

Wiederhole die Bereinigungs- oder Vergleichsregel nicht. Die drei ausgegebenen Meldungen sollten Correct, Correct und Try again lauten.