0%

Dataclasses en waardeobjecten · oefening

Houd hulpmethoden bij hun klasse

Sommige hulpmethoden horen nauw bij het onderwerp van een klasse, maar hebben noch een object noch de klasse zelf nodig.

Een ruwe waarde omzetten in de vorm die de klasse gebruikt is zo’n geval:

Try it

Een statische methode ontvangt niets automatisch

@staticmethod laat de parameters van de functie met rust. Er is geen self en geen cls. Je kunt de methode via de klasse aanroepen:

Duration.split_seconds(150)

Waarom is split_seconds een statische methode in plaats van een klassemethode?

Een modulefunctie is ook een duidelijke keuze

Dit soort hulpmethode kan ook buiten de klasse worden geschreven:

def split_seconds(total):
    return total // 60, total % 60

Die versie is net zo testbaar en vaak makkelijker te hergebruiken. Behoud een statische methode wanneer het hulpmiddel zo nauw bij de klasse hoort dat aanroepers er vanzelf daar naar zouden zoeken. Geef anders de voorkeur aan de functie op moduleniveau.

De keuze is organisatorisch, niet magisch. Statische methoden krijgen geen extra toegang en geen bijzonder prestatievoordeel.

De oefening voegt één hulpmethode toe die bij de klasse hoort en laat de juistheidscontrole die gebruiken. De alternatieve constructors uit de vorige les zijn al af, zodat alleen deze beslissing wordt beoordeeld.

Opdracht

Voeg Question.normalize(response) toe als statische methode die de tekst zonder witruimte aan de uiteinden en in kleine letters teruggeeft.

Werk Question.is_correct(response) bij zodat zowel het gegeven antwoord als het opgeslagen antwoord wordt genormaliseerd, waardoor " DEF " overeenkomt met "def".

De bestaande alternatieve constructors zijn af. Verander hun aanmaakgedrag niet. Houd de validatie van Question in __post_init__ intact.