Versions Compared

Key

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

Denne oppgaven handler om en Person-klasse med en 1-n-assosiasjon med rollene children og mother/father til samme klasse (altså barn-mor/far-forhold) og det å sikre konsistens, slik at foreldre og barn er korrekt knyttet sammen.

En viktig del av det å implementere assosiasjoner er å sikre konsistens, dvs. at objekter i hver ende av en kobling refererer korrekt til hverandre. Et eksempel på dette for 1-n-assosiasjoner er foreldreskap, hvor foreldre og barn er koblet til samme i et slektstre. I denne oppgaven skal en Person-klasse implementeres og de det å legge til (og fjerne) barn håndteres korrekt, som illustrert nedenfor.

...

Fra children-perspektivet har vi følgende to metoder:

  • addChlidaddChild(Person) - oppretter en kobling til et barn (et annet Person-objekt). Dersom Person-objektet som metoden kalles på, er en kvinne, så skal denne bli barnets mor, og motsatt, dersom Person-objektet som metoden kalles på, er en mann, så skal denne bli barnets far.
  • removeChild(Person) - fjerner en kobling til et barn (et annet Person-objekt). Dersom Person-objektet som metoden kalles på, er moren til argumentet, så skal mother-koblingen fjernes, og motsatt, dersom Person-objektet som metoden kalles på, er argumentets far, så skal father-koblingen fjernes.

...

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}

 

marit.addChild(jens)

hallvard.addChild(jens)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}
marit -> jens: children
jens -> marit: mother
hallvard -> jens: children
jens -> hallvard: father 

Opprettelse av koblinger med addChild.

(Samme effekt som under)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}

 

jens.setMother(marit)

jens.setFather(hallvard)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}
marit -> jens: children
jens -> marit: mother
hallvard -> jens: children
jens -> hallvard: father 

Opprettelse av koblinger med setMother og setFather.

(Samme effekt som over)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}
marit -> jens: children
jens -> marit: mother
hallvard -> jens: children
jens -> hallvard: father

 

marit.removeChild(jens)

hallvard.removeChild(jens)


PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}

 

 

Fjerning av koblinger med removeChild.

(Samme effekt som under)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}
marit -> jens: children
jens -> marit: mother
hallvard -> jens: children
jens -> hallvard: father 

 

jens.setMother(null)

jens.setFather(null)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}

Fjerning av koblinger med setMother og setFather.

(Samme effekt som over)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}
object "torkel: Person" as torkel {
}
object "jorunn: Person" as jorunn {
}
marit -> jens: children
jens -> marit: mother
hallvard -> jens: children
jens -> hallvard: father 

jens.setFather(torkel)

jens.setMother(jorunn)

PlantUML Macro
object "hallvard: Person" as hallvard {
}
object "marit: Person" as marit {
}
object "jens: Person" as jens {
}
object "torkel: Person" as torkel {
}
object "jorunn: Person" as jorunn {
}
jorunn -> jens: children
jens -> jorunn: mother
torkel -> jens: children
jens -> torkel: father 
Fjerning og oppretting av kobling med setMother og setFather, en slags "adoption".

Oppgaven er delt i to trinn, den første håndterer children- og mother/father-rollen isolert og uten krav om konsistens, mens det andre skal sikre konsistens.

...

.

Exercise-panelet

Bruk av Exercise-panelet er obligatorisk for denne oppgaven. Du må ha panelet åpent med Person.ex-filen (tests > objectstructures Person.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på hovedsiden for Øving 5.

Del 1

  • Implementer addChild- og removeChild-metodene slik at getChildCount- og getChild-metodene virker som forventet. Disse metodene håndterer altså kun children-rollen.
  • Implementer setMother- og setFather-metodene slik at getMother- og getFather-metodene virker som forventet. Disse metodene håndteres altså kun mother/father-rollen.

Test metodene ved å koble opp Person-objekter tilsvarende din egen familie. Du blir nødt til å bruke de tre metodene addChild, setMother og setFather. Prøv å få med minst tre generasjoner.

...

Del 2

Utvid metodene til å sikre konsistens. Test at det fortsatt virker å koble opp din egen familie, denne gangen ved å bare bruke addChild og ved å bare bruke setMother og setFather. Kjør JUnit-testene som hører til oppgaven.

JExercise-testkode Testkode for denne oppgaven finner du her: objectstructures/PersonTest.java. Originalkoden (jextest) for testen finner du her: objectstructures/Person.jextest.

Include Page
Bunntekst for JExercise- oppgaver
Bunntekst for JExercise- oppgaver