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

Compare with Current View Page History

« Previous Version 20 Next »

Oppgaven er en innkapslet og litt utvidet variant av Account-oppgaven under temaet Tilstand og oppførsel, og stiller bl.a. større krav til validering.

Et Account-objekt inneholder data om beløpet som står på kontoen og rentefoten (prosentpoeng).   

Begge verdiene skal oppgis og settes når objektet opprettes og ingen av verdiene kan være negative. 

Account-klassen har metoder for å sette inn og ta ut beløp, og legge til påløpte renter, i tillegg til en konstruktør for å initialisere en ny konto. Alle disse skal utløse unntak av typen IllegalArgumentException, dersom et argument ikke tilfredstiller kravene som angis.

  • Account(double, double) - Konstruktøren skal ta inn startbeløpet og rentefoten (prosentpoeng). Ingen av disse kan være negative.
  • double getBalance() - Returnerer beløpet som står på kontoen.
  • double getInterestRate() - Returnerer renten på kontoen.
  • void setInterestRate(double) - Denne metoden tar inn en ikke-negativ verdi og setter renten til denne verdien.
  • void deposit(double) - Denne metoden tar inn et ikke-negativt beløp og øker konto-beløpet tilsvarende.
  • void withdraw(double) - Denne metoden tar inn et ikke-negativt beløp og minsker konto-beløpet tilsvarende. Dersom det nye konto-beløpet er negativt, så skal tilstanden ikke endre, og det skal utløses et unntak av typen IllegalStateException.

Leseliste

Gyldig tilstandTilstanden til et objekt er verdien av alle attributtene. En viktig del av oppførselen til et objekt er å sikre at tilstanden til objektet alltid er gyldig, dvs. at alle attributtene har gyldige/konsistente verdier.
InnkapslingInnkapsling er en programmeringsteknikk som har som formål å hindre direkte tilgang til tilstanden til et objekt fra objekter av andre klasser.
Koding av valideringsmetoderEn valideringsmetode har som formål å sjekke om en eller flere verdier er gyldige, slik at dette kan sjekkes av f.eks. setter-metoder før tilsvarende attributter evt. settes.


Del 1 – Innkapsling og validering: teori

Ta utgangspunkt i koden fra Account-klassen og besvar følgende spørsmål:

  1. Forklar hvorfor metodene over kan sies å være en komplett innkapsling av tilstanden?
  2. Er denne klassen data-orientert eller tjeneste-orientert? Begrunn svaret!

Del 2 - Java-kode

Implementer endringene fra Account-klassen i den nye Account-klassen med oppførsel som er beskrevet over.

JExercise-testkode for denne oppgaven finner du her: encapsulation/AccountTest.java

Merk at din implementasjon må ligge i en pakke med samme navn som testkodens pakke. Pass derfor på at Account-klassen ligger i pakken "encapsulation".


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