Versions Compared

Key

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

...

Koding av valideringsmetoder for å sjekke konsistens mellom flere verdier, er mer komplisert, ikke bare fordi reglene ofte er mer kompliserte, men fordi det er flere valg å ta om når og hvordan testen utføres. Ta datoen som eksempel: Dersom en har en setter-metode for hver av dag, måned og år, så må hver av disse både validere den nye verdien alene og mot de som allerede er satt:

Code Block
languagejava
titleDato-objekt med enkle setter-metoder
int day, month, year;

boolean isValidDay(int day) {
	// dag er mellom 0 og 31
	return day >= 0 && day < 31;
}

boolean isValidMonth(int month) {
	...
}

boolean isValidYear(int year) {
	...
}

boolean isValidDate(int day, int month, int year) {
	... check validity ...
}

void setDay(int day) {
	// check new day and existing month and year
	if (! isValidDay(day)) {
		throw new IllegalArgumentException(... appropriate message ...);
	} else if (! isValidDate(day, this.month, this.year)) {
		throw new IllegalArgumentExceptionIllegalStateException(... appropriate message ...);
	}
	this.day = day;
}

void setMonth(int month) {
	// check new month and existing day and year
	if (! isValidMonth(month)) {
		throw new IllegalArgumentException(... appropriate message ...);
	} else if (! isValidDate(this.day, month, this.year)) {
		throw new IllegalArgumentExceptionIllegalStateException(... appropriate message ...);
	}
	this.month = month;
}

void setYear(int year) {
	// check new year and existing day and month
	if (! isValidYear(year)) {
		throw new IllegalArgumentException(... appropriate message ...);
	} else if (! isValidDate(this.day, this.month, year)) {
		throw new IllegalArgumentExceptionIllegalStateException(... appropriate message ...);
	}
	this.year = year;
}

Her har vi valgt å ha separate metoder for validering av enkeltverdier, f.eks. at en dag må være mellom 1 og 31 og måned mellom 1 og 12, og validering av kombinasjonen av dag, måned og år. For feil i enkeltverdier så bruker vi IllegalArgumentException og for kombinasjonen IllegalStateException. Hvilken unntaksklasse en bruker er kanskje ikke så viktig, men det er et poeng å skille mellom feil som skyldes argumentet alene og argumentet i kombinasjon med objektets eksisterende tilstand.

Problemer vil imidlertid oppstå Problemet oppstår når en skal prøve å endre datoen i to trinn og potensielt må gå via en ugyldig mellom-tilstand, f.eks. fra 31. januar til 1. februar. Dersom en først setter dagen til med setDay og så måneden med setMonth, så går det greit, men dersom en prøver på motsatt rekkefølge vil unntaket bli utløst idet måneden settes til februar (verdien 2) og valideringsmetoden sier at 31. februar er en ugyldig dato.

...

Koden i setter-metoder og tilhørende validering skal sikre at enhver endring av tilstand er gyldig. Men det sikrer jo ikke at tilstanden er gyldig fra starten! En gyldig initiell tilstand kan sikres på to måter: 1) ved at en definerer gyldige startverdier i feltdeklarasjoner felt-deklarasjoner og/eller 2) at en implementerer konstruktører som krever at en gir inn gyldige startverdier. I koden under er begge muligheter vist:

...