Inventoryt får minne

Ett program du redan byggt

Inventoryt växte fram i förra temat. Det började som en lista i Hyllorna och blev sedan en hel meny i Inventoryt som glömmer, med val för att lägga till, visa och ta bort, och en Validerare som håller menyn vid liv när någon skriver fel. Det gör allt ett inventory ska göra, utom en sak: det minns ingenting. Stäng programmet och nästa start är tom.

Nu kopplar du på det du lärde dig i förra delen. Uppdraget är litet men riktigt: inventoryt ska ladda sitt innehåll vid start och spara det vid avslut, så att föremålen finns kvar mellan körningarna. Det är en inlämningsuppgift som bedöms, men du bygger som på riktigt, du lägger till en funktion i ett program som redan lever.

Mönstren gör jobbet

Du skriver nästan ingen ny sorts kod. Programmet är redan byggt av mönster du kan, och persistensen är ett till:

  • Menymönstret är stommen: while True med val för att lägga till, visa, ta bort och avsluta. Den finns redan i ditt inventory.
  • Valideraren, som du mötte i Kraschsäkring och packade som funktion i Ditt eget bibliotek, håller menyvalen kraschsäkra. Den finns redan.
  • Persistent lagring är det du lägger till: samma ladda- och spara-par som du byggde för anteckningsfilen i Filen som minns, nu med inventoryt som innehåll.

Att kunna peka på vilket mönster som löser vilken del av programmet är halva uppgiften. Det är samma sak du gjorde i Brawl och i Caesar-chiffret: du bygger inte bara, du vet vad du bygger med.

Den andra halvan är att avgöra var i programmet de två anropen hör hemma. Mönstret säger vad du behöver, inte var det ska stå. Titta på din meny och fråga dig när inventoryt ska hämtas och när det ska skrivas ned. Ledtråden är att det finns exakt ett ställe där du vet att användaren är klar.

Uppgift: Ge inventoryt ett minne

Öppna inventory.py från Inventoryt som glömmer. Du bygger vidare på den, du börjar inte om.

Detta ska lämnas in

Programmet ska ladda inventoryt från inventory.txt när det startar och spara det när användaren väljer att avsluta. Nästa gång programmet körs ska föremålen vara kvar. Laddning och sparning ska ligga i var sin funktion, ladda_inventory() och spara_inventory(inventory), och laddningen ska klara den första körningen då filen inte finns än, utan att krascha.

Arbeta additivt och committa ett steg i taget, så att din Git-historik visar arbetet:

  1. Skriv spara_inventory(inventory) och anropa den i avsluts-grenen, precis före break. Kör, avsluta, och kontrollera att inventory.txt dyker upp i VS Code med dina föremål.
  2. Skriv ladda_inventory() med try/except FileNotFoundError och låt inventory = ladda_inventory() ersätta den tomma listan högst upp. Kör två gånger och bekräfta att föremålen överlever.
  3. Skapa en .gitignore och lägg inventory.txt i den. Sparfilen hör hemma på din dator, inte i ditt publika repo, av skäl du möter i nästa område.

Skriv en kort CHANGES.md som loggar vad du la till och vilket mönster det var, till exempel: “Lade till ladda_inventory() och spara_inventory(), mönster: Persistent lagring.” Stagea allt utom inventory.txt via Source Control-panelen och pusha.

Vad händer om

Du tar bort ett föremål, avslutar, och öppnar sedan inventory.txt direkt i VS Code och tar bort en rad för hand och sparar. Vad visar programmet vid nästa start? Vad säger det om vem som egentligen äger datan när den väl ligger i en fil?

Motivera & reflektera

Motivera varför laddningen måste ligga i ett try/except i stället för att bara öppna filen. Vad är det för situation except-grenen hanterar, och varför är den inte ett fel?

Nästa nivå

Spara efter varje ändring. Flytta spara_inventory() så att den körs varje gång ett föremål läggs till eller tas bort, inte bara vid avslut. Nu överlever inventoryt även en krasch. Vad blev priset, och när är det värt att betala?

En rad per föremål räcker inte alltid. Låt varje föremål ha ett antal, till exempel Läkedryck x3. Du sparar fortfarande en rad per föremål, men nu måste du bestämma ett format och tolka tillbaka det vid laddning. Det är första steget mot att spara strukturerad data, något riktiga program gör hela tiden.