0%

De geldige toestand van objecten bewaken · oefening

Verander samenhangende toestand samen

Een propertysetter is een goede grens voor één waarde waaraan je kunt toewijzen. Het is de verkeerde grens wanneer één echte wijziging meerdere gevolgen heeft.

Stel dat een poging aan een andere quiz kan worden toegewezen. De quiznaam en de oude resultaten moeten samen veranderen:

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

Tussen die regels klopt het object niet. Het noemt de nieuwe quiz, maar bevat nog antwoorden van de oude.

Eén bewerking voor één wijziging

Opnieuw toewijzen is een gebeurtenis, dus geef die één methode:

Try it

Beide toewijzingen horen bij de methode. De ondersteunde publieke interface biedt geen bewerking voor een halve wijziging; de underscores aan het begin vertellen aanroepers dat rechtstreeks toewijzen aan de opslag de regels van het object zou schenden.

Valideer voordat je iets verandert

De volgorde binnen reassign_to is essentieel. Controleer elke voorgestelde waarde vóór de eerste toewijzing. Als validatie tussen toewijzingen plaatsvindt, kan een exceptie het object half oud en half nieuw achterlaten.

Waarom valideert reassign_to de nieuwe naam voordat de resultaten worden gewist?

Het patroon is klein: valideer alles en pas daarna alles toe. Gebruik het wanneer meerdere attributen samen één toestand beschrijven. Voor één waarde waaraan je onafhankelijk kunt toewijzen, blijft de setter uit de vorige les het eenvoudigere hulpmiddel.

In de oefening toont een geweigerde herziening aan dat de regel werkt: je controleert dat geen van beide velden is veranderd.

Opdracht

Schrijf Question.revise(prompt, answer), waarmee de vraagtekst en het antwoord samen worden vervangen.

Beide waarden moeten niet-leeg zijn. Als een van beide onaanvaardbaar is, gooi je ValueError op en laat je de vraag volledig ongewijzigd. Controleer beide voorgestelde waarden voordat je een van beide toewijst.

Voer het programma uit. De geldige herziening moet beide velden vervangen; de geweigerde herziening moet beide vorige waarden intact laten.