You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

Oppgaven handler om en StopWatch-klasse, som implementerer en stoppeklokke med funksjoner for å starte, ta rundetider og stoppe.

Klassen skal implementere logikken ofte funnet på stoppeklokker på smarttelefoner.

For å holde styr på tiden som går vil StopWatch-klassen bli kalt utenfra (altså noe du slipper å implementere i denne oppgaven) på en tick(int)-metode. I dataverdenen er et tick (tikk på norsk) minste målbare diskret tidsenhet. I denne oppgaven er 1 tikk = 1 millisekund. F.eks. vil et kall tick(3) fortelle en StopWatch-instans at 3 tikk har gått siden sist gang tick() ble kalt.

StopWatch skal fungere på følgende måte:

  • Klokken startes når man ønsker å starte tidtakningen.
  • Alle tikk etter at klokken har blitt startet skal medregnes i tidtakningen.
  • Klokken stoppes når man ønsker å stoppe tidtakningen. Da er tidtakningen helt ferdig. Det er ikke en pause i tidtakningen - klokken skal ikke startes igjen.
  • Det skal være mulig å ta rundetider.
  • Første rundetid startes når klokken starter.
  • Under tidtakningen kan man starte en ny rundetid, og dermed implisitt avslutte den nåværende.
  • Siste rundetid avsluttes når klokken stoppes.

StopWatch-klassen må ha metoder for å spørre om tilstanden og metoder for å endre tilstanden.

Klassen skal ha følgende spørremetoder:

  • boolean isStarted() - returner true om klokken har blitt startet eller false om den ikke har blitt startet
  • boolean isStopped() - returner true om klokken har blitt stoppet eller false om den ikke har blitt stoppet. Merk at her snakker vi om at klokken har blitt stoppet, ikke om klokken går eller ikke.
  • int getTicks() - returnerer det totale antall tikk (millisekunder) som har gått i levetiden til klokken uavhengig om klokken har vært startet eller stoppet.
  • int getTime() - returnerer antall tikk som har gått under tidtakningen. Hvis tidtakningen ikke har startet returner -1. Merk at hvis klokken er startet, men ikke stoppet, skal metoden returnere antall tikk som har gått siden klokken ble startet til nå. Hvis klokken er stoppet skal metoden returnere antall tikk som har gått fra klokken ble startet til klokken ble stoppet.
  • int getLapTime() - returnerer antall tikk som har gått under nåværende rundetid til nå. Hvis tidtakningen ikke har startet returner -1.
  • int getLastLapTime() - returnerer lengden på forrige avsluttede rundetid. Hvis det ikke er noen tidligere rundetider returner -1.

Klassen skal ha følgende metoder for å endre tilstanden:

  • void tick(int ticks) - forteller klokken at ticks antall tikk har gått.
  • void start() - starter klokken.
  • void lap() - avslutter nåværende rundetid og starter en ny.
  • void stop() - stopper klokken.

Del 1 - tilstandsdiagram

Tegn et objekttilstandsdiagram for en tenkt bruk av StopWatch-klassen. Velg en sekvens av kall som både starter klokken, tar rundetider og stopper klokken.

Del 2 - Java-kode

Skriv Java-kode for StopWatch-klassen med oppførsel som er beskrevet over.

Lag en passende toString()-metode og en main-metode, slik at du kan sjekke at oppførselen stemmer med tilstandsdiagrammet (bruk samme sekvens av kall).

Del 3 - JavaFX

Dersom Eclipse har blitt installert som forklart på installasjon av eclipse har du mulighet til å høyreklikke på prosjektmappen (ovinger) -> Team -> Pull for å laste nødvendige filer for denne øvingen. Da skal det ligge StopWatchController.java og StopWatch.fxml i prosjektmappen din, i pakken "stateandbehavior". Disse utgjør en JavaFX-applikasjon, og bruker StopWatch-klassen du har laget. Kjør applikasjonen ved å høyreklikke på StopWatch.fxml -> Run As -> FXML application, og observer hva som skjer.

Åpne StopWatchController og finn ut hvor StopWatch-klassen din blir brukt, og kommenter kort hva som skjer med den. Det er ikke et krav at du forstår resten av koden i StopWatchController, du skal kun forklare hvordan klassen din blir brukt.

 

JExercise-testkode for denne oppgaven finner du her: stateandbehavior/StopWatchTest.javaOriginal-koden (jextest) finner du her: stateandbehavior/StopWatch.jextest.



JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

 

  • No labels