Versions Compared

Key

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

Dersom du mener at opplysninger mangler i en oppgaveformulering, gjør kort rede for de antagelser og forutsetninger som du finner nødvendig. Hvis du i en del er bedt om å implementere klasser og metoder og du ikke klarer det (helt eller delvis), så kan du likevel bruke dem i senere deler.

En oversikt over klasser og metoder for alle oppgavene er gitt i vedlegg 1. Kommentarene inneholder krav til de ulike delene, som du må ta hensyn til når du løser oppgavene. I tillegg til metodene som er oppgitt, står du fritt til å definere ekstra metoder for å gjøre løsningen ryddigere. Nyttige standardklasser og -metoder finnes i vedlegg 3.

Temaet for oppgaven er et spisested (Diner) og problemstillingen er plassering (Seating) av grupper (Group) av gjester ved bordene (Table).

Expand
titleDel 1 - Group, Table- og Seating-klassene (15%)

Group-, Table- og Seating-klassene (vedlegg 1) er såkalte verdi-klasser, med data som skal oppgis ved opprettelsen av objektene og siden ikke skal kunne endres. Group skal inneholde data om antall gjester i gruppa, Table skal inneholde data om antall stoler (capacity) og Seating skal holde rede på bordet en gitt gruppe sitter på.

Oppgave a)

Skriv ferdig Group og Seating, inkludert nødvendige innkapslingsmetoder

Expand
titleLF
Code Block
public class Group {
 
       private final int guestCount;
 
       public Group(int guestCount) {
              this.guestCount = guestCount;
       }
 
       public int getGuestCount() {
              return guestCount;
       }
}
 
public class Seating {
 
       private final Table table;
       private final Group group;
 
       public Seating(Table table, Group group) {
              this.table = table;
              this.group = group;
       }
      
       public Table getTable() {
              return table;
       }
      
       public Group getGroup() {
              return group;
       }
}
Oppgave b)

En skal ikke kunne ha Seating-objekter for bord som ikke har mange nok stoler til hele gruppa som er plassert der. Skriv koden som trengs for å sikre at denne regelen overholdes.

Expand
titleLF

Følgende kode legges øverst i konstruktøren:

Code Block
if (table.getCapacity() < group.getGuestCount()) {
   throw new IllegalArgumentException("The table is too small for the group");
}

Viktig å utløse unntak, ikke bare en if rundt initialiseringskoden.

Oppgave c)

Anta at Group hadde en metode for å endre antall gjester. Forklar med tekst og/eller kode hvilke endringer du måtte gjort for å sikre at regelen i b) overholdes.

Expand
titleLF

Group måtte hatt en referanse til Seating-objektet (eller Table-objektet) som ble satt av Seating, så den kunne kjøre tilsvarende sjekk som over, ved endring av størrelsen. Uten en slik referanse hjelper det ikke å si at en skal sjekke den nye gruppestørrelsen opp mot antall stoler ved bordet. En kan til nød bruk observatør-observert-teknikken, men det er overkill her.

 

Oppgave d)

I tillegg til antall stoler, skal et bord ha et bordnummer. Dette skal være et unikt løpenummer som ikke oppgis, men settes automatisk av kode i Table-klassen selv når Table-objekter opprettes. Det aller første bordet som lages skal få 1 som nummer, det andre skal få 2 osv. Implementer konstruktøren og annen nødvendig kode, inkludert getNum-metoden!

Expand
titleLF

.

 

 

Her er poenget at en trenger en global teller, som en får til i Java ved bruk av static. Denne må brukes og økes i Table sin konstruktør.

Code Block
private static int tableCounter = 1; 
 
private final int num;
private final int capacity;
 
public Table(int capacity) {
       this.num = tableCounter++;
       this.capacity = capacity;
}
 
Expand
titleDel 2 - (40%)

.

Oppgave a)

.

Expand
titleLF

.

 

Oppgave b)

.

Expand
titleLF
.
Oppgave c)

.

Expand
titleLF

 

.


Oppgave d)

.

Expand
titleLF

PlantUML Macro
object "~#diner : Diner" as diner1 {
}
object "~#table1 : Table" as table1 {
   num = 1
   capacity = 4
}
object "~#table2 : Table" as table2 {
   num = 2
   capacity = 4
}
diner1 --> table1: tables
diner1 --> table2: tables
object "~#diner : Diner" as diner2 {
}
object "~#table3 : Table" as table3 {
   num = 3
   capacity = 6
}
diner2 --> table3: tables
diner1 ..> diner2: mergeTables(~#table1, ~#table2, 2)

Oppgave e)

.

Expand
titleLF

.

 

Oppgave f)

.

Expand
titleLF

.

 

...