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 Expand |
---|
| Hver enkelt sykkel kan leies i flere perioder (start pluss utvidelser), men det må være av den samme personen. Informasjonen om alle disse periodene må lagres en plass. Vi må lagre start- og sluttidspunkt for alle disse periodene. Hvis en person utvider leietiden fem minutter etter at den forrige perioden var gått ut skal det legges på en avgift. All denne informasjonen kan lagres på ulike steder. I LF har vi tatt utgangpunkt i at alle disse tidsperiodene er knyttet til én enkelt sykkel. En sykkel har allerede knyttet én person til seg, den som leier. Det er derfor naturlig å la sykkelobjektet lagre data om alle leieperiodene for denne personen. Dataene fjernes når en ny leieavtale inngås. Vi introduserer en ny klasse, RentalInfo. Denne inneholder to LocalDateTime, en for starten av en periode og en for slutten. Bike har en liste av slike, og passende gettere/settere. Code Block |
---|
language | java |
---|
linenumbers | true |
---|
| public class RentalInfo {
private final LocalDateTime startTime;
private final LocalDateTime endTime;
public RentalInfo(final LocalDateTime startTime, final LocalDateTime endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public LocalDateTime getStartTime() {
return startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
}
public class Bike {
// [part 1 stuff not shown here]
// for computing rental price
private final List<RentalInfo> rentals = new ArrayList<RentalInfo>();
void addRentalInfo(final RentalInfo rentalInfo) {
rentals.add(rentalInfo);
}
List<RentalInfo> getRentalInfos() {
return new ArrayList<RentalInfo>(rentals);
}
void clearRentalInfos() {
rentals.clear();
}
}
|
Vanlige feil: ... |
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. Expand |
---|
| I rentBike legges det til en linje som legger inn start-og sluttidspunkt for første leieperiode, i LF i form av en RentalInfo. I extendRental gjøres det tilsvarende. Den kompliserte biten av dette er returnBike – når en skal returnere sykkelen. Da må en beregne kostnaden av leien, og trekke dette fra kunden på en eller annen måte (som vi ikke har spesifisert, og heller ikke henger oss veldig opp i). Vi har her valgt å trekke ut selve beregningen av kostnad i en egen metode, computePrice. Det gjør koden ryddigere, og forenkler å gå over til delegering i del 3. Code Block |
---|
language | java |
---|
linenumbers | true |
---|
| // Hjelpefunksjon for å beregne pris.
public int computePrice(final Person person, final Bike bike, final LocalDateTime returnTime) {
final List<RentalInfo> rentalInfos = bike.getRentalInfos();
int price = 0;
LocalDateTime lastEndTime = null;
for (final RentalInfo info : rentalInfos) {
if (lastEndTime == null) {
int timer = computeHours(info.getStartTime(), returnTime);
price = 10 * timer;
} else if (info.getEndTime().compareTo(lastEndTime) > 0) {
price += 5;
if (info.getStartTime().compareTo(lastEndTime) > 0) {
price += 10;
}
}
lastEndTime = info.getEndTime();
}
if (returnTime.compareTo(lastEndTime) > 0) {
price += 10;
}
return price;
}
// Find full hours of rent. Get full hours, add one.
private int computeHours(final LocalDateTime startTime, final LocalDateTime endTime) {
return (int) Duration.between(startTime, endTime).toHours() + 1;
}
public void rentBike(final Person person, final Bike bike, final LocalDateTime now, final LocalDateTime returnTime) {
checkNowIsBeforeReturnTime(now, returnTime);
if (bike.getRenter() != null) {
throw new IllegalArgumentException(bike + " is currently being rented");
}
bike.setRenter(person);
bike.addRentalInfo(new RentalInfo(now, returnTime)); // NEW
}
public void returnBike(final Person person, final Bike bike, final LocalDateTime now) {
if (bike.getRenter() != person) {
throw new IllegalArgumentException(bike + " isn't currently being rented by " + person);
}
final GeoLocation place = getStationNearby(bike, 30.0);
if (place == null) {
throw new IllegalArgumentException(bike + " isn't near (enough) a bike place");
}
// We have not specified how money is withdrawn from
// Persons. Next line is example.
person.withdraw(computePrice(person, bike, now)); // NEW
bike.setRenter(null);
bike.clearRentalInfos(); // NEW
}
public void extendRental(final Person person, final Bike bike, final LocalDateTime now, final LocalDateTime returnTime) {
checkNowIsBeforeReturnTime(now, returnTime);
if (bike.getRenter() != person) {
throw new IllegalArgumentException(bike + " isn't currently being rented by " + person);
}
bike.addRentalInfo(new RentalInfo(now, returnTime));
}
|
Vanlige feil: ... |
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 i skjelettet, som kan hjelpe. Expand |
---|
| Den eksisterende klassen formatLocalDateTime hjelper til med å vise hvordan en kan formattere uthenting av data på HH:mm-format fra LocalDateTime – akkurat det som trengs. Siden Bike inneholder all informasjon om leieforholdet hentes dette ut herfra. Returtidspunkt får en som en parameter. Deretter kan en hente ut informasjon om starttidspunkt og antall utvidelser skrives ut ved å gå gjennom listen. Det første elementet i listen rentalInfos er første leietid, alle de andre er utvidelser. Vi må i tillegg beregne kostnad. Dette ble gjort i en egen metode, computePrice, i 2b. Code Block |
---|
language | java |
---|
theme | Eclipse |
---|
collapse | true |
---|
| private void printReceipt(Person person, Bike bike, LocalDateTime returnTime) {
final List<RentalInfo> rentalInfos = bike.getRentalInfos();
System.out.println("Initial Rental from "+formatRentalInfoTime(rentalInfos.get(0)));
rentalInfos.remove(0); // Fjerner den første
for (int i = 0; i < rentalInfos.size(); i++) {
RentalInfo re = rentalInfos.get(i);
System.out.println("Extension "+(i+1)+" from "+formatRentalInfoTime(re));
}
System.out.println("Bike returned at "+
returnTime.format(DateTimeFormatter.ofPattern("HH:mm")));
System.out.println("Total cost: "+computePrice(person, bike, returnTime));
} |
Vanlige feil: ... |
|