Versions Compared

Key

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

...

Expand
titleDel 3 - Generalisering og Arv (20%)
Oppgave a)

 

Expand
titleLF

 

Oppgave b)

 

Expand
titleLF
 
Oppgave c)

 

Expand
titleLF
 
Oppgave d)

 

Expand
titleLF
 
Oppgave e)

 

Expand
titleLF
 
Oppgave f)

 

Expand
titleLF
 

 

...

Ulike sporter har ulike regler for poenggiving i både kamper og serietabeller og sortering av tabellene. I tennis er kampen slutt når én deltaker har vunnet 2 eller 3 sett for hhv. kvinner og menn, så sluttresultatet 1-0 finnes ikke i tennis. Fotball gir 3 tabellpoeng for seier, mens håndball gir 2. I noen sporter teller innbyrdes oppgjør før målforskjell ved sortering, mens det for andre er omvendt. 

Oppgave a)

Forklar med tekst og kode hvordan du kan lage sport-spesifikke resultat-klasser, f.eks. TennisResult, som arver fra MatchResult og implementerer logikk for å håndheve sportens regler for poenggiving, bl.a. for å unngå registrering av ugyldige resultater. Beskriv også nødvendige endringer av MatchResult.

Expand
titleLF

Litt av poenget her er å tenke på hva slags grensesnitt subklassen må ha, og at ikke superklassen gir public-tilgang til mer enn nødvendig og protected-tilgang til det subklassen trenger. MatchResult-klassen bør markeres som abstract. Metoden for å legge til mål/poeng i MatchResult (addPoints) bør gjøres protected og så lager en sport-spesifikke metoder for å legge til mål/poeng i subklassen, som kaller metoden i superklassen. Her er et forslag for fotball: 

 

Code Block
       public FootballMatch(String homeName, String awayName) {
              super(homeName, awayName);
       }
     
       public void addHomeGoal() {
              addPoints(getParticipant1(), 1);
       }      
       public void addAwayGoal() {
              addPoints(getParticipant2(), 1);
       }
Oppgave b)

Forklar med tekst og kode hvordan du kan lage sport-spesifikke tabell-klasser, f.eks. FootballLeagueTable og TennisTournamentTable, som arver fra LeagueTable og implementerer logikk iht. sportens regler for å beregne tabellpoeng. Beskriv også nødvendige endringer av LeagueTable.

Expand
titleLF
 

LeagueTable-klassen og getParticipantPoints-metoden bør markeres som abstract. getParticipantPoints-metoden implementeres så i de sport-spesifikke subklassene (koden fra del 2 vil være en naturlig del av en fotballtabell-subklasse). 

Expand
titleDel 4 - Diverse (15%)
Oppgave a)

Hva slags generell teknikk kan anvendes for å sikre at en serietabell automatisk oppdateres hvis et MatchResult-objekt endres etter at det er lagt inn i tabellen? Forklar med tekst og kode hvordan du vil implementere støtte for dette. Fokusér på å forklare hvordan den generelle teknikken anvendes/tilpasses, ikke på å få logikken for poengberegning helt riktig (kan være litt intrikat i dette tilfellet).

Expand
titleLF

Her må en bruke observatør-observert-teknikken. Trikset er å la tabellen lytte til endringer i målene/poengene i et kampresultat. Når endringen skjer så må en 1) fjerne poengene en hadde delt ut basert på resultatet før endringen og 2) legge til poengene basert på resultatet etter endringen og 3) sortere igjen. Dette krever at lyttergrensesnitt og –metoden får nok informasjon til å utlede resultat før endringen, noe som kan være litt fiklete. En grei (men ineffektiv) måte å gjøre det på er å blanke hele tabellen og beregne den på nytt ved å gå gjennom alle kampene.

En bør helst forklare hvordan en generelt implementerer lytting med 1) et grensesnitt, 2) liste av lyttere, 3) add/remove-metoder for lyttere, 4) metode for å kringkaste endringshendelser til lytterne og 5) kall av kringkastingsmetoden når endringen skjer.

Oppgave b)

 Forklar hvordan du vil teste at:

-       metoden isWinner(…) i 2 a) pkt. 3 er riktig implementert

-       innbyrdes sammenligning av tabellrader i 2 b) er korrekt

-       løsningen i 1 d) er korrekt

Du trenger ikke skrive kode, men forklaringen må være detaljert nok til å illustrere testemetoden.

Expand
titleLF

På de to første er poenget å teste et rikt nok utvalg tilfeller. For isWinner() i 2 a) bør en teste tilfeller med seier og tap for hjemme- og bortelag og uavgjortresultat og sjekke at isWinner() returnerer riktig verdi for begge lagene. For sammenligning av tabellrader i 2 b) bør en teste tilfeller hvor returverdien blir <, > og = 0 (hvis en har brukt Comparable-grensesnittet) eller tilsvarende. En kan også teste at sammenligning med seg selv gir 0, for en skal jo ikke bare teste naturlig input. For løsningen i 1 d) er poenget korrekt håndtering av unntak. Trikset er å ha et kall til fail() i try- eller catch-delen alt ettersom en forventer et unntak eller ikke. En bør helst bruke instanceof for sjekke at unntaket ikke er en subklasse av RuntimeException. Eksempel på kode for Exception-testing:  

Code Block
     public void testSetDateOfBirth() {
              try {
                      person.setDateOfBirth(date);
              } catch (Exception e) {
                      fail();
              }
              try {
                      person.setPID(pid);
              } catch (RuntimeException e) {
              }
              try {
                     person.setDateOfBirth(null);
                      fail();
              } catch (Exception e) {
                      assertFalse(e instanceof RuntimeException);
              }
       }