0%

Slotproject: een uitleenbibliotheek voor de buurt · eindproject

Eindproject: Lever in en leg het ontwerp uit

Nog één bestand te gaan: het bestand dat een mens daadwerkelijk uitvoert.

In main.py houdt de bibliotheek op alleen een verzameling klassen te zijn en wordt ze een programma. Hoofdstuk 10 gaf dit bestand een specifieke taak: weten hoe je het geheel opbouwt en met een mens communiceert, en elke regel overlaten aan de objecten eronder.

Het startbestand beslist niets

Lees je main() wanneer die klaar is en controleer of er geen regels in staan.

Die hoort niet te bepalen of een item te laat is, hoeveel uitleningen een lid mag hebben of hoe een weigering wordt verwoord. Alle drie bestaan al en staan elders: op Loan, in checkout en in de exceptieklassen uit les 8.

Voor main blijft belangrijk werk over:

  • een bibliotheek opbouwen en er dingen in zetten;

  • een kort scenario uitvoeren;

  • opvangen wat er terugkomt en dat in zinnen vertellen;

  • afdrukken, wat niets anders in het project mag doen.

Dat laatste is de beperking uit hoofdstuk 6: houd domeinlogica weg van invoer en uitvoer. Hier kun je dat eenvoudig controleren. Zoek in je andere drie bestanden naar print. Dat hoort er niet in te staan.

De familie opvangen

Het scenario bevat een weigering, want een programma dat alleen het succesvolle pad demonstreert, laat niet veel zien:

    try:
        shelf.checkout("b1", "m2", 11)
    except LibraryError as error:
        print(f"Sam could not borrow it: {error}")

Eén except dekt elke weigering af. Les 8 bouwde de melding; main zet die alleen in een zin. Dat is de opbrengst van een basisklasse die alleen bedoeld is om opgevangen te worden en van excepties die hun eigen melding schrijven: het startbestand hoeft niet te weten welke van de vier het heeft opgevangen.

De uitleg

Het laatste wat je schrijft is geen code.

Beantwoord bovenaan main.py, in de docstring van de module, drie vragen met elk een paar zinnen:

Wie beheert wat? Welk object bevat de catalogus, de leden en de uitleningen, en waarom staan die op één plek in plaats van op drie?

Wat heb je afgeleid in plaats van opgeslagen? Dit project heeft twee voor de hand liggende antwoorden. Vertel wat er mis had kunnen gaan met de opgeslagen versie.

Waar zou een nieuw type item de code raken? Ga het eerlijk na, bestand voor bestand.

Automatische controles kunnen vaststellen dat je de tijdelijke tekst door een uitleg hebt vervangen. Een reviewer moet beoordelen of die alle drie de onderwerpen behandelt en of de redenering klopt. De uitleg staat er om een reden: in gewone zinnen kunnen vertellen waarom een ontwerp zijn vorm heeft, maakt het verschil tussen elf lessen volgen en dit opnieuw kunnen doen voor een probleem dat niemand voor je heeft uitgeschreven.

Welke van deze taken hoort in main.py in plaats van dieper in het programma?

Wat je nu bouwt

Een build_library() die de bibliotheek vult, een main() die het onderstaande scenario uitvoert en afdrukt, en de uitvoercontrole zodat het importeren van het bestand niets uitvoert.

Daarna de uitleg, en je bent klaar.

Opdracht

Maak main.py af.

build_library() geeft een bibliotheek terug met het boek b1 (Solaris van Lem), het spel g1 (Carcassonne, 5 spelers) en twee leden: m1 Mina met een limiet van 3 en m2 Sam met een limiet van 1.

main() voert dit scenario op dag 10 uit en drukt precies deze vijf regels af:

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

De regel met beschikbare items voegt de beschrijvingen samen met ", ". De regel voor Sam komt uit het opvangen van LibraryError en het afdrukken van de exceptie zelf. De laatste regel voegt de id’s van te late items op dezelfde manier samen, voor dag 32.

Sluit het bestand af met de uitvoercontrole if __name__ == "__main__":, zodat importeren niets uitvoert.

Schrijf daarna de docstring van de module: wie wat beheert, wat wordt afgeleid in plaats van opgeslagen en waar een nieuw type item de code zou raken.