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

Compare with Current View Page History

« Previous Version 5 Next »

Under redigering...

I vedlegg 1 finner du en datamodell som viser de tre klassene Person, Course og Exam

Oppgave a)

Hva betyr de ulike diagramdelene, altså boksene, strekene/pilene og tegnene (ord, tall og *)?

Diagrammet er omtrent som et klassediagram, så boksene tilsvarer klasser. Navnet øverst en boks er klassenavnet, mens de andre er egenskaper, dvs. data, som instansene vil ha. Strekene er assosiasjoner (eller relasjoner), som sier noe om hvordan instanser kan kobles sammen. Tallene på enden av strekene angir hvor mange koblinger en instans kan ha (* betyr ubegrenset), såkalt multiplisitet. Pilene sier noe om i hvilken retning en kan følge en kobling, ingen betyr begge retninger, mens én pil betyr bare i den retningen.

Oppgave b)

Hvilke valg må en typisk ta når en skal skrive Java-kode for klassene basert slike diagrammer?

Egenskapene og assosiasjonene blir typisk til felt med type som passer til multiplisiteten. En må velge hvordan dataene skal kapsles inn, altså konstruktører med parametre, gettere og settere, og evt. add- og remove-metoder og andre metoder.

Oppgave c)

Exam-klassen bruker en char-verdi for å representere en eksamenskarakter. Hva er problematisk med dette med tanke på å sikre korrekt bruk av klassen? Skisser kort, med tekst og/eller kode, en alternativ teknikk som løser problemet.

En kan hindre gal bruk, dvs. ulovlige char-verdier, med validering og unntak, men det er bedre å kunne sjekke slikt ved kompilering. Da trengs en egen Grade-klasse og denne kan kodes slik at det ikke finnes andre instanser enn de som tilsvarer de lovlig karakterene A-F. Dette gjøres ved å ha privat(e) konstruktør(er) og én statisk variabel for hver mulig verdi:

private Grade(char grade) { ... }
public static Grade A = new Grade('A'), B = new Grade('B'), ... , F = new
Grade('F');

Nå kan en bare bruke lovlige instanser når det forventes et Grade-objekt. Dette er essensielt en manuell koding av en enum-klasse, som ikke er pensum.

 

Course-klassen tilsvarer et undervist emne i et bestemt semester. Kurskoden (code) oppgis ved opprettelsen av Course-objekter, mens studiepoeng (credits) og semesteret (time) kan settes senere. 

Oppgave a)

Deklarer felt for time-egenskapen, og skriv kode for getYear, getSemester, getTime og setTime (se vedlegg 3). Med tanke på del 4, så kan det være lurt å lage en metode som sjekker formatet til setTime sitt time-argument, som kan brukes i andre klasser.

Her velger vi å lagre året og semesteret separat, og la getTime og setTime gi en illusjon om et time-felt. checkTime-metoden er laget for også å bli brukt ved innlesing av time-data.

private int year;
private char semester; // F(all) eller S(pring)

public int getYear() {
   return year;
}

public char getSemester() {
   return semester;
}


public String getTime() {
   return String.valueOf(getSemester()) + year;
}

public static void checkTime(String time) throws IllegalArgumentException {
   char c0 = Character.toUpperCase(time.charAt(0));
   if (c0 != 'S' && c0 != 'F') {
      throw new IllegalArgumentException("Semester must be either F(all) or S(pring)");
   }
   Integer.valueOf(time.substring(1));
}

public void setTime(String time) {
   checkTime(time);
   int year = Integer.valueOf(time.substring(1));
   if (year < 100) {
      year = (year < 50 ? 2000 : 1900) + year;
   }
   this.semester = Character.toUpperCase(time.charAt(0));
   this.year = year;
}

 

Oppgave b)

 

 

Oppgave c)

 

 


Oppgave d)

 

 

 

 

Oppgave a)

 

 

 

 

Oppgave b)

 

 

 

Oppgave c)

 

 

 

Oppgave a)

 

 

 

Oppgave b)

 

 

Oppgave c)

 

 

Oppgave d)

 

 

 

 

 

 

  • No labels