Expand | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||
a) Typen til Java-uttrykk er basert på typen til deluttrykkene. F.eks. har uttrykket 1 + 2 typen int, fordi int + int gir en int. Bestem og forklar typen til følgende uttrykk: • ”Java” + ”eksamen” • ”Java” + ”eksamen” = = ”sant” • 1 / 2 • ”0” + ”123”.charAt(5) • ”0123”.charAt(0) – ’0’
b) Anta at en har følgende variabel-deklarasjon og initialisering: Hva er sammenhengen mellom typen på venstre- og høyresiden av tilordningstegnet (=)? Hvordan påvirker String-spesialiseringen (altså det som står mellom < >) bruken av strings-variabelen?
c) Hva er et funksjonelt grensesnitt?
d) ae) Det funksjonelle grensesnittet Predicate<T> er definert som følger:
Anta vi har en Person-klasse med metodene getGender() (returnerer tegnet ’F’ dersom personen er en kvinne, ’M’ om personen er en mann og ’\0’ om kjønnet er ukjent) og getAge() (returnerer alderen). Skriv en metode getMatchingPersons som tar inn en Collection av Person-objekter og et Predicate (også for personer) og returnerer en ny Collection med de personene som tilfredsstiller betingelsen angitt av Predicate-argumentet. Vis hvordan metoden kan kalles med et predikat som sier om personen skal kalles inn til sesjon, dvs. er 18 år og mann.
|
Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Del 2. I denne oppgaven skal du implementere klasser og metoder for å representere (buss)ruter/turer og kunne estimere gjenværende tid for resten av turen. Du kan tenke deg at dette brukes av koden i en info.tavle, som informerer passasjerene om antatt ankomsttid, og en tjeneste for å få SMS en viss tid for ankomst (for de som skal hente passasjeren på desinasjonen).
En strekning består av en sekvens av segmenter med hver sin angitte lengde (s) og (reise)tid (t). Fra lengden og tiden kan en beregne (gjennomsnitts)farten v = s/t. Tiden som knyttes til et segment kan være faktisk registrert reisetid, eller antatt reisetid (basert på historiske data), avhengig av hvilke data en velger å legge inn. Et eksempel med tre segmenter er vist i Figur 1 (s er km, mens t er sekunder):
En antar at farten innen et segment er jevn, og passer på å dele opp en strekning i segmenter ut fra denne antakelsen. En strekning fra én by til en annen vil kanskje være delt i tre segmenter (se Figur 1) én for veien ut av den ene byen, en for delen mellom og en for veien inn til den andre byen, siden hver av disse segmentene har helt ulike kjøreforhold og dermed gjennomsnittsfart. Dersom en vei har varierende fartsgrense, så kan en dele opp i kortere segmenter. Hvis antakelsen om jevn fart innen et segment er riktig, så kan en estimere tid mellom steder underveis på en strekning. Du skal først implementere klasser for strekning og segment, som vi velger å kalle Path og Segment.
a) Skriv først Segment-klassen, med en konstruktør som tar inn lengde og tid for segmentet og nødvendige felt. Det skal ikke være mulig å endre egenskapene etter opprettelsen. Lag også én get-metode for hver av de tre egenskapene distance (lengde), duration (tid) og speed (fart).
b) Implementer Path-klassen, slik at den inneholder en sekvens av Segment-objekter. Det skal være mulig å initialisere Path-objekter med ingen, én eller flere segmenter. Skriv også metoder som gjør det mulig å legge til segmenter og gå gjennom dem basert på indeks. Velg selv fornuftige metode-navn og signaturer.
c) Tegn objektdiagram for strukturen av Path- og Segment-objekter tilsvarende strekningen vist i Figur 1. d) Lag følgende metoder (eksemplene er alle med utgangspunkt i Figur 1):
Klassen Trip representerer en faktisk (kjøre)tur og brukes for å oppdatere info.tavla på bussen med faktisk og estimert (reise)tid. Trip-klassen skal initialiseres med et Path-objekt som representerer forventet forløp, altså med segment-tider basert på historiske data. Trip skal også inneholde et Path-objekt med det faktiske forløpet, slik de registreres underveis på turen. Dette Path-objektet vil altså utvides med flere og flere Segment-objekter, etter hvert som segmentene passeres/tilbakelegges. Dette er illustrert i Figur 2:
Figur 2 e) Implementer nødvendige felt og konstruktør for Trip. Implementer også registerSegment:
f) Trip-klassen skal kunne brukes til å estimere tiden som gjenstår fra og med et punkt underveis, basert på forventet forløp (som ble angitt ved opprettelsen av Trip-objektet). Merk at dette punktet kan godt være midt i et segment. Koden under er et forsøk på implementasjon. De to argumentene er tilbakelagt lengde og tid brukt så langt.
Denne implementasjonen gjør et par antakelser om Trip- og Path-klassene, hvilke? Det er også plantet en liten logisk feil i koden, hvilken?
|
Expand | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
a) Metoden for å estimere tiden som er brukt over, tar ikke i betraktning tiden en har brukt så langt. Hvis trafikken i et segment går vesentlig saktere enn forventet, f.eks. pga. veiarbeid, så vil estimatet bli for lavt. Forklar med tekst og kode hvordan en kan bruke arv for å lage flere varianter av Trip-klassen, med ulike metoder for estimering.
b) Gitt følgende deklarasjon av et grensesnitt for estimering av gjenværende tid:
Metoden estimateTime tar inn to Path-objekter, det første representerer forventet forløp, det andre faktisk forløp, slik det er registrert så langt. De to siste argumentene er total lengde kjørt og tid brukt. Forklar med tekst og kode hvordan du kan lage en (eller flere) implementasjon(er) av dette grensesnittet og bruke delegeringsteknikken for å implementere Trip-klassen sin estimateTime-metode. Vurder hvor fleksibel denne teknikken er sammenlignet med bruken av arv i a).
|
Expand | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
Anta at du skal lage en ArrivalNotifier-klasse som har ansvar for å sende SMS en viss tid før ankomst til destinasjonen. Dette kan være nyttig for de som skal plukke opp passasjerer når de kommer frem. a) ArrivalNotifier-trenger å lagre mobilnumre og hvor mange minutter tid i forkant før ankomst hvert enkelt nummer skal motta SMS. Du kan anta at mobilnumre kan lagres som String. Forklar med tekst og/eller kode hvordan du vil gjøre det.
b) Etterhvert som tiden går og turen forløper så må SMS-ene sendes ut. Det er to ting som må trigge utsendelse av SMS-er, at tiden går og at Trip-objektet endres og dermed potensielt tidsestimatet. Hvilken generell teknikk kan brukes til for å informere ArrivalNotifier-objektet om disse endringen? Forklar med tekst og/eller kode hvordan du vil anvende denne teknikken her. Gjør de antagelser du finner nødvendig om hjelpeklasser knyttet til tid.
|