0%

Zelf functies schrijven · eindproject

Eindproject: Project: bouw het interactieve menu opnieuw op met functies

In hoofdstuk 7 bouwde je een interactief menu als één lange lus. Het was een geslaagd programma, en het groeiende lusblok maakte het volgende ontwerpprobleem zichtbaar.

Nu bouw je hetzelfde gedrag opnieuw op met functies.

Dit heet refactoren: de structuur van werkende code veranderen terwijl je behoudt wat die code doet.

Vergelijk de twee vormen

Het oorspronkelijke menu plaatste elk detail binnen zijn takken:

if command == "add":
    new_item = input("What should I add? ").strip()
    items.append(new_item)
    print(f"Added: {new_item}")
elif command == "list":
    if len(items) == 0:
        print("The list is empty.")
    else:
        number = 1
        for item in items:
            print(f"{number}. {item}")
            number += 1
elif command == "count":
    print(f"Items stored: {len(items)}")

De herstructuurde lus draagt die acties over aan functies:

if command == "add":
    add_item(items)
elif command == "list":
    show_items(items)
elif command == "count":
    show_count(items)

Het totale programma is niet per se korter. Je vindt er makkelijker je weg in:

  • run_menu legt het volledige gesprek uit.

  • add_item legt het toevoegen uit.

  • show_items legt het tonen van de lijst uit.

  • show_count legt het tellen uit.

Elke functie kan afzonderlijk worden gelezen en gecontroleerd.

De vier functies

add_item(items)

Stel precies deze vraag:

What should I add? 

Schoon het antwoord op met .strip(), voeg het toe aan items en druk dit af:

Added: read a book

De lijst die aan de functie wordt doorgegeven, is dezelfde lijst die het menu gebruikt. Toevoegen wijzigt die lijst, zodat latere opdrachten het nieuwe item zien.

show_items(items)

Druk dit af als de lijst leeg is:

The list is empty.

Druk anders elk item af op een genummerde regel, beginnend bij 1.

show_count(items)

Druk dit af:

Items stored: 2

Gebruik daarbij de werkelijke lengte van de lijst.

run_menu(items)

Deze functie beheert de lus. Ze stelt precies deze vraag:

Command (add, list, count, quit): 

Schoon de opdracht op met .strip().lower().

Roep voor add, list en count de bijbehorende functie aan. Druk voor quit de tekst Goodbye. af en verlaat de lus. Druk voor elke andere invoer I do not know that command. af en ga verder.

Het programma op het hoogste niveau

Na de definities:

  1. kies een niet-lege menu_title;

  2. maak een lege lijst met de naam items;

  3. druk de titel af;

  4. roep run_menu(items) aan;

  5. druk Final count: af, gevolgd door de uiteindelijke lengte.

Die vijf regels beschrijven de levensloop van het programma zonder elke menuactie uit te leggen.

Bouw en test in delen

Schrijf niet het hele project voordat je het uitvoert.

  1. Schrijf show_count en roep die functie tijdelijk aan met een lijst van twee waarden.

  2. Schrijf show_items en test zowel een lege lijst als een lijst met twee waarden.

  3. Schrijf add_item, roep de functie één keer aan en bekijk daarna de lijst.

  4. Schrijf run_menu met alleen de tak voor quit.

  5. Voeg steeds één opdrachttak toe. Elke tak moet het werk aan de bijbehorende functie overdragen.

  6. Verwijder tijdelijke aanroepen en voer daarna het complete programma op het hoogste niveau uit.

Doorloop deze reeks:

  1. list terwijl de lijst leeg is;

  2. add om een eerste item toe te voegen;

  3. ADD in hoofdletters en voeg een tweede item toe met spaties eromheen;

  4. count;

  5. een onbekende opdracht;

  6. list;

  7. quit.

Het gedrag moet overeenkomen met je project uit hoofdstuk 7. Het verschil zit in wat de code duidelijk maakt.

Lees het resultaat op twee niveaus

Lees eerst alleen de regels op het hoogste niveau en run_menu. Kun je het plan van het hele programma begrijpen?

Open daarna show_items. Kun je het tonen van de lijst begrijpen zonder de invoerlogica en de toevoeglogica te lezen?

Die scheiding is het resultaat van dit hoofdstuk. Functies zijn meer dan een manier om het kopiëren van code te vermijden. Je kunt ermee ontwerpen waar elk stukje kennis thuishoort.

Als Guided bij je abonnement hoort, kun je Monty vragen:

Lees mijn functienamen en vertel of elke functie één duidelijke verantwoordelijkheid heeft. Wijs één grens aan die ik opnieuw zou moeten bekijken, maar herschrijf het project niet.

Je weet nu hoe je van een werkende reeks instructies bewerkingen met een naam maakt die je kunt testen. Hoofdstuk 9 geeft die functies rijkere informatie om mee te werken door dictionaries te introduceren en soorten verzamelingen te vergelijken.

Opdracht

Bouw het interactieve menu uit hoofdstuk 7 opnieuw op met vier functies.

Eisen:

  1. Definieer add_item(items). De functie vraagt What should I add? , verwijdert de spaties aan de buitenkant van het antwoord, voegt het toe en drukt Added: af, gevolgd door het item.

  2. Definieer show_items(items). De functie drukt The list is empty. af voor een lege lijst, of elk item op een genummerde regel, beginnend bij 1.

  3. Definieer show_count(items). De functie drukt Items stored: af, gevolgd door de lengte.

  4. Definieer run_menu(items). De functie vraagt herhaaldelijk Command (add, list, count, quit): en schoont het antwoord op met .strip().lower().

  5. Binnen run_menu moeten de takken voor add, list en count de bijbehorende functies aanroepen.

  6. quit drukt Goodbye. af en beëindigt de lus.

  7. Een onbekende opdracht drukt I do not know that command. af en de lus gaat verder.

  8. Geef na alle functiedefinities menu_title een niet-lege string naar keuze en maak een lege lijst met de naam items.

  9. Druk de titel af, roep run_menu(items) aan en druk daarna Final count: af, gevolgd door de uiteindelijke lengte.

Kies zelf een titel en items. Neem elke voorgeschreven vraag en elk bericht exact over, zodat het gedrag gecontroleerd kan worden.