Commit b3c43dab authored by borgeha's avatar borgeha
Browse files

Fjernet nye filer - endret rett i de virkelige filene.

parent 1756b17e
# Bike rental app
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten [BikeRental](BikeRental.java) tilbyr leie av sykler [Bike](Bike.java) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. Syklene har GPS, slik at de hele tiden spores [GeoLocation](GeoLocation.java).
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten [BikeRental](BikeRental.java) tilbyr leie av sykler [Bike](Bike.java) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. Syklene har GPS, slik at de hele tiden spores (med klassen [GeoLocation](GeoLocation.java)).
Den som skal leie sykkel [Person](Person.java) 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.
Den som skal leie sykkel, [Person](Person.java), 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.
......@@ -10,49 +10,60 @@ Det er mulig å utvide leietiden underveis, noe som utløser et lite gebyr. Hvis
Del 1 av oppgaven fokuserer på administrasjon av leieforholdet. Del 2 fokuserer på å gjøre det lettere å bytte måten prisen beregnes. Del 3 handler om en mobil-app for å beregne pris.
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet.
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet. Der det legges opp til at dere skal kommentere valg dere gjør er det naturlig at dere legger inn dette som kommentarer i koden knyttet til metodene eller klassene dere skriver om. Videre er det lagt opp til at du kan (og skal) gjøre naturlige antakelser, men vi ber dere om å gjøre rede for dem.
## Del 1 - BikeRental-, Bike-, og Location-klassene
## Bør vi gjøre ferdig Person litt mer? Hvis ikke bør vi si til dem at det må gjøres ting i del 1.
## Del 1 - GeoLocation-, Bike- og BikeRental-klassene
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.
Du skal i denne delen gjøre endringer i alle disse tre klassene.
- Skriv ferdig double distance(GeoLocation)-metoden i GeoLocation.
**[GeoLocation](GeoLocation.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram:
BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Både stasjonene og syklene er knyttet til geografisk punkt, identifisert ved [GeoLocation](GeoLocation.java) som bruker lengde- og breddegrader.
- Skriv ferdig double distance(GeoLocation)-metoden i [GeoLocation](GeoLocation.java).
**[Bike](Bike.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram: _(NB Hallvard: I skjelettet refererer vi til Location, ikke GeoLocation)_
![Klassediagram](part1.png)
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.
- Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner (konstruktør, get/set).
**[BikeRental](BikeRental.java)**
BikeRental må holde oversikt over alle stasjonene, representert med GeoLocation, og alle syklene (Bike).
[BikeRental](BikeRental.java) må holde oversikt over alle stasjonene, representert med [GeoLocation](GeoLocation.java), og alle syklene ([Bike](Bike.java)).
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven.
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven. Du vil også finne en main-metode med noen eksempler på stasjoner i Trondheim sentrum, bruk gjerne disse for å teste koden din.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie kan kommer i del 2. `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.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie skal derimot skje i slutten av denne delen. Assosiasjonen `renter` i [Bike](Bike.java) skal holde rede på hvem ([Person](Person.java)) som evt. leier en sykkel ([Bike](Bike.java)). 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.
Skriv metodene under i klassen BikeRental. Disse metodene bygger på representasjonen du valgte over.
Skriv metodene under i klassen [BikeRental](BikeRental.java). Disse metodene bygger på representasjonen du valgte over.
- countAvailableBikesNearby - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
- getStationNearby – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
- getRentedBikes – returnerer alle syklene som er lånt ut
- getUnreturnedBikes – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter) (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
- **countAvailableBikesNearby** - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
- **getStationNearby** – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
- **getRentedBikes** – returnerer alle syklene som er lånt ut
- **getUnreturnedBikes** – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter) (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
Skriv metodene `rentBike` og `returnBike` i klassen BikeRental (se javadoc 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).
Skriv metodene `rentBike` og `returnBike` i klassen [BikeRental](BikeRental.java) (se metodedokumetasjonen i kildekoden 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).
- rentBike – kalles når en person starter å leie en gitt sykkel
- returnBike – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time)
- **rentBike** – kalles når en person starter å leie en gitt sykkel
- **returnBike** – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time) **Hallvard: det står i metodebeskrivelse at en ikke skal slette leien før ting er betalt, hva betyr dette?**
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.
[BikeRental](BikeRental.java)-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid. Dette vil også kunne medføre endring i andre klasser!
- 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.
- Gjennomfør endringer av relevante klasser (og introduser nye hvis det er behov).
- Gjør nødvendige endringer av metodene **rentBike** og **returnBike** i BikeRental, iht. de nye kravene nevnt over, og skriv i tillegg metoden **extendRental**.
- 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. En sykkel som først leies fra 12:00 - 13:00, utvides 13:05 - 16:00, utvides igjen fra 15:30 - 17:00 og returneres 16:45 skal betale 70 kroner.
## Del 2 - Fleksibel beregning av pris
Det er ønskelig å gjøre håndtering av pris fleksibel, så endringer i liten (eller ingen) grad krever endringer i koden. F.eks. kan det være aktuelt å introdusere abonnement, kortvarige kampanjer og/eller ulike typer fremkomstmidler med egne priser. Koden bør dermed gjøres mer fleksibel.
Velg én eller flere av disse mulighetene, og realiser en løsning som gir en ryddig programstruktur. Du står fritt i utforming av løsningen, men husk at hensikten er å vise at du kan trekke inn en eller flere relevante og mer avanserte teknikker. Du blir ikke vurderte ut fra mengden kode, men god og fornuftig bruk av teknikkene.
Velg én eller flere av disse mulige utvidelsene, og realiser en løsning som gir en ryddig programstruktur. Du står fritt i utforming av løsningen, men husk at hensikten er å vise at du kan trekke inn en eller flere relevante og mer avanserte teknikker. Du blir ikke vurdert ut fra mengden kode, men god og fornuftig bruk av teknikkene.
## Del 3 - Mobil-app
......@@ -62,7 +73,8 @@ Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FX
<img src="bike-rental-app.png" width="500"/>
Prototypen er laget vha. FXML og noe Java, og nå er det din jobb å fullføre den!
Prototypen er laget vha. FXML, se [BikeRental.fxml](BikeRental.fxml), og noe Java, se bl.a. [BikeRentalApp.java](BikeRentalApp.java), og nå er det din jobb å fullføre den!
- Legg først til de Java-elementene (klasser, felt og metoder) som må finnes i koden som implementerer oppførselen (logikken) til appen
- Skriv koden som er nødvendig for å vise frem prisen, når tilsvarende knapp trykkes!
- Du skal _ikke_ implementere noe i forhold til kartet i seg selv. Dette er kun et bilde.
# Bike rental app
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten [BikeRental](BikeRental.java) tilbyr leie av sykler [Bike](Bike.java) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. Syklene har GPS, slik at de hele tiden spores (med klassen [GeoLocation](GeoLocation.java)).
Den som skal leie sykkel, [Person](Person.java), 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. Del 2 fokuserer på å gjøre det lettere å bytte måten prisen beregnes. Del 3 handler om en mobil-app for å beregne pris.
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet. Der det legges opp til at dere skal kommentere valg dere gjør er det naturlig at dere legger inn dette som kommentarer i koden knyttet til metodene eller klassene dere skriver om. Videre er det lagt opp til at du kan (og skal) gjøre naturlige antakelser, men vi ber dere om å gjøre rede for dem.
## Bør vi gjøre ferdig Person litt mer? Hvis ikke bør vi si til dem at det må gjøres ting i del 1.
## Del 1 - GeoLocation-, Bike- og BikeRental-klassene
Du skal i denne delen gjøre endringer i alle disse tre klassene.
**[GeoLocation](GeoLocation.java)**
BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Både stasjonene og syklene er knyttet til geografisk punkt, identifisert ved [GeoLocation](GeoLocation.java) som bruker lengde- og breddegrader.
- Skriv ferdig double distance(GeoLocation)-metoden i [GeoLocation](GeoLocation.java).
**[Bike](Bike.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram: _(NB Hallvard: I skjelettet refererer vi til Location, ikke GeoLocation)_
![Klassediagram](part1.png)
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 (konstruktør, get/set).
**[BikeRental](BikeRental.java)**
[BikeRental](BikeRental.java) må holde oversikt over alle stasjonene, representert med [GeoLocation](GeoLocation.java), og alle syklene ([Bike](Bike.java)).
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven. Du vil også finne en main-metode med noen eksempler på stasjoner i Trondheim sentrum, bruk gjerne disse for å teste koden din.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie skal derimot skje i slutten av denne delen. Assosiasjonen `renter` i [Bike](Bike.java) skal holde rede på hvem ([Person](Person.java)) som evt. leier en sykkel ([Bike](Bike.java)). 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.
Skriv metodene under i klassen [BikeRental](BikeRental.java). Disse metodene bygger på representasjonen du valgte over.
- **countAvailableBikesNearby** - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
- **getStationNearby** – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
- **getRentedBikes** – returnerer alle syklene som er lånt ut
- **getUnreturnedBikes** – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter) (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
Skriv metodene `rentBike` og `returnBike` i klassen [BikeRental](BikeRental.java) (se metodedokumetasjonen i kildekoden 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).
- **rentBike** – kalles når en person starter å leie en gitt sykkel
- **returnBike** – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time) **Hallvard: det står i metodebeskrivelse at en ikke skal slette leien før ting er betalt, hva betyr dette?**
[BikeRental](BikeRental.java)-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid. Dette vil også kunne medføre endring i andre klasser!
- Gjennomfør endringer av relevante klasser (og introduser nye hvis det er behov).
- Gjør nødvendige endringer av metodene **rentBike** og **returnBike** i BikeRental, iht. de nye kravene nevnt over, og skriv i tillegg metoden **extendRental**.
- 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. En sykkel som først leies fra 12:00 - 13:00, utvides 13:05 - 16:00, utvides igjen fra 15:30 - 17:00 og returneres 16:45 skal betale 70 kroner.
## Del 2 - Fleksibel beregning av pris
Det er ønskelig å gjøre håndtering av pris fleksibel, så endringer i liten (eller ingen) grad krever endringer i koden. F.eks. kan det være aktuelt å introdusere abonnement, kortvarige kampanjer og/eller ulike typer fremkomstmidler med egne priser. Koden bør dermed gjøres mer fleksibel.
Velg én eller flere av disse mulige utvidelsene, og realiser en løsning som gir en ryddig programstruktur. Du står fritt i utforming av løsningen, men husk at hensikten er å vise at du kan trekke inn en eller flere relevante og mer avanserte teknikker. Du blir ikke vurdert ut fra mengden kode, men god og fornuftig bruk av teknikkene.
## Del 3 - Mobil-app
Det skal lages en mobil-app for utleietjenesten og i første omgang fokuseres det på beregning av pris. Man skal kunne angi uthentings- og innleveringstidspunkt og få beregnet prisen.
Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FXML. Kartet 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.
<img src="bike-rental-app.png" width="500"/>
Prototypen er laget vha. FXML, se [BikeRental.fxml](BikeRental.fxml), og noe Java, se bl.a. [BikeRentalApp.java](BikeRentalApp.java), og nå er det din jobb å fullføre den!
- Legg først til de Java-elementene (klasser, felt og metoder) som må finnes i koden som implementerer oppførselen (logikken) til appen
- Skriv koden som er nødvendig for å vise frem prisen, når tilsvarende knapp trykkes!
- Du skal _ikke_ implementere noe i forhold til kartet i seg selv. Dette er kun et bilde.
# Småplukk
## Iteratorer
## 1 - Iteratorer
Disse oppgavene dreier seg om ulik bruk av iteratorer.
### StringBuilderCharacterIterator
### 1.1 - StringBuilderCharacterIterator
[StringBuilderCharacterIterator](StringBuilderCharacterIterator.java)-klassen skal implementere en iterator av tegnene (`Character`) inni en `StringBuilder`. Klassen `StringBuilder` er en `String`-aktig klasse med den (viktige) forskjellen at instanser kan endres etter opprettelsen.
[StringBuilderCharacterIterator](StringBuilderCharacterIterator.java)-klassen skal implementere en iterator av tegnene (Character) inni en `StringBuilder`. `StringBuilder` er en `String`-aktig klasse med den (viktige) forskjellen at instanser kan endres etter opprettelsen. Klassen testes av StringBuilderCharacterIteratorTest.
Klassen testes av StringBuilderCharacterIteratorTest.
- Implementer StringBuilderCharacterIterator.
### StringBooleanMetaIterator
[StringBooleanMetaIterator](StringBooleanMetaIterator.java)-klassen er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre.
### 1.2 - StringBooleanMetaIterator
Klassen [StringBooleanMetaIterator](StringBooleanMetaIterator.java) er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre. Den første itererer over strenger, den andre itererer over boolske verdier.
Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er", "ikke", "kult"` og den andre gir ut `true, true, false, true` så skal StringBooleanMetaIterator-instansen gi ut `"meta-iteratorer", "er", "kult"`. Det tredje elementet (`"ikke"`) ble altså utelatt siden den tredje logiske verdien var `false`.
......@@ -18,21 +20,27 @@ Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er",
Klassen testes av StringBooleanMetaIteratorTest.
### EverySecondMetaIterator og EverySecondMetaIteratorTest
- Implementer StringBooleanMetaIterator.
- Du kan forvente at de to sekvensene (strenger og boolske verdier) er like lange.
### 1.3 - EverySecondMetaIterator og EverySecondMetaIteratorTest **(navn endret, la på Meta på begge)**
[EverySecondMetaIterator](EverySecondMetaIterator.java) er også en meta-iterator. Den tar inn en annen iterator og slipper gjennom _annenhvert_ element.
Eksempel: Hvis iteratoren den tar inn gir ut `"1", "2", "3", "4"`, så skal EverySecondIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondIteratorTest](EverySecondIteratorTest.java)-testklassen.
Eksempel: Hvis iteratoren den tar inn gir ut `"1", "2", "3", "4"`, så skal EverySecondMetaIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondMetaIteratorTest](EverySecondMetaIteratorTest.java)-testklassen.
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfellet. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Din oppgave er skrive to testmetoder som identifiserer begge feilene (ved at testmetoden utløser unntak på vanlig testmetodevis):
- en testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på
- en annen testmetoden skal identifisere den fundamentale feilen
- en testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på.
- en annen testmetoden skal identifisere den fundamentale feilen.
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
## Funksjonelle grensesnitt og lambda
## 2 - Funksjonelle grensesnitt og lambda
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java). `main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
- Implementer metodene beskrevet i [LambdaUtilities](LambdaUtilities.java).
- Over hver metode i kildekoden finner dere en beskriver forventet oppførsel.
\ No newline at end of file
# Småplukk
## 1 - Iteratorer
Disse oppgavene dreier seg om ulik bruk av iteratorer.
### 1.1 - StringBuilderCharacterIterator
[StringBuilderCharacterIterator](StringBuilderCharacterIterator.java)-klassen skal implementere en iterator av tegnene (Character) inni en `StringBuilder`. `StringBuilder` er en `String`-aktig klasse med den (viktige) forskjellen at instanser kan endres etter opprettelsen. Klassen testes av StringBuilderCharacterIteratorTest.
- Implementer StringBuilderCharacterIterator.
### 1.2 - StringBooleanMetaIterator
Klassen [StringBooleanMetaIterator](StringBooleanMetaIterator.java) er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre. Den første itererer over strenger, den andre itererer over boolske verdier.
Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er", "ikke", "kult"` og den andre gir ut `true, true, false, true` så skal StringBooleanMetaIterator-instansen gi ut `"meta-iteratorer", "er", "kult"`. Det tredje elementet (`"ikke"`) ble altså utelatt siden den tredje logiske verdien var `false`.
`main`-metoden er allerede påbegynt med dette som eksempel, bruk den til å teste din egen kode.
Klassen testes av StringBooleanMetaIteratorTest.
- Implementer StringBooleanMetaIterator.
- Du kan forvente at de to sekvensene (strenger og boolske verdier) er like lange.
### 1.3 - EverySecondMetaIterator og EverySecondMetaIteratorTest **(navn endret, la på Meta på begge)**
[EverySecondMetaIterator](EverySecondMetaIterator.java) er også en meta-iterator. Den tar inn en annen iterator og slipper gjennom _annenhvert_ element.
Eksempel: Hvis iteratoren den tar inn gir ut `"1", "2", "3", "4"`, så skal EverySecondMetaIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondMetaIteratorTest](EverySecondMetaIteratorTest.java)-testklassen.
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfellet. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Din oppgave er skrive to testmetoder som identifiserer begge feilene (ved at testmetoden utløser unntak på vanlig testmetodevis):
- en testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på.
- en annen testmetoden skal identifisere den fundamentale feilen.
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
## 2 - Funksjonelle grensesnitt og lambda
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java). `main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
- Implementer metodene beskrevet i [LambdaUtilities](LambdaUtilities.java).
- Over hver metode finner dere en beskriver forventet oppførsel.
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment