SP3 - Streamingtjeneste

I SP3 skal I lave en objektorienteret analyse af et domæne og ud fra analysen lave
et objektorienteret design af jeres løsning.
Derefter skal I implementere løsningen i Java.
I jeres løsning skal I anvende basale Java-konstruktioner som:
- klasser
- metoder
- interfaces
- løkker
- betingelser
- ArrayLists eller andre datastrukturer
I projektet skal I udvikle et softwaresystem til brug for streamingtjenester som
Netflix, HBO, Viaplay etc.
I systemet er der film, der kan afspilles. Film har:
- kategorier (fx crime, war, drama, family, romance, sci-fi)
- titel
- udgivelsesår
- rating
I systemet er der også brugere, som søger efter film.
Der laves ikke grafisk brugergrænseflade i første omgang. Systemet skal være rent tekstbaseret.
Der er følgende krav til systemet:
Programmet skal indlæse data fra en tekstfil og oprette objekter på baggrund af data
(fx en samling afMovie-objekter)Der skal være en startmenu (tekst), hvor brugeren kan vælge:
- Oprette sig som bruger
- Logge ind
Der skal være en hovedmenu (tekst), hvor brugeren bliver budt velkommen, og hvor der løbende kan tilføjes flere funktioner.
Når brugeren er logget ind, skal vedkommende kunne:
- søge efter en bestemt film
- Hvis filmen ikke findes → skriv en besked
- Hvis filmen findes → “afspil” filmen
(fx: “Titanic afspilles nu…”)
- logge sig ud (og derefter sendes tilbage til startmenuen)
- søge efter en bestemt film
Brugeren skal kunne:
- søge alle film i en bestemt kategori
- se sin liste over sete film
- se sin liste over gemte film
Når brugeren får vist en liste (kategori, sete, gemte film), skal brugeren kunne vælge en film.
Når brugeren har valgt en film, skal det være muligt at:
- afspille filmen
- gemme filmen til “se senere”
- slette fra “se senere”
Hvis brugeren afspiller filmen, gemmes den automatisk i listen over sete film.
- Brugernes loginoplysninger (brugernavn + password) skal gemmes i en fil, og indlæses ved programstart.
- Der skal være fornuftig håndtering af fejl.
- Hvis der opstår fejl, skal brugeren informeres, når relevant
- Overvej hvem fejlen skal kommunikeres til
- Eksempel:
IOExceptionved filindlæsning
→ fra brugerens synspunkt virker programmet ikke
→ hvordan kommunikeres det?
I skal indlæse filmdata fra .csv-filerne:
- download csv for film
- download csv for serier - den får i nok ikke brug for i første omgang.
Start med at lave en funktion der:
- Indlæser data fra fil
- Fylder ArrayLists med film
- Koden skal ligge i et GitHub-repository
- I skal aflevere ét link pr. gruppe
- Repoet må ikke indeholde andet (fx gamle opgaver)
- Aflevering inden midnat tordag på Moodle - men husk at sætte tid af til at forberede jeres præsentation.
- Afleveringslink.
Det er bedre at løse færre ting godt end mange ting dårligt.
Hvis et delproblem (fx “brugeren skal kunne se sin liste over film”) ikke løses:
→ skriv det på en mangelliste!
En dårlig og uigennemtænkt løsning kan komplicere systemet og gøre det sværere at videreudvikle.
- Lav ikke alt på én gang
- Identificer delproblemer → løs dem ét ad gangen
Eksempler:
- Lav funktionalitet til at fylde ArrayLists med film, serier og brugere
- Lav funktionalitet til brugeroprettelse
Lav fx. funtionaliteterne som små user stories og opret dem i et kanban board på Github. Øv dig i bryde problemerne ned til del-problemer.
Hvis noget virker uoverskueligt →
Solve a Simpler Problem First
Lav en simpel løsning først, selvom den er utilstrækkelig, og forbedr derefter.
Fx:
- Start med kun film
- Start med kun én bruger
F.eks. vil det være en god idé at genbruge FileIO- og TextUI-klasserne fra tidligere opgaver.
Da alle har lavet det samme projekt, skal hver gruppe vælge et emne relateret til deres projekt, som de gerne vil præsentere til review.
I præsentationen vil vi gerne præsenteres noget viden I har fået under projektforløbet.
Sørg for at forberede jeres præsentation, gerne med nogle slides.
Fordel taletiden mellem alle gruppemedlemmer. SP3 godkendelse kræver at man deltager i præsentationen af projektet.
Objektorienteret analyse og design: Formålet med objektorientering er at skabe synergi mellem domænet og løsningen. Hvordan når man frem til et godt objektorienteret design? Hvilke metoder og teknikker findes og hvad er deres rolle hver især? Hvad opnår man i koden ved at anvende nedarvning/interfaces/polymorfi? Fortæl om jeres brug af domænemodel og klassediagram i kodeprocessen. Kom også gerne ind på sekvensdiagrammer og use-cases, samt andre måder at nedbryde problemet på.
Samarbejde og Kommunikation : Hvilke teknikker kan man anvende når man er flere om at kode et system? Hvad er konskekvensen hvis der ikke er god kommunikation i teamet? Hvordan sikres at alle har samme billede af hvad der skal kodes og ikke koder i hver sin retning eller oven i hinanden? Hvordan strukturerede I arbejdet i jeres projekt? Brugte I git, pair programming, code with me eller andet?
Kommunikation med brugeren: hvilke måder findes der til at modtage input fra brugeren og give et output fra systemet? Hvordan kan man holde grænseflade kode adskildt fra fx. logik? Hvordan ser interaktionen ud I jeres løsning?
Datapersistence: Hvordan kan man sikre at den tilstand der er i et program ikke går tabt fra session til session? Skal man gemme alle ændringer lige når de sker, eller venter man til sidst? Hvordan adskiller man den kode der tager sig af at persistere fra anden kode fx. logik eller brugerinterface. Fik I bygget en skalerbar løsning i relation til datapersistens? Hvor nemt ville man kunne udskifte datalaget med et andet? Hvilke udfordringer oplevede vi i forbindelse med persistering af data? Kom også gerne ind på anvendte og alternative datastrukturer.
Separation of concerns: En af kongstankerne bag OOP er at hver klasse har ansvar for en del af koden, og at vi holder en løs forbindelse mellem ansvarsområder, sådan at vi forbedre muligheden for kodegenbrug, og undgår spaghetti kode. Hvor i vores kode har vi eksempler på dette design princip?, hvor har I eksempler på det modsatte? Hvilke udfordringer stødte vi på da vi prøvede at følge princippet? Kom også gerne ind på navngivning.
Unit testing I et større projekt, med mange features, skal det være hurtigt at teste om alt stadig virker som det skal. Hvordan kan man bruge unit test til dette? Hvordan arbejde I med tests og hvilken effekt havde den metode I valgte på processen?