582104 Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä 1
Luokkamallin lisäpiirteitä Erilaiset yhteystyypit kooste kompositio Muita luokkien välisiä suhteita riippuvuudet periytyminen eli luokkahierarkia Yhteysluokkien mallintaminen Mallinnuselementtien erikoistaminen 2
Kooste (aggregation) Erikoistapaus, jossa yhteyden osapuolta voidaan pitää osana toista osapuolta Esitetään yhteysviivan kokonaisuuden puoleisen pään avoimella salmiakkisymbolilla Selventää olioiden välistä semanttista suhdetta ei välttämättä vaikutusta navigointimahdollisuuksiin yleensä kuitenkin kokonaisuudesta on pääsy sen osiin Joukkue * jäsen Pelaaja 3
Kompositio (composition) Koostetta merkittävämpi erikoistapaus, jossa osan olemassaolo kytketty kokonaisuuteen: kun kokonaisuus poistetaan, häviävät myös osat (vrt. kooste) osa(-olio) voi sisältyä vain yhteen kompositio(- olioon) osa ei voi vaihtaa kompositiotaan kokonaisuus vastuussa osien luonnista ja poistamisesta (yksityiskohdat riippuvat yhteyden toteutuksesta) Merkitään suljetulla salmiakkisymbolilla Rakennus osoite 1..* koodi Huone 4
Kompositiosta Kompositio on UML:ssä ainoa tapa ilmaista olemassaoloriippuvuus mallintamisessa tärkeä asia (tärkeämpi kuin osan ja kokonaisuuden yhteys) jos olemassaoloriippuvuus pitää kyetä esittämään, on syytä käyttää kompositiota, vaikka osa-kokonaisuus -yhteys ei aivan selvältä näyttäisikään Kompositiota käytetään myös usein hyväksi olioiden identifioinnissa esim. Exactum-rakennuksen huone C227 5
Muita luokkien välisiä suhteita Edellä on tarkasteltu sellaisia luokkakaavioissa esiintyviä suhteita, jotka ilmenevät olioiden välisinä yhteyksinä Lisäksi UML:ssä voidaan esittää luokkien välisiä riippuvuuksia (dependency) luokkahierarkia (class hierarchy, inheritance hierarchy) 6
Riippuvuus (dependency) Ilmaisee luokan muuttamisen mahdollista vaikutusta toiseen luokkaan Kuvataan katkoviivalla nuolenkärki osoittaa siihen luokkaan, josta viivan toisessa päässä oleva on riippuva riippuvuuden luonne ilmaistaan yleensä stereotyypillä Esim. luontiriippuvuus 7
Luokkahierarkia Luokkahierarkiassa (class hierarchy, inheritance hierarchy) luokka voidaan määritellä toisen luokan aliluokaksi (subclass) Esimerkiksi: luokka Johtaja on luokan Henkilö aliluokka luokat Auto, Laiva ja Lentokone ovat luokan Kulkuväline aliluokkia 8
Ilmentymät ja luokkahierarkia Jos luokka A on luokan B aliluokka (ja B vastaavasti A:n yliluokka), niin jokainen A:n ilmentymä on myös B:n ilmentymä esim. jokainen Johtaja on myös Henkilö Tästä seuraa, että kaikki ominaisuudet, jotka on määritelty luokan B ilmentymille, liittyvät myös A:n ilmentymiin esim. jos Henkilölle on määritelty attribuutti nimi, niin myös Johtajalla on automaattisesti nimiattribuutti esim. jos Henkilö on määritelty osapuoleksi työsuhde-yhteyteen, myös Johtajalla on työsuhdeyhteys 9
Periytyminen Em. ilmiötä kutsutaan periytymiseksi (inheritance) yliluokkaan (super class, base class) liitetyt attribuutit, operaatiot ja yhteydet periytyvät aliluokalle aliluokkaan voidaan liittää lisäksi omia ominaisuuksia Periytyminen on luokkien välistä määrittelyrakenteiden periytymistä, joten ilmentymät eivät peri attribuuttien arvoja toisiltaan moniarvoisuusmäärettä ei voi merkitä periytymissuhteeseen, sillä moniarvoisuus täsmentää ilmentymien välistä yhteyttä 10
Luokkahierarkia eli yleistyssuhteet (generalization) Viiva, jossa yliluokan päässä avoin kolmio Esimerkiksi: johtajalla on vastuualue, jota ei ole henkilöillä yleisesti vain johtajalla voi olla oikeus käyttää edustustiliä johtajalla voi olla alaisia esimies 0..1 Johtaja alainen 0..* Henkilö vastuualue 0..* käyttöoikeus 0..1 Edustustili 11
Luokkahierarkia mallinnuksessa Järjestelmää korkealla tasolla mallinnettaessa luokkahierarkiasta on eniten hyötyä rakenteellisten sääntöjen ilmaisemisessa esim. jokin on joko A tai B kuvauksen ekonomisuudessa ei tarvitse toistaa samoja asioita useassa luokassa tarvittaessa voidaan esittää vain hierarkian juuriluokka 12
Esimerkki rakenteellisesta säännöstä Autolla on tasan yksi omistaja, joka voi olla joko yritys tai henkilö Auto Auto * yritysomistus * henkilöomistus * 0..1 0..1 1 Yritys Henkilö Omistaja Voiko autolla olla - sekä yritys- että henkilöomistaja? - nolla omistajaa? Yritys Henkilö 13
Luokkahierarkian kattavuus Aliluokkia voidaan muodostaa monin eri perustein Luokittelut voivat olla kattavia (complete) tai ei-kattavia (incomplete) poissulkevia (disjoint) tai osittain päällekkäisiä (overlapping) Henkilö Henkilö {complete, disjoint} Nainen Johtaja Nainen Mies Erillisin perustein muodostettuja osin päällekkäisiä aliluokkia Yhteen luokitteluperusteeseen perustuva kattava ja poissulkeva luokittelu 14
Luokittelu mallinnuksessa ja ohjelmoinnissa Kun reaalimaailmassa luokitellaan ilmiöitä, voidaan käyttää samanaikaisesti useita erilaisia luokitteluperusteita esim. sukupuoli, virka-asema, auton omistus, Monissa oliomenetelmissä ja oliokielissä ollaan kuitenkin paljon rajoittuneempia, mikä voi pakottaa kömpelöihin mallinnusratkaisuihin Tyypillisesti esim. ohjelmointikielissä olio ei voi olla usean luokan välitön ilmentymä 15
Luokittelu mallinnuksessa ja ohjelmoinnissa Henkilö Henkilö Nainen Johtaja Nainen Johtaja «instanceof» «instanceof» Naisjohtaja liisa Reaalimaailmassa olio voi olla usean luokan välitön ilmentymä liisa «instanceof» Oliokielissä tarvitaan usein esim. keinotekoinen kokoava yliluokka, koska olio ei voi olla usean luokan välitön ilmentymä 16
Moniperiytyminen (multiple inheritance) Tarkoittaa tilannetta, jossa luokka on useamman kuin yhden luokan välitön aliluokka Johtaja Sotilas Erityisesti toteutuksen moniperiytyminen voi aiheuttaa monikäsitteisyysongelmia esim. kaksi signatuuriltaan samaa operaatiota kaikki olio-ohjelmointikielet eivät tarjoa (toteutuksen eli lauseiden ja lausekkeiden) moniperiytymistä Kenraali esim. Javassa ei ole, C++:ssa on 17
Yhteyden tietojen mallintaminen Yhteyteen voi joskus liittyä myös tietoa Esim. tilanne missä henkilö voi olla (usean) yhtiön osakkeenomistaja Osakkeenomistuksen kannalta tärkeä asia on omistettujen osakkeiden määrä Yksi tapa mallintaa tilanne on käyttää yhteysluokkaa (engl. Association class), eli yhteyteen liittyvää luokkaa, joka sisältää esim. yhteyteen liittyviä tietoja 18
Toinen yhteysluokkaesimerkki Luentomonisteessa mallinnetaan tilanne, jossa henkilö voi olla jäsenenä useassa yhdistyksessä yhdistyksessä on vähintään 1 jäsen Jäsenyys kuvataan yhteytenä, johon liittyy yhteysluokka jäsenyyden alkaminen (liittymisaika) sekä jäsenyyden tyyppi (rooli, eli onko rivijäsen, puheenjohtaja tms...) kuvataan yhteysluokan avulla 19
Kannattaako yhteysluokkia käyttää? Kannattaako yhteysluokkia käyttää? Korkean tason abstrakteissa malleissa ehkä Suunnittelutason malleissa todennäköisesti ei, sillä ei ole selvää, mitä yhteysluokka tarkoittaa toteutuksen tasolla Yhteysluokan voi aina muuttaa tavalliseksi luokaksi Yhteysluokka joudutaankin käytännössä aina ohjelmoidessa toteuttamaan omana luokkanaan, joka yhdistää alkuperäiset luokat joiden välillä yhteys on Tämän takia yhteysluokkia ei välttämättä kannata käyttää alunperinkään 20
Yhteysluokasta normaaliluokaksi Edellinen osake-esimerkki: Esitellään väliluokka Purchase, johon mallinnetaan yhteyden tiedot 21
Kaksio olioa ja yhteyksien lukumäärä Henkilöllä voi olla travels on -yhteyksiä useiden lentoyhtiöiden kanssa Yhteysluokkana Ticket on kerrottu matkan tiedot Henkilö voi olla travels on -yhteydessä moniin eri lentoyhtiöolioihin Saman lentoyhtiöolion (esim. Finnair) kanssa ei kuitenkaan voi olla useampaa yhteyttä! 22
Siis: jos luokkakaaviossa kahden luokan välillä on yhteys, voi kaksi luokkien olioa olla vain yhdessä yhteydessä kerrallaan Esim. olioiden Arto:Person ja Finnair:Airline välillä voi olla vain yksi yhteys, eli Arto voi lentää Finnairilla vain kerran Tämä siitä huolimatta, että kytkentärajoitus on * Artolla voi olla useita lippuja, mutta jokainen täytyy olla eri lentoyhtiöltä! Järkevin ratkaisu ongelmaan on kuvata yhteys omana luokkanaan Henkilöllä voi olla useita lippuja Lippu liittyy tiettyyn lentoyhtiöön ja tiettyyn henkilöön Lentoyhtiön liittyy useita myytyjä lippuja 23
UML:n erikoistaminen Olemme jo ainakin kerran törmänneet kaavioissa merkkien << ja >> sisään kirjoitettuun tekstiin Alla tilanne, jossa AutotonHenkilo- ja Auto-luokkien välisen riippuvuuden (katkoviiva) luonne on tarkennettu Kyseessä on UML:n peruskäsitteen riippuvuus laajennus erikoiskäsitteeksi, eli riippuvuudeksi joka johtuu siitä, että kohteena olevan luokan olioa käytetään parametrina Laajennus ilmaistaan stereotyyppinä, jolla tarkoitetaan tietyn lisämerkityksen antamista halutulle symbolille Stereotyyppi merkitään kaavioon << ja >> välissä olevana kuvaavana sanana 24
UML:n erikoistaminen Stereotyyppi voi liittyä oikeastaan mihin tahansa UML-symboliin tai symbolin osaan Esim. stereotyyppi voi tarkentaa luokan roolia: Luokka on joko entity eli tietosisältöluokka tai control eli toiminnanohjausluokka 25
UML:n erikoistaminen UML:ssä on joukko valmiiksi määriteltyjä stereotyyppejä (kuten create) Stereotyyppejä voi määritellä halutessaan myös itse Stereotyypin voikin ajatella kommentin tapaiseksi lisäselitykseksi, jolla on hyvin määritelty merkitys omissa kaavioissa Eli jos tarvetta, kannattaa tarkentaa, mitä määritellyllä stereotyypillä tarkoitetaan Erikoistetuille käsitteille voidaan myös määritellä oma graafinen symboli Oikeastaan käyttötapauskaavion tikku-ukko on UMLstandardin itse määrittelemä graafinen laajennussymbooli 26