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_questionist für das Erstellen eines vollständigen Datensatzes zuständig.is_correctist für den Antwortvergleich zuständig.score_quizist 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,answerundpoints.make_questionlehnt leere Fragetexte, leere Antworten und Punkte unter 1 mit einemValueErrorab.Die Antwortprüfung ignoriert umgebende Leerzeichen und die Groß- und Kleinschreibung.
score_quizruftis_correctauf, 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.