Versions Compared

Key

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

Under redigering...

Expand
titleDel 1 - Gender- og Person-klassene (35%)Teori (15%)

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 *)?

Expand
titleLF

  Begge disse bør være markert som private, siden de ikke skal være tilgjengelig utenfor klassen. label bør også være final, siden den ikke skal kunne endresDiagrammet 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?

Expand
titleLF
Ved utskrift så brukes implisitt toString()-metoden, som er implementert og returnerer label

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.

Expand
titleLF
Code Block
 

 

Oppgave d)

 

Expand
titleLF

 

 

Oppgave e)

 

Expand
titleLF

 

 

 

Oppgave f)

 

Expand
titleLF

 

Oppgave g)

 

Expand
titleLF

 

 

 

Oppgave h)

 

Expand
titleLF

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:

Code Block
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.

 

Expand
titleDel 2 -Family-klassen og IO (25%)- Course- og Exam-klassene (30%)

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.

Expand
titleLF

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.

Code Block
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)

 

Expand
titleLF

 

Oppgave c)

 

Expand
titleLF

 


Oppgave d)

 

Expand
titleLF

 

Expand
titleDel 3 - Familierelasjoner og Relation-implementasjoner (25%)

 

 

Oppgave a)

 

Expand
titleLF

 

 

 

Oppgave b)

 

Expand
titleLF

 

 

Oppgave c)

 

Expand
titleLF

 

 

Expand
titleDel 4 - Arv og funksjonelle grensesnitt (15%)
Oppgave a)

 

Expand
titleLF

 

 

Oppgave b)

 

Expand
titleLF

 

Oppgave c)

 

Expand
titleLF

 

Oppgave d)

 

Expand
titleLF

 

 

Expand
titleAppendix 1

 

 

...