0%

Vom funktionierenden Code zum Programmentwurf · Abschlussprojekt

Abschlussprojekt: Projekt: Beschreibe einen besseren Entwurf

Dieses Projekt verbessert den Entwurf mit vertrauten Werkzeugen.

Das Ausgangsprogramm verwendet parallele Listen:

prompts = [
    "Two plus two?",
    "Three plus three?",
]
answers = ["4", "6"]
points = [1, 2]

Position null in jeder Liste beschreibt eine Frage. Position eins beschreibt eine andere. Dieser Zusammenhang besteht nur im Verständnis der programmierenden Person.

Wenn eine Liste umsortiert oder ein Element weggelassen wird, passen die Datensätze unbemerkt nicht mehr zusammen.

Dein neuer Entwurf mit Funktionen

Strukturiere das Programm um drei kleine öffentliche Funktionen herum um:

make_question(prompt, answer, points)
is_correct(question, response)
score_quiz(questions, responses)

Die entstehende Liste sollte vollständige Frage-Dictionarys enthalten:

questions = [
    make_question("Two plus two?", "4", 1),
    make_question("Three plus three?", "6", 2),
]

score_quiz gibt die insgesamt erreichten Punkte zurück. Es muss das Verhalten von is_correct verwenden, statt den Antwortvergleich zu wiederholen.

Halte die Verantwortlichkeiten klar begrenzt

Die vorige Lektion hat eine Verantwortlichkeit als Zusage eingeführt, für die ein Programmteil zuständig ist. Dieser Entwurf gibt jeder Funktion eine:

  • make_question ist für das Erstellen eines vollständigen Datensatzes zuständig.

  • is_correct ist für den Antwortvergleich zuständig.

  • score_quiz ist für die Quizschleife und die Gesamtsumme zuständig.

Die Verantwortung für die Erzeugung umfasst die bereits in diesem Kapitel festgelegten Regeln: Fragetexte und Antworten dürfen nicht leer sein, und die Punkte müssen mindestens 1 betragen.

Diese Struktur ist besser als die parallelen Listen und kann für ein überschaubares Programm bereits ausreichen.

Erkenne, was sich verbessert hat

Vor dem Refactoring hing das Programm von übereinstimmenden Positionen in drei Listen ab. Nach dem Refactoring:

  • ist jede Frage ein vollständiger Wert;

  • wird jede Frage auf dieselbe Weise erstellt;

  • enthält eine Funktion die Regel für den Antwortvergleich;

  • konzentriert sich die Quizschleife auf die Punkteberechnung.

Nichts davon erfordert unbekannte Syntax. Programmentwurf beginnt oft damit, vertraute Teile so anzuordnen, dass ihre Aufgaben klar sind.

Warum ist eine Liste vollständiger Frage-Dictionarys sicherer als drei parallele Listen?

Wenn dein Projekt besteht, beschreibe in eigenen Worten eine Verbesserung und einen Nachteil des Refactorings. Diese Reflexion dient deinem Urteilsvermögen beim Entwerfen und ist keine versteckte Anforderung der automatischen Bewertung.

Aufgabe

Ersetze den Entwurf mit parallelen Listen, indem du make_question, is_correct und score_quiz vervollständigst.

Anforderungen:

  • Jede Frage ist ein Dictionary mit prompt, answer und points.

  • make_question lehnt leere Fragetexte, leere Antworten und Punkte unter 1 mit einem ValueError ab.

  • Die Antwortprüfung ignoriert umgebende Leerzeichen und die Groß- und Kleinschreibung.

  • score_quiz ruft is_correct auf, statt den Vergleich zu wiederholen.

  • Richtige eingegebene Antworten addieren die Punkte dieser Frage.

  • Falsche eingegebene Antworten addieren null.

Das vorgegebene Programm sollte Score: 3 ausgeben.