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 p11hallvard {
}
object "marit: Person" as p21marit {
}
object "jens: Person" as p31jens {
}

 

 

hallvardmarit.addChild(jens)

marithallvard.addChild(jens)

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

Opprettelse av koblinger med addChild.

(Samme effekt som under)

Inngåelse av partnerskap: Partner-objektene p1 og p2 kobles sammen med ett kall til setPartner. Før kallet er p1 og p2 ikke koblet sammen, og etter kallet er det koblet sammen.

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

 

jens.setFathersetMother(hallvardmarit)

jens.setMothersetFather(marithallvard)

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

Opprettelse av koblinger med setMother og setFather.

(Samme effekt som over)

Oppløsning av partnerskap: Partner-objektene p1 og p2 kobles fra hverandre med ett kall til setPartner med null som argument. Før kallet er p1 og p2 koblet sammen, og etter kallet er det ikke lenger koblet sammen.

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

 

 

hallvardmarit.removeChild(jens)

marithallvard.removeChild(jens)


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

 

 

Oppløsning og inngåelse av partnerskap i ett: Partner-objektene p1, p2, p3 og p4 er parvis koblet sammen, før ett kall til setPartner kobler sammen p1 og p3, mens p2 og p4 kobles fra deres tidligere partnere.

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 p11hallvard {
}
object "marit: Person" as p21marit {
}
object "jens: Person" as p31 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(nulltorkel)

jens.setMother(nulljorunn)

PlantUML Macro
object "hallvard: Person" as p12hallvard {
}
object "marit: Person" as p22marit {
}
object "jens: Person" as p32jens {
}
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