0%

Samenwerkende objecten · eindproject

Eindproject: Project: bouw een quizsysteem met samenwerkende objecten

Hoofdstuk 5 maakte één object betrouwbaar. Dit hoofdstuk liet meerdere objecten samenwerken zonder dat er één te veel wist. Het project zet het hele geheel neer.

Het ontwerp dat je bouwt

a Quiz         has many  Questions
a QuizAttempt  has a     Quiz, and has many Responses
a Response     has a     Question
a ScoreReport  has a     QuizAttempt

Vier klassen, plus Question, die je kant-en-klaar krijgt. Niets wijst terug omhoog, dus een Question leert nooit iets over een quiz en een Quiz leert nooit iets over een poging.

Waar elk object verantwoordelijk voor is

KlasseVerantwoordelijk voor
QuestionOf een antwoord juist is en hoeveel de vraag waard is.
ResponseDat een juist antwoord de punten van de vraag verdient.
QuizAttemptWelke antwoorden zijn gegeven, plus de quiztitel, het aantal vragen en de beschikbare punten die bij het begin van de poging zijn vastgelegd.
QuizWelke vragen en punten nu bestaan, plus het toepassen van de slaaggrens op een doorgegeven score en beschikbaar totaal.
ScoreReportEen poging omzetten in tekstregels.

Dit project is ontworpen om de verleiding te weerstaan de laatste drie rijen onder te brengen in de eerste klasse die al een deel van de gegevens heeft. Controleer de tabel elke keer dat je een methode wilt toevoegen.

Het rapport moet laten zien hoever een poging in de quiz is, als "3 of 5 answered". Waar hoort het aantal onbeantwoorde vragen?

Regels die de beoordelaar controleert

  • Geen enkele klasse drukt iets af. ScoreReport.lines() geeft een lijst met strings terug en alleen het programma onderaan drukt ze af.

  • Geen enkele klasse reikt door een andere heen. Als je attempt.quiz.questions()[0].points schrijft, vraagt iets het aan het verkeerde object.

  • Quiz noemt geen cursisten of pogingen.

  • Collecties die aan aanroepers worden gegeven, mogen niet gebruikt kunnen worden om het object dat ze beheert te veranderen.

  • De titel, het aantal vragen en de beschikbare punten van een poging blijven zoals ze bij het begin waren. Latere wijzigingen aan die quizgegevens herschrijven het rapport niet. De slaaggrens blijft actueel quizbeleid: pass_mark veranderen kan passed veranderen, terwijl de verdiende score en het vastgelegde totaal gelijk blijven.

Dit model neemt aan dat de aanroeper de quiz volledig instelt voordat het beantwoorden begint en elke oorspronkelijke vraag maximaal één keer beantwoordt. Het demonstreert samenwerking en momentopnamen; het dwingt niet af dat vragen bij de quiz horen en voorkomt geen herhaalde antwoorden. Een afgeronde quizversie bewaren zou een verdere ontwerpbeslissing zijn.

Afronden

Als het programma werkt, lees dan je ScoreReport.lines() en vraag je af waar elk gegeven vandaan kwam. Elk gegeven hoort te zijn verkregen door het aan een buur te vragen toen het moest worden vastgelegd. Niets hoort twee keer te zijn berekend.

Als de controles slagen, vervang je de herhalingsvragen door drie vragen over een onderwerp dat je kent en kies je een passende slaaggrens. Voer één geslaagde en één niet-geslaagde poging uit. De samenwerking hoort gelijk te blijven terwijl de voltooide quiz herkenbaar van jou wordt.

Opdracht

Maak de vier klassen af zodat ze samenwerken zonder dat een ervan het werk van een andere doet.

Response bewaart een vraag en het gegeven antwoord, vraagt het één keer aan de vraag en legt correct, de beschikbare punten en earned vast als momentopname. Een vraag later aanpassen mag een eerder antwoord niet herschrijven.

Quiz bewaart vragen en weigert None. De klasse meldt question_count en total_points, geeft questions() veilig terug en beantwoordt is_passing(score, available_points=None) op basis van de eigen pass_mark. Als er geen waarde voor beschikbare punten wordt doorgegeven, gebruikt de klasse de actuele total_points.

QuizAttempt bewaart een quiz en een cursistnaam. answer(question, given) registreert een Response en geeft terug of het antwoord juist was. De klasse meldt score, correct_count, answered_count, remaining en passed. Bij het aanmaken legt die de titel, het aantal vragen en de beschikbare punten van de quiz vast, zodat latere wijzigingen aan die quizgegevens het rapport van de poging niet kunnen herschrijven. De pass_mark van de quiz blijft actueel, dus dat beleid veranderen kan passed veranderen. passed delegeert de beslissing nog steeds aan de quiz en geeft daarbij de vastgelegde beschikbare punten door. Maak de vastgelegde rapportgegevens beschikbaar als alleen-lezen quiz_title, question_count en available_points, zodat een rapport niet door de poging heen hoeft te reiken.

ScoreReport bewaart een poging en geeft lines() terug:

Chapter 6 Review: Mina
  What does len('cat') return? -> 3 (2 of 2)
  Which keyword starts a function? -> class (0 of 3)
2 of 3 answered, 10 points available
Score 2, failed

Neem aan dat elke oorspronkelijke vraag maximaal één keer wordt beantwoord en dat de quiz is ingesteld voordat het beantwoorden begint.

Geen enkele klasse mag afdrukken. Vermijd lange attribuutketens: vraag een directe samenwerkingspartner om het gegeven dat die beheert, in plaats van de interne onderdelen uit elkaar te halen.