0%

Gültigen Objektzustand schützen · Übung

Zusammengehörigen Zustand gemeinsam ändern

Ein Property-Setter ist eine gute Grenze für einen einzelnen zuweisbaren Wert. Er ist die falsche Grenze, wenn eine tatsächliche Änderung mehrere Folgen hat.

Angenommen, ein Versuch lässt sich einem anderen Quiz zuordnen. Sein Quizname und seine bisherigen Ergebnisse müssen sich gemeinsam ändern:

attempt.quiz_name = "Chapter 5 Review"
attempt.results = []

Zwischen diesen Zeilen lügt das Objekt. Es nennt das neue Quiz, enthält aber noch Antworten aus dem alten.

Ein Vorgang für eine Änderung

Eine Neuzuordnung ist ein Ereignis. Gib ihr daher eine Methode:

Try it

Beide Zuweisungen gehören in die Methode. Die unterstützte öffentliche Schnittstelle bietet keinen Vorgang für eine halbe Änderung an. Die führenden Unterstriche zeigen aufrufendem Code, dass direkte Zuweisungen an die internen Attribute die Regeln des Objekts verletzen würden.

Validieren, bevor du irgendetwas änderst

Die Reihenfolge in reassign_to ist entscheidend. Prüfe jeden vorgeschlagenen Wert vor der ersten Zuweisung. Findet die Validierung zwischen Zuweisungen statt, kann eine Ausnahme das Objekt halb im alten und halb im neuen Zustand zurücklassen.

Warum validiert reassign_to den neuen Namen, bevor es die Ergebnisse leert?

Das Muster ist klein: alles validieren, dann alles anwenden. Verwende es, wenn mehrere Attribute zusammen einen Zustand beschreiben. Für einen einzelnen, unabhängig zuweisbaren Wert bleibt der Setter aus der vorherigen Lektion das einfachere Werkzeug.

In der Übung weist eine abgelehnte Überarbeitung nach, dass die Regel eingehalten wird: Keines der beiden Felder darf sich geändert haben.

Aufgabe

Schreibe Question.revise(prompt, answer), das Fragetext und erwartete Antwort gemeinsam ersetzt.

Beide Werte dürfen nicht leer sein. Ist einer unzulässig, löse ValueError aus und lass die Frage vollständig unverändert. Prüfe beide vorgeschlagenen Werte, bevor du einen davon zuweist.

Führe das Programm aus. Die gültige Überarbeitung soll beide Felder ersetzen; die abgelehnte soll beide bisherigen Werte erhalten.