0%

Gültigen Objektzustand schützen · Abschlussprojekt

Abschlussprojekt: Projekt: Fragen und Versuche, die gültig bleiben

Dieses Kapitel begann mit einem Question-Objekt, das eine leere Eingabe bereitwillig als richtig akzeptierte. Es endet mit zwei Klassen, deren öffentliche Vorgänge die von dir gewählten Regeln erhalten.

Das Projekt führt die vier Werkzeuge in einem kleinen Programm zusammen.

Was dir zur Verfügung steht

WerkzeugVerwende es, wenn
Validierung in __init__Ein Objekt mit diesem Wert niemals nützlich sein könnte.
Eine nach einem Ereignis benannte MethodeEtwas passiert ist und daraus Änderungen mehrerer Attribute folgen.
Eine schreibgeschützte PropertyAufrufender Code eine Information über das Objekt braucht, keinen Zugriff auf seine Speicherung.
Eine Property mit SetterEin Attribut tatsächlich neu zugewiesen wird und dafür eine Regel gilt.

Jedes der vier Werkzeuge kommt im fertigen Programm mindestens einmal vor. Zu entscheiden, welches wohin gehört, ist deine Aufgabe.

Das Programm

Du baust die beiden Klassen, die eine Quizsitzung braucht.

Ein Question-Objekt enthält einen Fragetext, eine erwartete Antwort und eine Punktzahl. Ohne alle drei lässt es sich nicht erzeugen. Seine points lassen sich später anpassen, aber niemals auf null oder darunter.

Ein Attempt-Objekt gehört zu einer namentlich benannten lernenden Person. Es nimmt Antworten über record auf. Das ist der einzige Weg, auf dem sich seine Ergebnisse ändern. Es meldet score, response_count und accuracy, ohne Zuweisungen an diese Werte zu erlauben. Nach seinem Abschluss nimmt es keine Antworten mehr an und zeigt den Abschluss an.

Der Startcode enthält die Grundgerüste beider Klassen, ein kurzes aufrufendes Programm und die Ergebnisse, die es erzeugen soll.

Ein Attempt-Objekt muss bereitstellen, wie viele Punkte die lernende Person verdient hat. Welches Werkzeug passt?

Fertigstellen

Ein nützlicher letzter Durchgang vor der Abgabe: Frage für jedes Attribut beider Klassen, was passieren würde, wenn aufrufender Code ihm jetzt einen Wert zuwiese. Lautet die ehrliche Antwort „Das Objekt würde anfangen zu lügen“, bist du mit diesem Attribut noch nicht fertig.

Wenn die Prüfungen bestehen, kannst du das aufrufende Programm nach deinen Wünschen anpassen: Ersetze die Beispielfragen und den Namen durch ein kurzes Quiz, das du tatsächlich jemandem stellen würdest. Die Prüfungen interessieren sich für das Verhalten der Objekte, nicht für das Thema der Sitzung.

Aufgabe

Vervollständige beide Klassen so, dass keine in einen Zustand gebracht werden kann, den sie nicht haben sollte.

Question muss die Erzeugung mit ValueError ablehnen, wenn Fragetext oder erwartete Antwort leer sind oder die Punkte nicht größer als null sind. Seine prompt und answer sind nur lesbar. Seine points sind lesbar und zuweisbar und lehnen null oder weniger ab.

Attempt behält einen öffentlichen Namen learner. Es stellt finished und die drei berechneten Werte score, response_count und accuracy als schreibgeschützte Properties bereit. record(question, response) speichert die Antwort und die damit verdienten Punkte. Werden die Punkte der Frage später geändert, darf das frühere Verdienste nicht verändern. finish() beendet den Versuch. Danach ändert record nichts mehr.

Gib die Lösung ab, wenn das aufrufende Programm den Bericht am Ende ausgibt und jede abgelehnte Änderung die Objekte exakt in ihrem vorherigen Zustand lässt.