UML-notaatio staattinen ja dynaaminen mallintaminen

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

SE-02 UML-notaatio staattinen ja dynaaminen mallintaminen Kalvot: Olioperustainen ohjelmistokehitys Tampereen yliopisto, syksy 2000 Roope Raisamo.
18. Abstraktit tietotyypit
Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
– Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä.
19. Unified Modeling Language (UML)
Koostumussuhde Jukka Juslin © Jukka Juslin.
Ohjelmiston tekninen suunnittelu
6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Luokkien väliset koostesuhteet
Luku 5 – Tietojen hakeminen sovelluksiin
UML-notaatio staattinen ja dynaaminen mallintaminen
Luokkakaaviot Luokkakaaviot Tekninen suunnittelu.
Tietokanta.
Tapahtumasekvenssit = Käyttötapausten realisointi
EXtensible Markup Language
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
9. Periytyminen Javassa.
SE-02 Olioperustainen ohjelmistokehitys Tampereen yliopisto, syksy 2000 Roope Raisamo perustuu Kai Koskimiehen Oliokirjaan ja kurssin aiempiin materiaaleihin.
Olioperustainen ohjelmistoprosessi
13. Hyvä ohjelmointitapa (osa 1)
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
Luokan määrittely class-määreellä tMyn1 Luokan määrittely class-määreellä Luokan määrittely tarkoittaa luokan tietojäsenten esittelyä ja jäsenfunktioiden.
Osaamisen ja sivistyksen parhaaksi Oppijan verkkopalveluiden hyväksymistestitapausten kuvausohje.
Systeemityö 2 Tilakaavio – State machine diagram
Muunnos luokkakaaviosta relaatiokaavioon
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
17. Kooste Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa “A on B:n osa” tai “A kuuluu B:hen”. − Koostesuhteessa.
Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 4 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen.
– Ohjelmistojen mallintaminen, mallintaminen ja UML.
Mallinnustavat.
© Jukka Juslin1 Osio2 Olio-ohjelmointi: Merkkijonot eli Stringit Jukka Juslin.
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
FunktiottMyn1 Funktiot Funktiot voidaan jakaa –Kirjastofunktioihin, jotka ovat valmiina kaikkien käytössä. Erikoisempien kirjastofunktioiden käyttöönotto.
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Sequence Diagram Jani Keskitapio, Annika Alakastari, Heng Qing Zhu TIK9SNA.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
– Ohjelmistojen mallintaminen Unified Modeling Language (UML)
8. Periytyminen Sisällys Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö.
Ohjelmistojen mallintaminen, sekvenssikaaviot
Koostekaavio– composite structure diagram Mikko Näpänkangas.
Olio-ohjelmoinnin perusteet luento 7
Päivi Ovaska Tutkijaopettaja LTY/Tite
Tietojärjestelmät ja Systeemisuunnittelu
Kertausta: Ohjelmistotuotantoprosessin vaiheet ● Vaatimusanalyysi- ja määrittely – Mitä halutaan? ● Suunnittelu – Miten tehdään? ● Toteutus – Ohjelmointi.
UML-luokkakaavio ● Luokkakaavio (class diagram) kuvaa järjestelmän luokkarakennetta ● Mitä luokkia on olemassa ● Minkälaisia luokat ovat ● Luokkien suhteet.
17. Kooste.
Ohjelmistotekniikan menetelmät, luokkamallin laatiminen
11. Rajapinnat.
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
Sekvenssikaavio– Sequence diagram Lassi Kemppainen
14. Hyvä ohjelmointitapa.
8. Periytyminen.
4. Attribuutit.
– Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä
Ohjelmistotekniikan menetelmät, sekvenssikaaviot
UML-notaatio staattinen ja dynaaminen mallintaminen
3. Attribuutit.
8. Periytyminen.
4. Luokan testaus ja käyttö olion kautta
Esityksen transkriptio:

UML-notaatio staattinen ja dynaaminen mallintaminen Kalvot: Olioperustainen ohjelmistokehitys Tampereen yliopisto, syksy 2000 Roope Raisamo

Staattinen mallintaminen Luokkakaavio (class diagram, static structure diagram) kuvaa järjestelmään kuuluvia luokkia ja niiden välisiä suhteita. tärkein järjestelmän staattisen rakenteen mallinnusväline

Luokkakaavio Ohjain Kohde Varasto KohdeHallinto HenkilöAuto ParkkiAlue 1 Kohde 1 Varasto palauta() varaa() otaKäyttöön() hallinnoi KohdeHallinto * 1 palautaKohde(Kohde, Varasto) varaaKohde(Kohde) otaKäyttöönKohde(Kohde) HenkilöAuto ParkkiAlue rekisterinumero Talleta huolto- informaatio (palauta kutsuu) huolla(int km) palauta()

Staattinen mallintaminen: luokkakaavio Luokkasymbolin osat: attribuutit {näkyvyysmääre} nimi {[kertautuminen]} {: tyyppi} {= alkuarvo} {lisätietomääreet} näkyvyysmääreet: public +, protected #, private – attribuutit primitiivityyppejä, eivät mallissa olevia luokkia (nämä kuvataan assosiaatioina) staattinen attribuutti alleviivattuna vakiot merkitään lisätiedolla {const}

Staattinen mallintaminen: luokkakaavio Luokkasymbolin osat: operaatiot {näkyvyysmääre} nimi {parametrilista} {: palautustyyppi} {lisätietomääreluettelo} parametreista annetaan tiedonvälityksen suunta (in, out, inout), nimi, tyyppi sekä mahdollinen oletusarvo staattinen operaatio alleviivattuna avoin virtuaalioperaatio kursiivilla tai lisätiedolla {abstract} toteutus operaation kommenttina, jos halutaan

Luokkalaatikko Henkilö nimi: String ikä: Integer = 0 ristiminen(n: String) tervehdi() vanhene() ikä++

Geneerinen luokka ja sen ilmentymäluokka WinType Window<Xwindow> Window {abstract, author = KK status = tested} geneerinen parametri +size #visibility: Boolean = false -xptr: WinType +display() hide() +create() -attachXWindow(xwin: WinType*)

Assosiaatiot Assosiaatioilla (association) kuvataan luokkien väliset suhteet. edustaa jotain sellaista luokkien välistä suhdetta, jolla on tietty pysyvyys sellaiset hetkelliset suhteet, jotka kestävät vain tietyn operaation suoritusajan, eivät yleensä ole edustettuna assosiaatiolla assosiaation ajoaikainen ilmentymä on linkki (link), joka vallitsee kahden olion välillä

Assosiaation perusrakenne assosiaatiolla on yleensä nimi nimen yhteyteen voidaan merkitä nuolisymboli, joka kuvaa nimen lukusuunnan Person owns Car 0..1 *

Roolit assosiaation pää on nimeltään rooli, jolla voi olla nimi jos assosiaatio liittyy molemmissa päissään samaan luokkaan, molemmilla rooleilla on syytä olla nimi roolin yhteydessä voidaan myös ilmoittaa rajapinta muodossa roolinimi:rajapintanimi roolin ilmentymä = olioliitos

Roolinimet assosiaatiossa 0..1 * Yritys Henkilö työnantaja työntekijä :IWorker rajapinta

Assosiaation kertautuminen rooli ilmaisee myös assosiaation kertautumisen kertautuminen ilmoitetaan listalla kokonaislukuvälejä * tarkoittaa mielivaltaisen monta 0..1 tarkoittaa kertautumista "yksi tai ei yhtään” 0..* voidaan antaa lyhyesti * i..i voidaan lyhentää i jos kertautumista ei ole merkitty, se on määrittelemätön (eikä siis esimerkiksi 1 jos olioliitoksilla on mallin kannalta olennainen keskinäinen järjestys, rajoite "{ordered}" voidaan liittää rooliin

Moninkertainen assosiaatio Kurssi Opettaja 1..* * Jos assosiaation kertautuminen on suurempi kuin 1, kutsumme assosiaatiota moninkertaiseksi.

Assosiaatioluokka Joskus assosiaatioon liittyy muutakin tietoa ja/tai toiminnallisuutta, joka halutaan esittää luokkakaaviossa. Tällöin assosiaatioon voi liittää oman luokan, jossa annetaan normaaliin tapaan attribuutteja ja operaatioita. Linkit ovat assosiaatioluokan ilmentymiä. Assosiaatioluokkaan voi liittyä puolestaan muita assosiaatioita kuten mihin hyvänsä luokkaan. Assosiaatioluokalle ei tarvitse antaa nimeä, jos assosiaatiolla on sellainen. Assosiaatioluokka liitetään itse assosiaatioon katkoviivalla.

Assosiaatioluokka Yritys Henkilö * työskentelee * työnantaja työntekijä nimi osoite nimi sosturvatunnus osoite päällikkö 0..1 työsopimus aika palkka johtaa

Yksilöinti Jos assosiaatioon liittyy tieto, joka määrää assosiaation ilmentymien toisessa päässä olevien olioiden joukon, tämä tieto voidaan esittää nk. yksilöintinä (qualification). Yksilöinti liittyy siis aina moninkertaiseen assosiaatioon. Tavallisesti yksilöinti muuttaa kertautuvan pään kertautumisen "1":ksi (tai "0..1":ksi); tällöin yksilöinti määrää linkin toisessa päässä olevan olion yksiselitteisesti. Yksilöinti merkitään luokkasymboliin liittyvänä pienenä laatikkona, jonka sisään kirjoitetaan linkin yksilöivä tieto; yksilöinti tarkentaa olion vastakkaisessa päässä. Usein yksilöivä tieto on vastakkaisella puolella olevan luokan attribuutti. Huomaa, että yksilöinti ei muuta sen pään kertautumista, johon se piirretään.

Yksilöinti (aiemmin: kvalifiointi) Kirjasto Henkilö 1 kokoelma sijainti Henkilö nimi osoite lainaaja nro lainaa * 1

Navigointi Assosiaatioon voidaan liittää myös tieto siitä, että toteutuksen on varmistettava navigoitavuus, ts. että assosiaation ilmentymää voidaan käyttää helposti siirtymiseen oliosta toiseen. Tämä tehdään piirtämällä nuolen kärki assosiaation päähän; tällöin edellytetään, että navigointi on mahdollista toisesta päästä tähän päähän.

Kooste Kooste (aggregation) on erityinen assosiaatiolaji Kooste esittää suhteen "on-osa" tai "kuuluu" luokkien (ilmentymien) välillä. Koska tämä suhde on merkittävä erikoistapaus, sille on oma symbolinsa: pieni vinoneliö sisältävässä päässä (siis suhteen "A on-osa B:tä" B-päässä). Tämä symboli korvaa tavallisesti assosiaation ja roolien nimet. Koosteeseen voidaan soveltaa normaaliin tapaan kertautumista ja yksilöintiä. Koostesuhteen tulisi aina olla luonteeltaan transitiivinen ja asymmetrinen.

Kooste (ja navigoitavuus) (aiemmin: aggregaatio) 3..* Monikulmio Piste {ordered} pinta-ala x-koord y-koord

Aito kooste Aito kooste (composition) tarkoittaa koostesuhdetta, jossa osaolio riippuu isäntäoliostaan kahdella tavalla: osa ei voi olemassa ilman isäntäänsä, ja osa voi olla vain yhden isännän osa. Tällöin isännän tulee yleensä huolehtia osan luonnista ja hävittämisestä. Aito kooste merkitään kuten kooste, mutta vinoneliö on musta.

Aito kooste Valtioneuvosto Ministeri 1..*

Periytyminen Periytyminen kuvaa erikoistus/yleistys-suhteen kahden luokan (yliluokan ja aliluokan) välillä. Suhde piirretään kolmiokärkisenä yliluokkaan osoittavana nuolena. Jos luokalla on useita aliluokkia, nuolet voidaan piirtää joko erikseen tai yhdistettynä samaan kärkeen. Moniperiytyminen on sallittua.

Rajapinnan toteutus Rajapinta esitetään joko stereotyypillä <<interface>> varustetulla luokkasymbolilla tai pyöreällä rajapintasymbolilla. Jos luokka toteuttaa rajapinnan, piirretään edellisessä tapauksessa toteutussuhdetta kuvaava nuoli (kuten periytyminen, mutta katkoviivalla) luokasta rajapintaan. Jälkimmäisessä tapauksessa rajapintaympyrä yhdistetään yksinkertaisella viivalla luokkasymboliin. Luokkasymbolin käyttäminen rajapinnan kuvaukseen on hyödyllistä silloin, kun halutaan näkyville rajapinnan tarjoamat operaatiot.

Periytymis- ja toteutussuhde Car Vehicle <<interface>> Vehicle Car

Aktiivinen luokka Jos luokan ilmentymät ovat oman prosessin omaavia aktiivisia olioita, kutsumme myös luokkaa aktiiviseksi. Aktiivinen luokka kuvataan luokkasymbolilla, jonka rajaviivat ovat paksunnettuja. Vastaavasti aktiivisen luokan ilmentymä kuvataan paksureunaisella oliosymbolilla. Aktiiviselle luokalle voidaan antaa ylimääräinen lohko, jossa luetellaan signaalit, joihin luokan ilmentymät reagoivat.

Aktiivinen luokka <<controller>> DeviceController currentConfiguration Signals deviceInterrupt userInterrupt seriousFlaw paksu reuna

Dynaaminen mallintaminen Dynaaminen malli kuvaa sovelluksen käyttäytymisen suorituksen aikana. sekvenssikaaviot (sequence diagram) kuvaavat, miten joukko olioita toimii yhteistoiminnassa korostavat olioiden välistä vuorovaikutusta tilakaaviot (statechart diagram) kuvaavat yhden olioluokan täydellisen käyttäytymisen korostavat yhden olion reagoimista ulkoa tuleviin tapahtumiin

Sekvenssikaavio Sekvenssikaavio (sequence diagram) koostuu tiettyyn vuorovaikutukseen liittyvistä olioista ja niiden välisistä sanomista (message). sekvenssikaaviota käytetään kuvaamaan oliojoukon välistä vuorovaikutusta tietyssä tilanteessa aika kulkee ylhäältä alas vuorovaikutustapahtumat ovat vaakasuuntaisia nuolia osallistujat kuvataan pystyviivoina kuvaa usein olioiden vuorovaikutuksen tietyn käyttötapauksen yhteydessä

Sekvenssikaavio: Palautus alijärjestelmä UI : KohdeHallinto auto: HenkilöAuto parkki: ParkkiAlue palauta(auto, parkki) palauta() varastoi(auto)

Skenaariot Skenaario kuvaa yhden mahdollisen tapahtumasarjan sovelluksen suorituksen aikana. Skenaariokuvaus keskittyy olioiden vuorovaikutuksen esittämiseen. yleensä haarautumaton tapahtumajono voidaan kuvata tavallisena tekstinä käyttötapaus voidaan kuvata skenaariona kuvaa myös sovelluksen sisäistä toimintaa

Skenaariokaaviot Skenaariokaavio (sequence diagram, event trace diagram, interaction diagram, scenario diagram) on skenaarion formaali kuvaus. UML:ssä käytetään sekvenssikaavioita Käytöltään hyvin saman tapaisia (käytännössä samoja) kuin sekvenssikaaviot, mutta skenaariokaavioilla on notaatiosta riippuen erilaisia ominaisuuksia ja ulkoasuja.

Skenaariokaaviot

Sekvenssikaavion merkinnät Usein sekvenssikaavio kuvaa olioiden välisiä operaatiokutsuja. Kontrollin omistus voidaan esittää paksunnettuna jaksona, aktivaatiopalkkina, olioviivassa: oliolla on kontrolli, jos sen operaatiota on kutsuttu eikä operaatiosta ole vielä poistuttu. Operaatioiden paluut voidaan haluttaessa esittää katkoviivanuolina, joskin aktivaatiopalkki ilmaisee myös paluun.

Sekvenssikaavion merkinnät Paluunuoleen voidaan liittää mahdollinen paluuarvo, vastaavasti kuin kutsunuoleen voidaan liittää kutsun todelliset parametrit. Olio voi kutsua myös omaa operaatiotaan; tällöin kutsunuoli tekee 180 asteen käännöksen. Kun olio kutsuu omaa operaatiotaan, sisemmän kutsun aktivaatiopalkki siirtyy hieman oikealle.

Olion luominen ja hävitys sekvenssikaaviossa Olion luominen kuvataan sekvenssikaaviossa sanomana, joka suuntautuu itse oliolaatikkoon Vastaavasti olion hävittäminen kuvataan sanomana, joka suuntautuu olioviivan lopussa olevaan vinoristiin vinoristi esittää olion häviämistä.

Olion luominen ja hävitys sekvenssikaaviossa : C2 x: C1 op1(x) op2() true

Käyttäjä sekvenssikaaviossa Järjestelmän ulkoinen toimija (kuten esimerkiksi käyttäjä) voi olla myös osallistujana sekvenssikaaviossa. käyttäjällä on oma ikoninsa, tikku-ukko. käyttäjän toimenpiteet kuvataan sanomina käyttäjältä jollekin järjestelmään kuuluvalle oliolle esimerkiksi käyttöliittymän kautta tapahtuvat valinnat, napin painallukset ym. käyttäjälle annettava informaatio kuvataan sanomina joltain järjestelmän oliolta käyttäjälle. esimerkiksi ilmoitukset, dialogit, kyselyn tulokset ym.

Sanomat ja signaalit Olioiden välinen sanoma sekvenssikaaviossa voi edustaa synkronista operaatiokutsua tai asynkronista signaalin lähettämistä. Aktiiviset, rinnakkaisia prosesseja edustavat oliot kommunikoivat tyypillisesti signaalein pikemmin kuin operaatiokutsuin. Asynkroniselle signaalille voidaan haluttaessa käyttää omaa nuolisymbolia, mutta yleensä tämä ei ole tarpeen: asia käy ilmi yhteydestä.

Sanomat ja signaalit Myös käyttäjä edustaa omaa rinnakkaista prosessiaan, joka kommunikoi järjestelmän kanssa signaalein. Aktiivisten olioiden tapauksessa aktivaatiopylväät eivät useinkaan tuo uutta informaatiota, koska oliot ovat periaatteessa jatkuvasti aktiivisia; tällöin pylväät kattavat olion koko eliniän.

Aikamerkinnät Sekvenssikaavion aikaskaalalle (tiettyyn kohtaan kuviteltua pystyssä olevaa aikajanaa) voidaan asettaa aikamerkkejä (timing mark), jotka edustavat kyseistä ajanhetkeä. Näitä aikamerkkejä voidaan käyttää esimerkiksi rajoitteissa kuvaamaan tiettyjä reaaliaikavaatimuksia. Myös sanoman lähettämisen viemää aikaa (esimerkiksi maksimiaikaa) voidaan tällä tavoin spesifioida. Jos sanoman lähettämisen viemä aika on olennaista mallissa, sanomanuoli piirretään vinoon alaspäin.

Suorituslogiikka Sekvenssikaavion pääasiallinen tarkoitus on kuvata yhtä mahdollista tapahtumasarjaa järjestelmän toiminnassa eikä määritellä tietyn toiminnan tai operaation yleistä suorituslogiikkaa. Niinpä algoritmiset ilmaisut kuten ehdollisuus ja toisto eivät ole periaatteessa välttämättömiä sekvenssikaavioissa. Silti tällaiset ilmaisut voivat olla joskus hyödyllisiä lyhennysmerkintöjä: niiden avulla voidaan samalla sekvenssikaaviolla kuvata useita mahdollisia tapahtumasarjoja. Tästä syystä myös UML:ssä on sekvenssikaavioihin otettu mukaan ilmaisut ehdollisuudelle ja toistolle.

Suorituslogiikka Ehdollisuus kuvataan sanomana, joka haarautuu lähtökohdastaan Kumpaankin haaraan voidaan liittää hakasuluissa ehto, jonka vallitessa tämä haara valitaan. Kukin haara edustaa omaa erillistä alisekvenssikaaviota haarojen yhdistymiskohtaan saakka . Toisto kuvataan liittämällä sanoman nimen eteen toistomääre muodossa *[...], missä hakasulkujen sisällä annetaan mielivaltainen toistoa kuvaava ilmaus (esimerkiksi i = 1..n).

Herätyskellon sekvenssikaavio SET M 9 3 ALARM H : Ohjaus : SoittoYks : Valo :User Näytä aika Paina ALARM sytytä {t = soittoaika} aloita soitto t Paina ALARM lopeta soitto Paina ALARM sammuta

Sekvenssikaavion ja luokkakaavion yhteys Vaikka sekvenssikaavio ja luokkakaavio kuvaavat varsin erilaisia näkökulmia ohjelmistoon, niillä on myös yhtymäkohtia: Jos sekvenssikaaviossa luokan A ilmentymä lähettää sanoman s luokan B ilmentymälle, on s:n oltava joko B-luokan operaatio tai jos B on aktiivinen luokka, B:n tunnistama signaali. Kummassakin tapauksessa s:n tulee esiintyä B:n yhteydessä luokkakaaviossa ja mahdollisten todellisten parametrien tulee täsmätä operaation kutsumuodon kanssa. Luokkien A ja B välillä on myös todennäköisesti oltava assosiaatio, koska sanoman lähettäminen viittaa suhteeseen näiden luokkien välillä. Jos A-olio kommunikoi usean eri B-olion kanssa sekvenssikaavioissa, tulee assosiaation olla moninkertainen.