Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Oppgave a)Gitt følgende klasse:
I tillegg til koden er det spesifisert at deposit- og withdraw-metodene skal utløse unntak (og ikke endre objektet) dersom beløpet som gis som argument, er negativt. Hva kalles det at metoder sjekker argumentene sine før de utfører evt. endringer på objektet? Fyll inn kode for
Se også Koding av valideringsmetoder Oppgave b)Tegn et objekttilstandsdiagram for et Account-objekt som viser hva som skjer når sekvensen deposit(100), getBalance(), withdraw(150) og withdraw(-50) utføres på objektet.
Se også Objekttilstandsdiagrammer Oppgave c)I koden over så initialiseres balance-feltet i deklarasjonen. Hva slags annen teknikk finnes for initialisering av et objekt og hvordan virker den? Hva er fordeler/ulemper med denne teknikken?
Oppgave d)Gitt følgende kode for en Transaction-klasse, for å registrere data om én overføring mellom to konti:
Hva betyr nøkkelordet final her og hva mangler for å gjøre klassen korrekt gitt denne bruken av final? I hvilken grad støtter Transaction-klassen innkapsling?
|
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I denne oppgaven skal du implementere klasser knyttet til håndtering av konti i en bank og transaksjoner mellom dem. Utgangspunktet for klassen for konto er gitt i oppgave 1. Du skal utvide denne til å håndtere flere krav, og implementere en klasse for banken kalt Bank. Oppgaven videreføres i resten av oppgavesettet, så det kan være greit å lese gjennom alle delene før du begynner å jobbe med din løsning. Oppgave a)Kontonummer. Du skal først utvide Account-klassen slik at den støtter kontonummer. Kontonummeret består av en sekvens med siffer og skal kun kunne settes ved opprettelse, og det skal kunne leses med metoden String getAccountId(). Skriv kode for nødvendige felt og metoder.
Oppgave b)Øvre grense for uttak. Skriv (kode for) nødvendige felt og metoder (og evt. andre endringer i eksisterende kode) for å støtte en øvre grense for (størrelsen til) et uttak. Dersom beløpet som ønskes tatt ut med withdraw-metoden overskrider denne grensen, så skal det utløses et passende unntak.
Oppgave c)Bank-klasse med konti. Du skal lage en Bank-klasse som inneholder et sett med konti (Account-objekter). Skriv metodene addAccount og createAccount og nødvendige felt for å støtte dem:
Oppgave d)Transaksjoner. Bank-klassen skal la en utføre overføringer mellom to konti, altså uttak og innskudd som hører sammen. Transaction-klassen fra oppgave 1 brukes for å registrere informasjon om en slik overføring. Bank-klassen skal ha en transfer-metode for å overføre et beløp mellom to registrerte konti, med følgende signatur: void transfer(Account source, Account target, int amount). Oppførselen skal være som følger:
Oppgave e)Implementer metoden getTransferSum(Account account, int year, int month). Basert på lagrede transaksjoner, så skal den returnere summen av alle uttak fra account-argumentet som ble utført i løpet av den angitte måneden og året.
|
Expand | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
I denne oppgaven skal du utvide Bank-klassen til å håndtere innlesing av transaksjonsdata som tekst fra fil (input-strøm). Transaksjoner skal leses linje for linje, på et format du velger selv. For å hjelpe deg foreslår vi følgende format: <source>-<target>:<amount>. <source> og <target> er kontonummer og <amount> er beløpet, f.eks. angir 1-2:150 en overføring på 150 fra konto 1 til konto 2. Implementer følgende metode for å lese inn transaksjonsdata og utføre transaksjonene:
|
Expand | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
I denne delen skal du bruke arv og lage en subklasse av Bank kalt SafeBank, som gir muligheten for å angi månedlige uttaksgrenser (for summen av uttak) pr. konto i banken. Implementasjonen skal gjøre det mulig å registrere ulike grenser (eller ingen) for hver konto, uten at (koden for) Account-klassen endres. Dersom transfer-metoden er i ferd med å foreta et uttak slik at grensen (for summen av uttak) overstiges, så skal transaksjonen avbrytes og et passende unntak utløses. Forklar med tekst og kode hvordan du vil implementere SafeBank, inkludert hvordan du vil endre Bank for å gjøre løsningen ryddigst mulig. Men merk at om du endrer Bank, så skal oppførselen være den samme, f.eks. skal gamle metoder ikke ha noen annen synlig effekt enn før og evt. nye metoder skal ikke la andre klasser endre tilstanden på ulovlig vis.
|
Expand | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
Skriv testkode for å sjekke at Account oppfører seg som beskrevet i oppgave 1 (og dokumentert i objekttilstandsdiagrammet ditt). Du kan, men trenger ikke bruke JUnit-rammeverket, siden det viktigste er den generelle testmetoden.
Se også Enhetstesting med JUnit |