0%

Zusammenarbeit zwischen Objekten · Abschlussprojekt

Abschlussprojekt: Projekt: Ein Quizsystem aus zusammenarbeitenden Objekten

Kapitel 5 machte ein Objekt verlässlich. Dieses Kapitel brachte mehrere Objekte zur Zusammenarbeit, ohne dass eines zu viel wissen muss. Das Projekt setzt die gesamte Anordnung um.

Der Entwurf, den du baust

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, das du fertig erhältst. Nichts zeigt zurück nach oben. Ein Question erfährt daher nie etwas über ein Quiz und ein Quiz nie etwas über einen Versuch.

Wofür die einzelnen Klassen verantwortlich sind

KlasseVerantwortet
QuestionOb eine eingegebene Antwort richtig ist und wie viele Punkte die Frage wert ist.
ResponseDass eine richtige Antwort die Punkte der Frage einbringt.
QuizAttemptWelche Antworten abgegeben wurden sowie Quiztitel, Fragenanzahl und verfügbare Punkte, die zu Beginn des Versuchs festgehalten wurden.
QuizWelche Fragen und Punkte aktuell existieren sowie die Anwendung der Bestehensgrenze auf einen übergebenen Punktestand und eine verfügbare Gesamtsumme.
ScoreReportEinen Versuch in Textzeilen umzuwandeln.

Dieses Projekt soll dich dazu bringen, einer Versuchung zu widerstehen: die letzten drei Zeilen in die erste Klasse zu stecken, die bereits einen Teil der Daten hat. Prüfe die Tabelle jedes Mal, bevor du eine Methode ergänzt.

Der Bericht soll den Fortschritt eines Versuchs als "3 of 5 answered" anzeigen. Wohin gehört die Anzahl der unbeantworteten Fragen?

Regeln, die die Bewertung prüft

  • Keine Klasse verwendet eine Ausgabe. ScoreReport.lines() gibt eine Liste von Strings zurück, und nur das Programm am Ende gibt sie aus.

  • Keine Klasse greift durch eine andere hindurch. Wenn du attempt.quiz.questions()[0].points schreibst, fragt etwas das falsche Objekt.

  • Quiz erwähnt weder Lernende noch Versuche.

  • Sammlungen, die aufrufender Code erhält, lassen sich nicht verwenden, um das Objekt zu verändern, zu dem sie gehören.

  • Titel, Fragenanzahl und verfügbare Punkte eines Versuchs bleiben so, wie sie bei seinem Beginn waren. Spätere Änderungen dieser Quizdaten schreiben den Bericht nicht um. Die Bestehensgrenze bleibt dagegen eine aktuelle Quizregel: Eine Änderung von pass_mark kann passed ändern, obwohl verdiente Punkte und festgehaltene Gesamtsumme gleich bleiben.

Dieses Modell setzt voraus, dass der aufrufende Code das Quiz vor dem Beantworten fertig konfiguriert und jede ursprüngliche Frage höchstens einmal beantwortet. Es zeigt Zusammenarbeit und Momentaufnahmen. Es prüft weder die Zugehörigkeit einer Frage noch verhindert es wiederholte Antworten. Eine fertige Quizversion aufzubewahren wäre eine weitere Entwurfsentscheidung.

Fertigstellen

Wenn das Programm läuft, lies dein ScoreReport.lines() und frage, woher jede Information kam. Jede sollte durch eine Frage an einen Nachbarn zu dem Zeitpunkt eingetroffen sein, an dem sie festgehalten werden musste. Keine sollte doppelt berechnet worden sein.

Wenn die Prüfungen bestehen, ersetze die Wiederholungsfragen durch drei Fragen zu einem Thema, das du kennst, und wähle eine passende Bestehensgrenze. Führe einen bestandenen und einen nicht bestandenen Versuch aus. Die Zusammenarbeit sollte unverändert bleiben, während das fertige Quiz erkennbar deins wird.

Aufgabe

Vervollständige die vier Klassen so, dass sie zusammenarbeiten, ohne die Aufgaben einer anderen zu übernehmen.

Response hält eine Frage und die eingegebene Antwort, fragt die Frage einmal und hält correct, die verfügbaren Punkte und earned als Momentaufnahmen fest. Eine spätere Bearbeitung der Frage darf eine frühere Antwort nicht umwerten.

Quiz hält Fragen und lehnt None ab. Es meldet question_count und total_points, gibt questions() sicher heraus und beantwortet is_passing(score, available_points=None) anhand seines pass_mark. Wird kein Wert für die verfügbaren Punkte übergeben, verwendet es sein aktuelles total_points.

QuizAttempt hält ein Quiz und den Namen der lernenden Person. answer(question, given) erfasst ein Response und gibt zurück, ob es richtig war. Es meldet score, correct_count, answered_count, remaining und passed. Bei seiner Erzeugung hält es Titel, Fragenanzahl und verfügbare Punkte des Quiz fest, damit spätere Änderungen dieser Quizdaten den Bericht des Versuchs nicht umschreiben. pass_mark des Quiz bleibt aktuell. Eine Änderung dieser Regel kann daher passed ändern. passed delegiert die Entscheidung weiterhin an das Quiz und übergibt die festgehaltenen verfügbaren Punkte. Stelle die festgehaltenen Berichtsdaten als schreibgeschützte quiz_title, question_count und available_points bereit, damit ein Bericht nicht durch den Versuch hindurchgreifen muss.

ScoreReport hält einen Versuch und gibt mit lines() Folgendes zurück:

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

Gehe davon aus, dass jede ursprüngliche Frage höchstens einmal beantwortet wird und das Quiz vor Beginn der Antworten konfiguriert ist.

Keine Klasse darf Ausgaben verwenden. Vermeide lange Attributketten: Frage einen direkten Partner nach der Information, für die er verantwortlich ist, statt seine inneren Teile auseinanderzunehmen.