...
Kodeskjelettet under er det samme for alle deloppgavene. Det er markert hvilke metoder og klasser som skal implementeres i hvilke deloppgaver. De kan også endres i andre deloppgaver basert på dine egne kodevalg.
KIldekoden som ble brukt under utvikling av oppgavene finner du på GitHub.
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten (BikeRental) tilbyr leie av sykler (Bike) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. (Senere oppgaver legger opp til at en kan leie ut andre fremkomstmidler også). Syklene har GPS, slik at de hele tiden spores (GeoLocation). Den som skal leie sykkel (Person) bruker en app for å få oversikt over hvor (ved hvilke stasjoner) det er tilgjengelige sykler. Deretter er det bare å identifisere sykkelen, angi hvor lenge man ønsker å leie den, og en kan sykle av gårde. Når en er ferdig med å bruke sykkelen, må den settes tilbake på en stasjon (ikke nødvendigvis den samme som en tok den fra). Ved hjelp av appen angir man at leieforholdet er avsluttet. Leieprisen blir da beregnet og pengene trukket.
Prisen er basert på påbegynte timer, og merk at en ikke betaler for mer enn faktisk bruk. Hvis man altså angir at en ønsker å leie en sykkel i tre timer, men leverer den tilbake etter en halv time, så betaler en for én times bruk. Det er mulig å utvide leietiden underveis, noe som utløser et lite gebyr. Hvis en utvider leietiden eller leverer sykkelen etter at sykkelen skulle vært levert, så påløper det også et gebyr.
Del 1 av oppgaven fokuserer på administrasjon av leieforholdet. I første omgang beregnes pris kun fra tidsbruk, mens i del 2 utvides det med gebyrer og kvittering. Del 3 fokuserer på å gjøre det lettere å bytte måten prisen beregnes. Del 4 handler om mobil-appen og del 5 om testing.
...
Expand | |||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||
BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Vi gjør det enkelt og identifiserer stasjonene med et geografisk punkt (GeoLocation, se skjelettet), altså lengde- og breddegrad. GeoLocation brukes også for lagring av posisjonen til syklene. Oppgave 1 a) - GeoLocationGeoLocation er kodet slik at instansene ikke kan endres. Hva er fordelen med dette?
Oppgave 1b) - GeoLocationSkriv ferdig double distance(GeoLocation)-metoden i GeoLocation.
Oppgave 1c) - BikeBike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram.
(Location i bildet over skulle hett GeoLocation, men det var tydelig nok i forhold til teksten hva som er ment.) Begge disse assosiasjonene er dynamiske, dvs. både location og renter (låntaker) kan endres. location-koblingen endres (automagisk, du kan bare forholde deg til at location hele tiden oppdateres) når sykkelen beveger seg, mens renter-koblingen endres når leieforhold innledes og avsluttes. Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner.
Oppgave 1d) - BikeRentalBikeRental må holde oversikt over alle stasjonene, representert med GeoLocation, og alle syklene (Bike). Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Du skal ikke skrive metoder for å konfigurere systemet med stasjoner og sykler, men anta at slike finnes.
Beskrivelse av oppgavene 1e og 1fI første omgang skal du skrive forenklet kode for leie og retur av sykler, hvor det ikke tas hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie ser vi foreløpig bort fra. renter-assosiasjonen i Bike skal holde rede på hvem (Person) som evt. leier en sykkel (Bike). Du bestemmer selv hvor/hvordan du vil representere når leieforholdet starter og når det forventes at sykkelen leveres tilbake. Det viktigste er at informasjonen kan brukes når sykkelen leveres og leien skal beregnes og betales. Oppgave 1e) - BikeRentalSkriv metodene under i klassen BikeRental (se skjelettet til venstre for detaljene). Disse metodene bygger på representasjonen du valgte i 1d.
Oppgave 1f) - BikeRental (mer)Skriv metodene rentBike og returnBike i klassen BikeRental (se skjelettet for detaljene, merk spesielt krav om utløsing av unntak). Disse metodene endrer tilstanden som brukes av de foregående metodene. Velg selv passende unntakstype(r). LocalDateTime brukes for å representere tid (erstatter Date i moderne Java). Gjør nødvendige antakelser om metoder den har, som trengs for tidsberegninger, og bruk disse antakelsene.
|
...
Expand | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||
BikeRental-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid. I tillegg skal det lagres nok data om dette, så en kan få skrevet ut en kvittering med forklaring på hvordan prisen framkom. Oppgave 2a)Forklar med tekst og/eller kode hvordan du vil lagre informasjon om evt. forlengelser av leieforholdet, slik at systemet har nok informasjon til å kunne
Oppgave 2b)Gjør nødvendige endringer av rentBike- og returnBike-metodene i BikeRental, iht. de nye kravene nevnt over, og skriv i tillegg extendRental-metoden. Baser deg på en pris på 10 kr. pr. påbegynte time (som over), 5 kr. pr. forlengelse og 10 kr. pr. for sen forlengelse eller tilbakelevering.
Oppgave 2c)Skriv metoden printReceipt i BikeRental, som kan kalles av returnBike for å skrive ut kvitteringen iht. formatet gitt nederst i skjelettet til venstre. Vær obs på at det eksisterer en metode formatLocalDateTime metode formatLocalDateTime i skjelettet, som kan hjelpe.
|
...
Expand | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||
Koden for beregning av pris er til nå hardkodet i BikeRental-klassen. Dette er noe det kan være greit å kunne endre på, f.eks. hvis en introduserer abonnement, eller man kan introdusere ulike typer fremkomstmidler med hver sin pris. Koden bør dermed gjøres mer fleksibel. Teknikken du skal bruke er delegering. Oppgave 3a)Forklar med tekst og/eller kode hvordan du kan bruke delegering for å gjøre det enklere å bytte ut strategien (beregningslogikken) for prising (globalt). Få med hvordan prisberegningslogikken fra tidligere blir en del av den nye løsningen. Hvis du ikke har fått til del 2 kan du bygge på løsningen fra del 1.
Oppgave 3b)Forklar med tekst og kode hvordan en også kan bruke delegering for å tilby individuell prising (altså pr. Person), f.eks. bonus-ordninger.
Oppgave 3c)En antar at det finnes ulike klasser for ulike typer fremkomstmidler en kan leie. Hver type skal kunne ha sine egne sett med verdier brukt til prising, f.eks. pris pr. time og pris pr. tidsforlengelse. Forklar med tekst og/eller kode hvordan du kan håndtere dette, og spesielt hvordan arvingsmekanismen kan benyttes.
|
...
Expand | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||
Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FXML. Kartet til venstre viser hvor det er sykler, og én stasjon er valgt (og implisitt også en sykkel på stasjonen). Brukeren kan endre antatt tidspunkt for tilbakelevering ved å endre teksten i tekstfeltet eller bruke knappene til høyre for feltet. Den vesentlige (for denne oppgaven) FXML-koden er vist til høyre.
Oppgave 4a)Gitt denne FXML-koden, hvilke kode-elementer (klasser, felt og metoder) må finnes i koden som implementerer oppførselen (logikken) til appen?
Oppgave 4b)I kodeskjelettet er ufullstendig kode for oppførselen til appen angitt (Kontrollerkontroller-logikk). Fyll ut de manglende kodeelementene, som angitt i kommentarer eller markert med ??? Det er lov å anta at LocalDateTime-klassen har konstruktør og metode for konvertering fra og til String, samt metoder for å lage nye LocalDateTime-instanser et gitt antall sekunder før og etter.
|
...
Expand | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||
Oppgave 5a)Skriv kode som tester getRentedBikes i BikeRentalsom vist i skjelettet til venstre (og som ble løst i oppgave 1e). Gjør nødvendige antakelser om metoder som brukes til konfigurasjon av BikeRental.
Oppgave 5b)Forklar med tekst og/eller kode hvorfor det er mer komplisert å teste rentBike og returnBike enn å teste getRentedBikes. Hvilke aspekter ved disse metodene er det som gjør det mer komplisert?
|