Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
Tema for alle oppgavene er en restaurant, med fokus på menyen. Course-klassen representerer en enkeltrett, f.eks. laksemousse, biffsnadder eller karamellpudding. Meal representerer et ferdig sammensatt måltid som bestilles som et hele, f.eks. en tre-retters med laksemousse, biffsnadder og karamellpudding. Menu er menyen med utvalget av retter og måltider og deres priser. Table representerer bordet, i denne sammenheng bestillingene. Under finner du utgitt kode, som fungerer som kontekst for oppgavene. Merk spesielt kommentarene til metoder, som inneholder krav til metodene, og linjer med ..., som indikerer manglende kode.
(5p) Oppgave a) Innkapsling av navn og beskrivelseCourse- og Meal-klassene representerer henholdsvis enkeltretter og måltider sammensatt av flere retter, slik vi finner i menyer på spisesteder. Både Course og Meal skal initialiseres med navn og beskrivelse, som siden ikke skal kunne endres. I den utgitte koden er det brukt to varianter for å håndtere dette. Course har public-felt og ingen get- eller set-metoder, mens Meal har private-felt og public get-metoder. Angi fordeler og ulemper med hver kodingsteknikk. Hvilken anbefaler du? Begrunn svaret!
(5p) Oppgave b) super()I konstruktørene til Course og Meal står det super() i første linje. Hva betyr/gjør denne linja? Hva ville skjedd om den ble fjernet?
(5p) Oppgave c) courses-feltet i MealI konstruktøren for Meal er det lagt til ei linje for initialisering av feltet courses, som lagrer matrettene som måltidet er satt sammen av. Skriv en passende deklarasjon for courses, slik at feltet er egnet til formålet og initialiseringslinja blir riktig.
(5p) Oppgave d) Arrays.asList-metodenInitialiseringskoden bruker metoden Arrays.asList. Skriv en (mulig) metodedeklarasjon (altså den første linja i koden for metoden, med modifikatorer og alt som trengs) for denne metoden, som passer til slik metoden brukes.
(2p) Oppgave e) Initialisering av courses-feltetI initialiseringskoden brukes this.courses = ... Hva ville skjedd om vi utelot this-nøkkelordet, altså bare skrev courses = ... ? Ta i betraktning dine svar på tidligere delspørsmål! Velg ett alternativ
(3p) Oppgave f) Initialisering av courses-feltet forts.Begrunn/forklar ditt valg i forrige deloppgave!
(7p) Oppgave g) Innkapsling av Course-objekter i Meal-klassenSkriv nødvendig kode for å innkapsle Course-objektene i Meal-klassen. Det skal være mulig å legge til og fjerne Course-objekter, samt iterere (løpe gjennom) alle Course-objektene i et Meal-objekt med kode slik som dette: for (Course course : meal) {
(10p) Oppgave h) Menu-klassenMenu-klassen skal kunne lagre et sett Course- og Meal-objekter og deres priser. Skriv ferdig klassen, med nødvendige felt og metoder for dette.
(10p) Oppgave i) Table-klassenTable-klassen representerer alle retter (Course) og måltider (Meal) som gjestene ved et bord har bestilt. For å kunne beregne (total)prisen, er Table-klassen knyttet til en Menu. Skriv ferdig klassen.
Koden finnes på github, se del 1 av konten 2017 |
Expand | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
Denne delen handler om hvordan arv kan utnytte at Course og Meal har en del felles.
(5p) Oppgave a) MenuItem-klassenCourse- og Meal-klassene har en del felles egenskaper, som kan samles i en felles superklasse kalt MenuItem. Skriv koden til MenuItem.
(10p) Oppgave b) Bruk av MenuItemIntroduksjonen av MenuItem-klassen gjør det nødvendig å endre de eksisterende klassene. Skriv ny kode for Course-, Meal-, Menu- og Table-klassene, slik at de virker med og utnytter mulighetene som MenuItem-superklassen gir. Vurder spesielt om felt og metoder kan forenkles/slås sammen. Flett gjerne inn kommentarer til endringene og valg du gjør i koden.
Koden finnes på github, se del 2 av konten 2017
|
Expand | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||
Denne delen handler om samhandling mellom Table-klassen og en ny Kitchen-klasse.
(10p) Oppgave a) Kobling fra Table til KitchenBestilling av mat henger sammen med laging av mat, og nå skal det innføres en Kitchen-klasse (se utgitt kode), som har en dobbel kobling til Table-klassen. Denne deloppgaven handler om den første koblingen, nemlig at et Table-objekt skal kunne ha en kobling til ett Kitchen-objekt, som skal få beskjed når en ny rett (Course) eller et nytt måltid (Meal) legges til i lista over bestillinger. Tenk på det som en bestilling fra kelneren som betjener bordet til kjøkkenet om hvilke retter som skal lages. Fullfør Table-klassen med det som trengs for å håndtere en kobling til Kitchen og gi beskjed til Kitchen-objektet om retter og måltider som bestilles.
(10p) Oppgave b) Kobling fra Kitchen til Table og andre klasser.Table-objektene representerer bordene, og de må få beskjed når en rett er ferdiglaget av kjøkkenet. Derfor må Kitchen-klassen være kodet for å støtte en slik varsling. For å gjøre koden mer generell, så brukes observert-observatør-teknikken (se utgitt kode). Fullfør Kitchen-klassen, så den kan fungere som en observert og Table-klassen som observatør vha. KitchenListener-grensesnittet.
(10p) Oppgave c) Kitchen sin Course-køKitchen-klassen (se utgitt kode) håndterer en kø av retter, organisert etter hvilket bord (Table) som har bestilt den. Logikken er bare delvis implementert, fullfør koden for metodene produceCourse, courseProduced og menuItemAdded så køen håndteres riktig, ved å fylle inn der det er angitt med ...
Koden finnes på github, se del 3 av konten 2017
|
Expand | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||
(5p) Oppgave a) Predicate-grensesnittetHva kalles et slikt grensesnitt som Predicate (se utgitt kode) og hvorfor?
(5p) Oppgave b) findCourse-metodenMeal skal utvides med en metode for å finne det første Course-objekter objektet som tilfredsstiller gitte betingelser. For å gjør koden generell så gis betingelsen inn som argument i form av et Predicate-objekt (se utgitt kode). Fullfør findCourse-metoden (se utgitt kode).
(8p) Oppgave c) Testing av MealDen utgitte koden inneholder en JUnit-test for testing av Meal-klassen. To typer funksjonalitet skal testes, 1) metoden(e) for å støtte iterasjon vha. foreach-løkker og 2) findCourse-metoden. Fullfør koden. Hvis du ikke får til å skrive riktig kode for JUnit-rammeverket, så forklar med tekst og kode hvordan du ville gjort det.
Koden finnes på github, se del 4 av konten 2017
|