Temauppgift 6 - del 2
I Temauppgift 6, Del 2 ska ni skriva ett objektorienterat skript som låter användaren skriva in uppgifter att göra (en att-göra-lista) via ett text-gränssnitt.
Krav på funktionalitet
Med skriptet ska användaren kunna göra följande:
- visa vilka kommandon som användaren kan skriva
- visa listan med saker som finns att göra, där varje uppgift har ett unikt ID, samt visa om uppgiften är gjord eller inte
- lägga till en uppgift i taget
- kunna markera en uppgift som klar
- kunna skriva in vad som helst utan att skriptet kraschar
- avsluta skriptet med ett kommando
- inga “råa” utskrifter får göras, dvs där t.ex. en lista eller ett dictionary skrivs ut så att man ser listans hak-klamrar (t.ex.
['a', 'b', 'c']
, eller{'k1': 1, 'k2': 2}
).
Se föreläsningsbilderna för tips både skapande av text-gränssnittet och objektorienterad struktur.
Exempel på körning
Nedan är ett exempel som visar hur det kan se ut när skriptet körs. Er version behöver inte se exakt likadan ut så länge som den uppfyller kraven ovan.
$ ./del2.py
Ange kommando (q=avsluta, ?=hjälp): ?
Kommandon: ny, visa, klar, ?
Ange kommando (q=avsluta, ?=hjälp): ny
Beskriv uppgiften: Tvätta
Du skrev 'Tvätta', är det OK? [j/n]: j
Ange kommando (q=avsluta, ?=hjälp): ny
Beskriv uppgiften: vika tvätt
Du skrev 'vika tvätt', är det OK? [j/n]: j
Ange kommando (q=avsluta, ?=hjälp): visa
0. [ ] Tvätta
1. [ ] vika tvätt
Ange kommando (q=avsluta, ?=hjälp): klar
0. [ ] Tvätta
1. [ ] vika tvätt
Vilken uppgift ska markeras som klar? 1
Ange kommando (q=avsluta, ?=hjälp): visa
0. [ ] Tvätta
1. [X] vika tvätt
Ange kommando (q=avsluta, ?=hjälp): q
Klassdiagram
Programmet ska använda nedanstående klasser och de angivna relationerna ska finnas mellan klasserna. Klasserna ska innehålla minst de angivna metoderna och instansvariablerna. De angivna metoderna ska fungera enligt specifikationen nedan.
Viktigt! Håll kod som ansvarar för interaktion med användaren separat från kod som modellerar data.
Klassen TodoApp
OBS! Det är klassen TodoApp
innehåller all kod som har med det textbaserade gränsnittet att göra.
show_commands()
skriver ut vilka kommandon som användaren kan användanew_task()
frågar användaren vilken uppgift som ska läggas berTaskList
-instansen lägga till denshow_tasks()
visar uppgifternamark_done()
frågar användaren vilken uppgift som ska markeras som klar och ser till att det blir gjortmain()
innehåller interaktionsloopen och anropas sist från__init__()
när en instans avTodoApp
skapas
Klassen TaskList
Klassen TaskList
är vår modell för en lista av uppgifter och används för att representera data för en uppgiftslista. Klassen lagrar godtyckligt många instanser av klassen Task
. För läsbarhetens skull anges inte metodargumenten i listan nedan (se klassdiagrammet ovan istället).
task_counter
håller koll på hur många instanser avTask
som skapatscreate_task()
skapar och sparar en instans avTask
mark_done()
ändrar rätt instans avTask
så att den blir markerad som klar (använd metodenmark_done() i
Task`).
Ingen kod som direkt bidrar till det textbaserade användargränssnittet får skrivas i klassen TaskList
. Dvs ingen kod som ställer en fråga till användaren som ska besvaras får skrivas i någon metod i TaskList
. All interaktionskod ska finnas i klassen TodoApp
.
Klassen Task
Klassen Task
är vår modell för en uppgift och används för att representera data för en uppgift som t.ex. dess beskrivning och om den är utförd eller inte.
task_id
unikt ID för en uppgift, visas när uppgifter visas för användarendescription
beskrivning av uppgiftendone
får värdetTrue
om uppgiften är utfördmark_done()
markerar den egna instansen som klar
Ingen kod som direkt bidrar till det textbaserade användargränssnittet får skrivas i klassen Task
. Dvs ingen kod som ställer en fråga till användaren som ska besvaras får skrivas i någon metod i Task
.
Alla klasser ska ha en __str__()
-metod
Varje klass ska ha en __str__()
-metod som används när objekten ska skrivas ut.
OBS! __str__()
anropas aldrig explicit utan den används genom att konvertera ett objekt till en sträng, eller när ett objekt skrivs ut med print()
.
Utökning för 3 poäng
För att få 3 poäng krävs att ni uttökar funktionaliteten i programmet med minst ett av nedanstående alternativ.
Tips: Om ni ska göra 3-poängs uppgiften, gör först 1-poängsuppgiften. Gör sedan en kopia av er 1-poängsuppgift och jobba vidare med 3-poängsuppgiften där. Förstör inte er 1-poängsuppgift, utan ha kvar en kopia av den utifall att ni t.ex. inte hinner klart med 3-poängsuppgiften.
Alt 1 - Flera uppgiftslistor
I klassdiagrammet och uppgiftsbeskrivningen ovan har varje TodoApp-instans endast en TaskList-instans. Utöka funktionaliteten hos programmet så att man kan skapa flera uppgiftslistor. Det betyder att ni behöver
- lägga till en instansvariabel så att
TaskList
-instanserna har namn - ändra på
TodoApp
-klassen så att den kan lagra en eller flera instanser avTaskList
- lägga till ett kommando (och tillhörande funktionalitet) för att skapa nya
TaskList
-instanser - lägga till ett kommando för att visa vilka
TaskLists
som finns - ändra på kommandona som jobbar med
Task
-instanser, så att man även anger vilkenTaskList
-instans man vill jobba med.
Skapa även ett nytt UML-diagram som har med de ändringar ni gjort.
Alt 2 - Spara och ladda data
Väljer ni alternativ 2 är er uppgift att uttöka funktionaliteten i programmet så att en användare kan spara och ladda data. Det är fritt för er att välja format som sparad data ska ha (t.ex. någon form av textbaserat format eller om ni använder Pythons pickle
-modul). Ni behöver alltså göra följande:
- bestämma filformat för sparad data
- lägga till ett kommando för att läsa in data från sparad fil
- lägga till ett kommando för att spara data till fil
Skapa även ett nytt UML-diagram som har med de ändringar ni gjort.
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2024-07-26