Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt

Oppgaven handler om en Person-klasse, som håndterer informasjon om en person

...

(navn, e-post, fødselsdato og kjønn) og implementerer innkapslingsmetoder med validering.

Et Person-objekt har følgende tilstander:

...

inneholder navn (både fornavn og etternavn), e-post, fødselsdag og kjønn:

  • Navnet inneholder både . Både fornavn og etternavn (og ingen mellomnavn), som begge må være minst to bokstaver langt og skilles med mellomrom. Et navn kan , navnene må være skilt med ett mellomrom og kun inneholde bokstaver.
  • email – en persons epost-adresse. En epost må inneholde en alfakrøll. I tillegg må en av karakterene etter alfakrøllen være et punktum. Minimumslengden for en epost er 6 karakterer.
  • birthday – en persons fødselsdag. Tilstanden bør lagres som en streng i formatet ”DDMMÅÅ”. Dag, måned og år må alle ha gyldige verdier. Dvs. at ”420293” ikke skal godtas som en gyldig fødselsdag.
  • E-post-adressen (hvis den ikke er null) må være på formen fornavn.etternavn@domene.landskode, f.eks. hallvard.trætteberg@ntnu.no (en liste over landskoder finner du her).
  • Fødselsdagen skal være et dato-objekt (java.util.Date) og kan ikke være frem i tid. 
  • En persons kjønn skal kunne returneres som 'M', 'F' eller '\0' (null-tegnet)gender – en persons kjønn. Tilstanden bør representeres som 'M' eller 'F'.

Person-klassen har tilgangsmetoder for å hente og sette tilstandene. Metodene for å sette tilstandene må validere at navn og epost som settes er gyldige.. Dersom et argument er ugyldig i seg selv, så skal unntaket IllegalArgumentException utløses.

  • setName(String) - oppdaterer navnet (fornavn og etternavn med mellomrom mellom), dersom det er gyldig i henhold til kravene over. Det er greit om navnet som settes, ikke stemmer med e-post-adressen.
  • setEmail(String) - oppdaterer e-post-adressen, etter å ha sjekket at den stemmer med navnet.
  • setBirthday(Date) - oppdaterer fødselsdatoen
  • setGender(char) - oppdaterer kjønnet

I tillegg til disse såkalte setter-metodene, så må Person-klassen ha tilsvarende getter-metoder.

Leseliste

Gyldig tilstand
Excerpt Include
Gyldig tilstand
Gyldig tilstand
nopaneltrue
Innkapsling
Excerpt Include
Innkapsling
Innkapsling
nopaneltrue
Koding av valideringsmetoder
Excerpt Include
Koding av valideringsmetoder
Koding av valideringsmetoder
nopaneltrue
String-klassen
Excerpt Include
java.lang.String
java.lang.String
nopaneltrue

Del 1 – Java-kode

Implementer Person-klassen med stram innkapsling. Eventuelle hjelpemetoder for validering bør også ha stram innkapsling. Det kan være lurt å lese om String-klassen og dens metoder før du setter i gang.

Testkode JExercise-testkode for denne oppgaven finner du her: stateandbehaviorencapsulation/PersonTest.java

Del 2 – Ekstraoppgave: Fødselsnummer

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

Del 2 - Spørsmål om innkapsling

Foreslå en alternativ innkapsling av navnet. Hint: del opp.

Foreslå to alternative strategier for å kapsle inn tilstand som er koblet slik navn og e-post er. Hint: 1) samtidig og 2) dekoble.

Ekstraoppgave: Personnummer

Utvid klassen med en persons personnummer. Personnummeret Utvid klassen med en tilstand socialSec, som representerer en persons fødselsnummer. Et fødselsnummer kan ikke settes før kjønn og fødselsdag er satt.

...

  • Et personnummer består av 11 siffer, med følgende struktur: D1D2M1M2Y1Y2N1N2N3K1K2  (fargen illustrerer siffergruppene).
  • De seks første sifrene, D1D2M1M2Y1Y2, tilsvarer fødselsdatoens dag (1-31), måned (1-12) og år (0-99).
  • De tre neste sifrene, N1N2N3, kan antas å være vilkårlige, men N3 må være partall for kvinner og oddetall for menn.
  • De to siste sifrene, K1K2, er kontrollsifre, som hver for seg beregnes ut fra de foregående sifrene. Formelen for dem begge er 11 – (VS % 11), hvor VS (veid sum) for K1 er D1*F1 + D2*F2 + … + N2*F8 + N3*F9 og VS for K2 er D1*G1 + D2*G2 + … + N3*G9 + K1*G10.  F’ene og G’ene er oppgitt i tabellen under. Dersom formelen gir et ett-sifret resultat for tallet 11 så skal verdien 0 brukes isteden. Om både K1 og K2 stemmer med kontrollsifferne generert basert på formlene over, så er personnummeret gyldig, mens gir formelen et to-sifret resultat for K1 og/eller K2, så er personnummeret ugyldig. Ett unntak gjelder; dersom resten av divisjonen er 0 blir kontrollsifferet 0 og ikke 11.kontrollsifferne i personnummeret gyldig
 12345678910
F376189452 
G5432765432

Implementer kode for å sette (med metoden setSSN(String) og validere et gyldig personnummer.

JExercise-testkode Testkode for denne oppgaven finner du her: stateandbehaviorencapsulation/PersonTest2.java.

Include Page
Bunntekst for JExercise- oppgaver
Bunntekst for JExercise- oppgaver