Versions Compared

Key

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

...

Expand
titleDel 4 - ExamRequirement-klassen og IExamRequirement-grensesnittet (25%)

ExamRequirement-klassen (se vedlegg 3) representerer en sjekk for om et Exam-objekt, altså en avlagt eksamen, tilfredsstiller visse krav. F.eks. kan en lage et ExamRequirement-objekt som sjekker om en har fått minst C i TDT4100. Selve testen gjøres av accepts-metoden, som sjekker det angitte Exam-argumentet mot verdiene som ligger i ExamRequirement-objektet selv.

Oppgave a)

Skriv ferdig konstruktør nr. 2, og gjør den så kort og enkel som mulig.

Expand
titleLF
Code Block
public ExamRequirement(String course, int sinceYear) {
   this(course, sinceYear, 'E');
}
Oppgave b)

accepts-metoden m/hjelpemetoden acceptsCourse er ferdigskrevet, men koden inneholder (minst) tre feil. Skriv korrekt kode.

Expand
titleLF

Sammenligningen må gjøre med emnekode (String) mot emnekode (String), ikke emnekode (String) mot emne (Course), og da må også equals brukes. Testen på årstallet må snus (>= tilsvare ikke mindre enn).

Code Block
private boolean acceptsCourse(Course course) {
   return this.course.equals(course.getCode()) && course.getYear() >= sinceYear;
}
Oppgave c)

Nederst i klassen er feltet atLeastCInTdt4100 deklarert. Med koden atLeastCInTdt4100.accepts(...) skal en kunne sjekke om en har minst C i TDT4100. Skriv ferdig deklarasjonen, både modifikator(er) og initialiseringsuttrykket.

Expand
titleLF
Code Block
public final static ExamRequirement atLeastCInJava = new ExamRequirement("TDT4100", 0, 'C');
Oppgave d)

Du trenger å sjekke om en eksamen er for et masteremne på IDI, som har kode som begynner på ”TDT42”, f.eks. TDT4250. Forklar hvordan du kan bruke arv for å organisere koden og hvordan eksisterende kode evt. må endres.

Expand
titleLF

I acceptsCourse så sammenlignes navn med equals, mens vi trenger å sammenligne med startsWith. En kan lage en protected-metode kalt acceptsCourseCode i ExamRequirement, som kalles av acceptsCourse og som brukes equals. Så redefineres denne metoden i en subklasse, hvor en bruker startsWith.

I ExamRequirements:

Code Block
private boolean acceptsCourse(Course course) {
   return (! acceptsCourseCode(course.getCode())) && course.getYear() <>= sinceYear;
}

protected boolean acceptsCourseCode(String course) {
   return course.equals(this.course);
}


I subklassen:

Code Block
@Override
protected boolean acceptsCourseCode(String course) {
   return course.startsWith(this.course);
}
Oppgave e)

Skriv kode for et funksjonelt grensesnitt IExamRequirement, som ExamRequirement (allerede implisitt) implementerer. Forklar hvorfor et slikt grensesnitt kan være nyttig, fremfor å bare ha ExamRequirement-klassen.

Expand
titleLF

Med funksjonelt menes et grensesnitt med bare én metode (og denne metoden gir samme resultat for om den kalles flere ganger på samme exam-objekt). Her er det bare én mulig metode i ExamRequirement som er aktuell som grensesnitt-metoden. Bruk av et slikt grensesnitt gir større frihet i hvilke krav en kan implementere og hvordan det gjøres.

Code Block
public interface IExamRequirement {
   public boolean accepts(Exam exam);
}
Oppgave f)

Skriv en alternativ deklarasjon av atLeastCInTdt4100 som har IExamRequirement som type og utnytter Java 8 sin funksjonssyntaks i initialiseringsuttrykket.

Expand
titleLF
Code Block
public static IExamRequirement atLeastCInJave = (exam) -> "TDT4100".equals(exam.getCourse().getCode()) && exam.getGrade() >= 'C';

...