0%

Je eerste klassen en objecten · oefening

Laat een quiz samenwerken met vragen

De vorige les plaatste meerdere onafhankelijke objecten van Question in één lijst. We kunnen die verzameling nu aan een ander object geven dat de quiz als geheel voorstelt.

Elke Question kent haar vraagtekst, antwoord en de manier om één ingevoerd antwoord te controleren. Een Quiz heeft een andere taak: die bewaart de verzameling en selecteert welke vraag een ingevoerd antwoord moet afhandelen.

class Quiz:
    def __init__(self, questions):
        self.questions = questions

Het object Quiz bevat daarom een lijst waarvan de waarden objecten van Question zijn:

quiz -> Quiz
        questions -> list
                     -> Question
                     -> Question

Deze opbouw heet compositie: één object wordt opgebouwd uit andere objecten die hun eigen gerichte taken behouden.

Draag het gedetailleerde werk over

Het omvattende object kan één onderdeel selecteren en dat vragen het gedetailleerde werk uit te voeren. Hergebruik het labelvoorbeeld uit eerdere lessen:

class LabelSet:
    def __init__(self, labels):
        self.labels = labels

    def matches(self, index, text):
        label = self.labels[index]
        return label.matches(text)

LabelSet dupliceert de tekstvergelijkingsregel niet. Het delegeert dat werk aan het geselecteerde Label. De oefening past dezelfde samenwerking toe op Quiz en Question.

Deze verdeling geeft elke klasse een gerichte belofte:

  • Question.is_correct(response) controleert één vraag.

  • Quiz.check_answer(index, response) selecteert een vraag en draagt het werk over. In de figuur betekent “Composition” compositie en “Delegation” delegatie. “Select” is selecteren; de tekst in het groene vak zegt dat elk object zijn eigen taak behoudt.

Een Quiz bevat Question-objecten en draagt het controleren van een antwoord over aan een geselecteerde Question.

Zet de samenwerking in de juiste volgorde:

Sleep de opties in de juiste volgorde of gebruik de pijlknoppen.

  • Quiz selecteert een Question uit haar lijst.

  • Question vergelijkt het ingevoerde antwoord met haar antwoord.

  • Het booleaanse resultaat keert terug naar de aanroeper.

  • Quiz roept Question.is_correct(response) aan.

Met kleine asserties kunnen we de publieke belofte controleren:

assert quiz.check_answer(0, "4")
assert not quiz.check_answer(0, "5")

De asserties geven niets om de namen van private hulpfuncties die de klassen gebruiken. Ze controleren wat de objecten beloven te doen.

Opdracht

Maak Quiz.check_answer af.

Selecteer de vraag op index en draag de antwoordcontrole daarna over aan de methode is_correct van dat object. Voer het programma uit en zorg dat beide asserties blijven slagen.