Göm meny
Gäller för: HT22

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ända
  • new_task() frågar användaren vilken uppgift som ska läggas ber TaskList-instansen lägga till den
  • show_tasks() visar uppgifterna
  • mark_done() frågar användaren vilken uppgift som ska markeras som klar och ser till att det blir gjort
  • main() innehåller interaktionsloopen och anropas sist från __init__() när en instans av TodoApp 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 av Task som skapats (alternativt kan en klassvariabel i Task användas (se föreläsningsbilder))
  • create_task() skapar och sparar en instans av Task
  • mark_done() ändrar rätt instans av Task så att den blir markerad som klar (använd metoden mark_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ändaren
  • description beskrivning av uppgiften
  • done får värdet True om uppgiften är utförd
  • mark_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 av TaskList
  • 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 vilken TaskList-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: Jody Foo
Senast uppdaterad: 2022-12-08