Ohjelmistojen mallintaminen Luokkakaaviot 5.12.2008 Harri Laine 1
Olioiden palvelut Palvelun kuvauksessa annettavat tiedot näkyvyys (kuten attribuuttien kohdalla) nimi (ainoa välttämätön osa) parametrit paluuarvon tyyppi muut määreet Syntaksi (hakasulut eivät kuulu määrittelyyn vaan merkitsevät valinnaisen osan) [näkyvyys] nimi [(parametrit)] [: paluuarvon tyyppi] [{muut määreet}] 5.12.2008 Harri Laine 2
Olioiden palvelut Parametrimäärittelyn muoto on nimi: tyyppi [= oletusarvo] Palvelun sisällön määrittelylle on omat erilliset tekniikkansa, luokkakaaviossa palvelun sisältö voidaan kuvata vain vapaamuotoisena tekstinä 5.12.2008 Harri Laine 3
Olioiden palvelut SSN #chekingchars[31] #date #century #number #checkchar +SSN(init: String) +tostring(): String +isok(): boolean +getbirthdate(): Date +getsex(): int Sosiaaliturvatunnusta kuvaavalla SSN-luokalla on viisi julkista operaatiota, joista yksi on konstruktori Konstruktori saa alustuskoodin parametrinaan Operaatio getbirthdate() palauttaa Date-olion 5.12.2008 Harri Laine 4
Luokkien väliset suhteet 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) 5.12.2008 Harri Laine 5
Riippuvuus 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ä stereotyyppinä [= nimi erityismerkitykselle, tällainen voidaan liittää mihin tahansa mallinnuskohteeseen, merkitykset kiinnitettävä] 5.12.2008 Harri Laine 6
Riippuvuus Luontiriippuvuus: luokan ilmentymä luo toisen luokan ilmentymiä (instantiate) Tehdas <<instantiate>> Tuote Ilmentymäriippuvuus (instance of) Auto <<instance of>> ABC-123:Auto 5.12.2008 Harri Laine 7
Parametroidut luokat Tarkastellaan kompositiota Kurssi * Harjoitusryhmä Ohjelmassa yllä oleva toteutettaisiin todennäköisesti jonkin kokoelmarakenteen avulla, Javassa esimerkiksi Vector-rakenteena. Vector on yleiskäyttöinen kokoelmarakenne, joka voidaan parametroida määrittelemällä kokoelmaan kuuluvien oliden tyyppi 5.12.2008 Harri Laine 8
(huom. Tämä malli on alemmalla abstraktiotasolla kuin edellisen kalvon malli) Vektor kokoelman alkiot sidotaan Harjoitusryhmä luokan olioiksi Vector Element <<bind>> kurssi Kurssi Harjoitusryhmä * 1 ryhmät element {ordered} Vector<Harjoitusryhmä> 1 5.12.2008 Harri Laine 9
ilmentymät Oma:Kurssi ryhmät Oma-ryhmät kurssi element0 element1 Oma/H1:H.ryhmä Oma/H2:H.ryhmä 5.12.2008 Harri Laine 10
Edellä esitettiin eräs tekninen tapa toteuttaa kurssin ja harjoitusryhmän välinen abstrakti kytkentä parametroidun kokoelmaluokan avulla Jokin yksinkertainen ohjelmointikieli ei välttämättä tarjoa tällaista rakennetta ja joudutaan ehkä toteuttamaan lista alkeellisempia rakenteita käyttäen 5.12.2008 Harri Laine 11
kurssi * Kurssi 0..1 0..1 first Harjoitusryhmä 0..1 next 1 Tässä on toteutuksena käytetty listarakennetta. Sitä voi kuitenkin olla kuvasta vaikea hahmottaa, alhaisesta abstraktiotasosta johtuen first next OMa Oma/H1 Oma/H2 5.12.2008 Harri Laine 12
Yksi mahdollisuus tuoda esiin korkeamman tason lista-abstarktio on käyttää yhteistyöhahmoa (collaboration template). Tähän palataan myöhemmin kurssilla. List korkeamman tason abstraktio kurssi header * item olioiden roolit abstraktiossa Kurssi 0..1 0..1 first Harjoitusryhmä 0..1 next 1 5.12.2008 Harri Laine 13
Luokkia määrittelemällä luodaan luokitusjärjestelmä. Eri menetelmät asettavat erilaisia vaatimuksia luokitusjärjestelmälle: joissakin edellytetään, että luokat ovat erillisiä (ei yhteisiä ilmentymiä) toisissa sallitaan päällekkäisyys (yhteiset ilmentymät) 5.12.2008 Harri Laine 14
Luokkahierarkiassa luokka voidaan määritellä toisen luokan alaluokaksi esim. luokka nainen on luokan henkilö alaluokka luokka johtaja on luokan henkilö alaluokka luokat auto, laiva ja lentokone ovat luokan kulkuväline alaluokkia 5.12.2008 Harri Laine 15
Jos luokka A on luokan B alaluokka, siitä seuraa, että jokainen A:n ilmentymä on myös B:n ilmentymä. jokainen johtaja on myös henkilö Tästä taas seuraa, että kaikki attribuutit, palvelut ja yhteydet, jotka on määritelty luokan B ilmentymille, liittyvät myös A:n ilmentymiin. 5.12.2008 Harri Laine 16
Jos henkilölle on määritelty attribuutti Nimi, niin myös johtajalla on automaattisesti Nimiattribuutti. Jos henkilö on määritelty osapuoleksi työsuhdeyhteyteen, myös johtaja voi olla osapuolena työsuhde-yhteydessä. Tätä ilmiötä kutsutaan periytymiseksi (inheritance). 5.12.2008 Harri Laine 17
Periytymisessä yläluokkaan liitetyt attribuutit, palvelut ja yhteydet periytyvät alaluokalle. Huom. periytyminen on luokkien välistä määrittelyjen periytymistä - ilmentymät eivät tässä peri mitään toisilta ilmentymiltä. 5.12.2008 Harri Laine 18
Yläluokan ja alaluokan välinen riippuvuussuhde kuvataan kaaviossa: Alaluokka Yläluokka luokka Johtaja Henkilö 5.12.2008 Harri Laine 19
Alaluokkaan voidaan liittää yläluokalta perittyjen attribuuttien, palvelujen ja yhteyksien lisäksi omia attribuutteja, yhteyksiä ja palveluja. Johtajalla on ominaisuudet vastuualue ja alaisten määrä, joita ei ole henkilöllä yleisesti. Vain johtajalla voi olla oikeus käyttää edustustiliä. Johtajalla voi olla alaisia. 5.12.2008 Harri Laine 20
pomo Johtaja 0..1 vastuualue alaisten määrä alainen 0..* Henkilö 1..* Käyttöoikeus 0..1 Edustustili 5.12.2008 Harri Laine 21
Alaluokkaan voidaan liittää uusia palveluita, joita yläluokalla ei ole. Alaluokassa voidaan myös syrjäyttää (override) yläluokassa määritelty palvelu. Syrjäyttäminen on sisällön uudelleenmäärittelyä. Henkilöllä voisi olla palvelu viikkoraportti: kerro ajankäyttö työtehtäviin Johtajan viikkoraportti-palvelun sisältö voisi olla: kerro ajankäyttö työtehtäviin laadi yhteenveto alaisten viikkoraporteista raportoi edustustilin käyttö 5.12.2008 Harri Laine 22
Syrjäyttäminen on erityisesti olio-ohjelmoinnissa hyödyllinen tekniikka. Olio-ohjelmoinnin merkittävimmät hyödyt tulevat esiin juuri syrjäyttämismahdollisuuden kautta: muokattavat kirjastopalvelut yksinkertaisemmat ohjelmat 5.12.2008 Harri Laine 23
Järjestelmää mallinnettaessa luokkahierarkiasta on eniten hyötyä: sääntöjen ilmaisemisessa kuvauksen ekonomisuudessa (ei tarvitse toistaa samoja asioita useassa luokassa) 5.12.2008 Harri Laine 24
Esimerkki säännöistä: Autolla täytyy olla omistaja. Omistaja voi olla yritys tai henkilö. mahdollinen omistaja 1..* 0..* auto yritys henkilö 5.12.2008 Harri Laine 25
Ellei yläluokkaa käytettäisi: yritys 0..* 0..* yritysomistus auto 0..* Voiko autolla olla - sekä yritys- että henkilöomistaja? - nolla omistajaa? henkilöomistus 0..* henkilö 5.12.2008 Harri Laine 26
Aliluokkia voidaan muodostaa monin erilaisin perustein. henkilö erillisin perustein muodostettuja aliluokkia sukupuoli asema nainen johtaja 5.12.2008 Harri Laine 27
Samaan luokitteluperusteeseen perustuvat poissulkevat aliluokat. henkilö sukupuoli nainen mies 5.12.2008 Harri Laine 28
Kun reaalimaailmassa luokitellaan ilmiöitä, voidaan käyttää samanaikaisesti useita erilaisia luokitteluperusteita: sukupuoli, kengännumero, virka-asema, auton omistus, jne. Monissa oliomenetelmissä ja olio-ohjelmointikielissä ollaan paljon rajoittuneempia. Tyypillisesti esim. ohjelmointikielissä olio ei voi olla usean luokan välitön ilmentymä, mikä johtaa kömpelöihin mallinnusratkaisuihin 5.12.2008 Harri Laine 29
henkilö nainen johtaja Reaalimaailmassa olio voi olla usean luokan välitön ilmentymä. Liisa 5.12.2008 Harri Laine 30
henkilö nainen johtaja Olio-ohjelmointikielissä olio ei yleensä voi olla usean luokan välitön ilmentymä. Liisa 5.12.2008 Harri Laine 31
henkilö johtaja nainen naisjohtaja Oliokielissä olio on yleensä vain yhden luokan välitön ilmentymä. <<instance of>> Liisa 5.12.2008 Harri Laine 32
henkilö johtaja 0..1 naispiirteet Liisa Liisa_naisena alityyppikohtaiset ominaisuudet omana luokkanaan 5.12.2008 Harri Laine 33
Edellinen tilanne johtuu siitä, että olioohjelmoinnissa olio on yleensä esiteltävä johonkin (yhteen) luokkaan kuuluvaksi ja tämä luokka perii vain yläluokkiensa ominaisuudet. Kohdealueen analyysin kannalta rakenne on kömpelö. 5.12.2008 Harri Laine 34
Tilannetta, jossa luokka on useamman kuin yhden luokan välitön alaluokka, kutsutaan moniperiytymiseksi (multiple inheritance). Kaikki olio-ohjelmointikielet eivät tarjoa moniperintää (esim. Javassa ei ole, C++:ssa on). kenraali johtaja sotilas 5.12.2008 Harri Laine 35
Erityisesti toteutuksen moniperiytyminen voi aiheuttaa monikäsitteisyysongelmia esim. kaksi signatuuriltaan samaa operaatiota kaikki olio-ohjelmointikielet eivät tarjoa (toteutuksen eli lauseiden ja lausekkeiden) moniperiytymistä esim. Javassa ei ole, C++:ssa on 5.12.2008 Harri Laine 36