Abschlussprojekt: Eine gemeinschaftliche Leihbibliothek · Abschlussprojekt
Abschlussprojekt: Abgeben und den Entwurf erklären
Eine Datei bleibt übrig. Es ist diejenige, die eine Person tatsächlich ausführt.
In main.py wird die Bibliothek von einer Sammlung von Klassen zu einem Programm. Kapitel 10 gab dieser Datei eine bestimmte Aufgabe: zu wissen, wie alles zusammengesetzt wird und wie man mit einer Person spricht. Jede Regel überlässt sie den darunterliegenden Objekten.
Die Einstiegsdatei entscheidet keine Regeln
Lies dein fertiges main() und prüfe, dass es keine Regeln enthält.
Es soll nicht ausrechnen, ob ein Gegenstand überfällig ist, wie viele Ausleihen ein Mitglied haben darf oder wie eine Ablehnung formuliert wird. Alle drei Dinge existieren und liegen anderswo: auf Loan, in checkout und in den Ausnahmeklassen aus Lektion 8.
Für main bleibt sinnvolle Arbeit übrig:
Eine Bibliothek aufbauen und Dinge hineinlegen.
Ein kurzes Szenario durchspielen.
Abfangen, was zurückkommt, und es in Sätzen ausdrücken.
Ausgeben, was sonst nichts im Projekt tun darf.
Der letzte Punkt ist die Vorgabe aus Kapitel 6: Domänenlogik von Ein- und Ausgabe fernhalten. Hier bleibt sie als einfacher Test erhalten. Suche in deinen anderen drei Dateien nach print. Es sollte keines geben.
Die Familie abfangen
Das Szenario enthält eine Ablehnung, denn ein Programm, das nur den erfolgreichen Ablauf zeigt, zeigt nicht besonders viel:
try:
shelf.checkout("b1", "m2", 11)
except LibraryError as error:
print(f"Sam could not borrow it: {error}")
Ein except, und jede Ablehnung ist abgedeckt. Lektion 8 hat die Meldung gebaut. main setzt sie nur in einen Satz. Hier zahlen sich eine Basisklasse, deren einzige Aufgabe das gemeinsame Abfangen ist, und Fehler, die ihre eigenen Meldungen formulieren, aus: Die Einstiegsdatei muss nicht wissen, welche der vier Ausnahmen sie abgefangen hat.
Die Erklärung
Das Letzte, was du schreibst, ist kein Code.
Beantworte oben in main.py im Modul-Docstring drei Fragen in jeweils wenigen Sätzen:
Wer verwaltet was? Welches Objekt hält den Katalog, die Mitglieder und die Ausleihen, und warum liegen sie an einer Stelle statt an dreien?
Was hast du abgeleitet statt gespeichert? In diesem Projekt gibt es zwei offensichtliche Antworten. Erkläre, was bei der gespeicherten Variante schiefgegangen wäre.
Welche Codestellen würde eine neue Gegenstandsart betreffen? Gehe das ehrlich Datei für Datei durch.
Automatische Prüfungen können feststellen, ob du den Platzhalter durch eine Erklärung ersetzt hast. Eine Person muss beurteilen, ob sie alle drei Themen behandelt und ob die Begründung trägt. Die Erklärung hat einen Grund: In einfachen Sätzen sagen zu können, warum ein Entwurf seine Form hat, macht den Unterschied zwischen dem Befolgen von elf Lektionen und der Fähigkeit, dasselbe bei einem Problem erneut zu tun, das niemand für dich vorbereitet hat.
Was davon gehört in main.py statt weiter nach innen?
Was du jetzt baust
Ein build_library(), das die Bibliothek bestückt, ein main(), das das untenstehende Szenario ausführt und ausgibt, sowie die Schutzabfrage, damit beim Importieren der Datei nichts ausgeführt wird.
Danach die Erklärung, und du bist fertig.
Aufgabe
Vervollständige main.py.
build_library() gibt eine Bibliothek mit dem Buch b1 (Solaris von Lem), dem Spiel g1 (Carcassonne, 5 Spieler) und zwei Mitgliedern zurück: m1 Mina mit einer Grenze von 3 und m2 Sam mit einer Grenze von 1.
main() führt dieses Szenario an Tag 10 aus und gibt exakt diese fünf Zeilen aus:
Community Lending Library
Available: Solaris by Lem, Carcassonne (up to 5 players)
Mina borrowed Solaris by Lem until day 31
Sam could not borrow it: item 'b1' is on loan until day 31
Overdue on day 32: b1
Die Verfügbarkeitszeile verbindet die Beschreibungen mit ", ". Sams Zeile entsteht, indem LibraryError abgefangen und der Fehler selbst ausgegeben wird. Die letzte Zeile verbindet die IDs der an Tag 32 überfälligen Gegenstände auf dieselbe Weise.
Beende die Datei mit der Schutzabfrage if __name__ == "__main__":, damit beim Importieren nichts ausgeführt wird.
Schreibe dann den Modul-Docstring: Wer verwaltet was, was wird abgeleitet statt gespeichert und welche Codestellen würde eine neue Gegenstandsart betreffen?