582104 Ohjelmistojen mallintaminen luokkamallin laatiminen 1
Oliot ja luokat Ohjelmistokehitys perustuu usein oletukseen: Minkä tahansa järjestelmän katsotaan voivan muodostua olioista, jotka yhteistyössä toimien ja toistensa palveluja hyödyntäen tuottavat järjestelmän tuottamat palvelut Mikä siis on olio? jokin ohjelman tai sen sovellusalueen kannalta mielenkiintoinen asia tai käsite, tai ohjelman osa yhdistää tietoa ja toiminnallisuutta omaa identiteetin, eli erottuu muista olioista omaksi yksilökseen 2
Lähestymistapoja Kokonaisvaltainen lähestymistapa (top-down) etsitään kerralla koko kohdealuetta kuvaavaa mallia hankalaa, jos kohdealue on laaja ensin karkea yleiskuva, sitten lisää yksityiskohtia JA/TAI Osista kokonaisuuteen (bottom-up) jaetaan kokonaisuus osiin ja tehdään osakohtaisia malleja, jotka sitten yhdistetään kokonaismalliksi osa voisi olla esimerkiksi käyttötapaus yksityiskohdista yleiskuvaan 3
Suunnittelu- ja toteutusvaiheen oliot ja luokat Oliota ja luokkia ajatellaan usein ohjelmointitason käsitteinä Javassa määritellään luokka class Henkilo { } Ja luodaan olioita Henkilo arto = new Henkilo() Ohjelma siis muodostuu olioista Oliot elävät koneen muistissa Ohjelmiston suunnitteluvaiheessa suunnitellaan mistä oliosta ohjelma koostuu ja miten oliot liittyvät toisiinsa Nämä oliot sitten toteutetaan ohjelmointikielellä toteutusvaiheessa Mistä suunnitteluvaiheen oliot tulevat? Miten ne keksitään? 4
Perussanasto Luettelo organisaation toiminnan kannalta keskeisistä käsitteistä ja niiden määritelmistä Voidaan esittää Koko organisaatiolle liiketoimintatason sanasto Kullekin kohdealueelle tarkemmin ja liiketoimintatason sanastoa laajentaen Auttaa luokkamallin laatimisessa Olioiden, olioiden välisten suhteiden ja olioluokkien löytäminen 5
Liiketoimintatason luokkamalli Liiketoiminnalliset oliot (business entity) Vain organisaation päätoiminnallisuus ja peruskäsitteet Ei sisällä suunnittelu- eikä toteutustason käsitteitä (esim. käyttöliittymä- tai tietokantayhteysluokkia) Olioiden väliset yhteydet (association) Osallistumisrajoitteet (multiplicity) Koosteisuus (aggregation, composition) Yleistyssuhteet (generalizations) eli periytymishierarkia Ns. POJO-malli (Plain Ordinary Java Objects) 6
Luokkakaaviot UML:ssä Luokkakaavioilla kuvataan Ohjelmiston tai muun järjestelmän rakenne Olioiden tietosisältö Olioiden ja olioluokkien väliset suhteet Olioiden tarjoamat palvelut 7
Luokka- ja oliokaaviot Luokkaa kuvataan laatikolla, jonka sisällä on luokan nimi Kuten pian näemme, laatikossa voi olla myös muuta Luokan instansseja eli sen mukaisia olioita kuvataan myös laatikolla, erona on nimen merkintätapa Nimi alleviivattuna, sisältäen mahdollisesti myös olion nimen Oliokaavio kuvaa tietyn hetken tilanteen, olemassa 3 henkilöä 8
Esimerkit luokka- ja oliokaavioista Kuvassa Person-luokka ja kolme Person-olioa Kolmas olioista on nimetön Luokkia ja olioita ei sotketa samaan kuvaan, kyseessä onkin kaksi kuvaa: vasemmalla luokkakaavio ja oikealla oliokaavio 9
Attribuutit luokka- ja oliokaavioissa Tietyn luokan olioilla on attribuutteja eli muuttujia ja operaatiota eli metodeja Nämä määritellään luokkamäärittelyn yhteydessä Aivan kuten Javassa kirjoitettaessa class Person{ } määritellään kaikkien Person-olioiden attribuutit ja metodit luokan määrittelyn yhteydessä Luokkakaaviossa attribuutit määritellään luokan nimen alla omassa osassaan laatikkoa Attribuutista on ilmaistu nimi ja tyyppi (voi myös puuttua) Oliokaaviossa voidaan ilmaista myös attribuutin arvo 10
Luokan ilmentymän (olion) kuvaaminen Ilmentymäviitteessä esitetään alleviivattuna joko Ilmentymän nimi/tunniste Luokan nimi Molemmat Alemmassa osassa annetaan ilmentymän attribuuttien arvot Ilmentymiä käytetään yleensä vain esimerkkeinä 11
Operaatiot luokkakaavioissa Luokan olioiden metodit eli operaatiot merkitään laatikon kolmanteen osaan Luokkiin on pakko merkitä ainoastaan nimi Attribuutit ja operaatiot merkitään jos tarvetta Usein operaatioista merkitään ainoastaan nimi, joskus myös parametrien ja paluuarvon tyyppi Attribuuttien ja operaatioiden parametrien ja paluuarvon tyyppeinä voidaan käyttää yksinkertaisia tietotyyppejä (int, Double, String, ) tai rakenteisia tietotyyppejä (taulukko). Tyyppi voi olla myös luokka, joko itse määritelty tai asiayhteydestä itsestäänselvä 12
Luokkasymbolin osat 13
Kirahvi (Giraffa camelopardalis) Korkein maanisäkäs. Uroksen korkeus on 4,8 5,5 metriä ja paino jopa 900 kiloa. Kaulanikamia on seitsemän kuten muillakin nisäkkäillä ja niiden pituus on noin 40 cm. Kirahvin turkissa on vaalealla pohjalla eri kokoisia ja muotoisia läiskiä, joiden väri vaihtelee oranssista lähes mustaan. Jokaisen yksilön kuviointi on erilainen. Kirahvi voi elää luonnossa noin 25vuotiaaksi, tavallisesti elämänkaaren pituus on noin 15 20 vuotta. [Wikipedia] 14
Luokan attribuutit Kuvaavat olioiden tietosisällön muodon Attribuutista voidaan esittää Nimi (välttämätön) Tietotyyppi (String, Date, int, Kirahvi). Arvojen lukumäärä (multiplicity) Oletusarvona 1, epämääräisen monta = * Annetaan hakasuluissa, [5..*] Näkyvyys (visibility) Oletusarvo Muita määreitä 15
Attribuutin tyyppi ja arvo Attribuutin arvolla on tyyppi Tyyppi erotetaan attribuutin nimestä kaksoispisteellä (vrt. ilmentymän esittäminen) pvm: Date tai merkki: char Arvo voi olla perustietotyypin arvo, vaikkapa int UML ei rajoita perustietotyyppejä Olio, jolloin tietotyyppinä on olion luokka Olioarvoiset attribuutit esitetään tässä yhteydessä vain, jos olion luokka on perustietotyyppimäinen. String, Date, Color, Point Muutoin kyseessä on yhteys (association) 16
Attribuuttilajit ja lisämääreet Attribuutit ovat yleensä ilmentymäattribuutteja (instance attribute) Jokaisella luokan ilmentymällä on oma arvonsa UML:ssä myös luokka-attribuutteja (class attribute) Attribuutilla luokkakohtainen arvo Ilmaistaan alleviivaamalla attribuutin nimi Esim. Eläinten lukumäärän laskeminen Attribuutille voi antaa kaarisulkeissa { } lisämääreitä UML:ssä valmiina, esim. Frozen Mallintaja voi käyttää myös omia lisämääreitä 17
Näkyvyysmääreet Tekniikka attribuutin tai operaation käytön rajoittamiseen Merkitään erikoismerkillä tai ikonilla nimen eteen Vaihtoehdot: Private (-) sallii käytön vain luokan omissa operaatioissa Protected (#) sallii käytön myös luokan aliluokissa määriteltävissä operaatioissa Package (~) sallii käytön myös muissa saman paketin luokissa määriteltävissä operaatioissa Public (+) sallii käytön kaikkialla Käytetään usein vain ohjelmointiläheisessä kuvauksessa 18
Esimerkki: erilaisia attribuutteja Luokka-attribuutti seurvapaanro Näkyvyyssäännöt Private (-) Protected (#) Package (~) Public (+) Tietotyypit Int, String, decimal, Date Lisämääreet {frozen} 19
Esimerkki: erilaisia attribuutteja Luokkakohtainen seurvapaanro kertoo seuraavan vapaan tilinumeron Protected-määreet ovat käytettävissä tämän luokan ja aliluokkien operaatioissa Tilinumero:a ei voi muuttaa olion luonnin jälkeen 20
Esimerkki: erilaisia attribuutteja Tapahtumat on moniarvoinen attribuutti, tyyppi jätetty määrittelemättä Attribuutteihin tapahtumat ja saldo voi viitata vain luokan omissa operaatioissa Attribuuttiin valuuttakoodi voi viitata kaikissa niissä luokissa, jotka sijaitsevassa samassa pakkauksessa kuin tämä luokka 21
Attribuutit: UML ja Java UML-luokka vastaa Javan luokkaa Javan staattiset kentät (static field) vastaavat luokka-attribuutteja Muut Java-luokassa määritellyt kentät vastaavat ilmentymäattribuutteja UML:n näkyvyysmääreet vastaavat varsin hyvin Javan modifier-määreitä UML:n lisämääreet ({frozen}) saatetaan joutua toteuttamaan itse Javasta löytyy määreitä, jotka jäävät UML:ssä mallintajan kirjoitettavaksi (synchronized, strictfp) 22
Olioiden väliset yhteydet Ohjelmat sisältävät useita olioita Olioiden välillä on erilaisia yhteyksiä Työntekijä työskentelee Yrityksessä, Henkilö omistaa Auton, Henkilö ajaa Autolla, Auto sisältää Renkaat, Henkilö asuu Osoitteessa, Henkilö omistaa Osakkeita, Työntekijä on Johtajan alainen, Johtaja johtaa Työntekijöitä, Johtaja erottaa Työntekijän, Opiskelija on ilmoittautunut Kurssille Yhteys voi olla joko pysyvämpiluontoinen tai hetkellinen Olemme seuraavassa kiinnostuneita lähinnä pysyvämpiluontoisista yhteyksistä 23
Yhteydet (association) Yhteydet merkitään luokkakaavioon luokkien välisinä viivoina tai nuolina Yhteys merkitsee kyseisten luokkien ilmentymien välistä suhdetta Olioiden väliset yhteydet toteutetaan ohjelmakoodissa olioarvoisena attribuuttina.. Tai jotain muuta epäsuoraa, mutta pysyväisluonteista viittausta käyttäen 24
Yhteydet ohjelmakoodissa Ohjelmakoodissa pysyvä yhteys ilmenee yleensä luokassa olevana olioviitteenä, eli attribuuttina jonka tyyppinä on luokka Ihminen omistaa Auton: class Auto { } void aja() { System.out.println("liikkuu"); } class Ihminen { Auto omaauto; // viite olioon, jonka tyyppinä Auto Ihminen(Auto a) { omaauto = a; } } void menetöihin() { omaauto.aja(); } 25
Olioiden väliset yhteydet Olioviite voitaisiin periaatteessa merkitä luokkakaavioon attribuuttina, kyseessähän on teknisessä mielessä attribuutti Näin ei kuitenkaan ole tapana tehdä Parempi tapa on kuvata olioiden välinen yhteys luokkakaaviossa Jos Henkilö- ja Auto-olion välillä voi olla yhteys, yhdistetään Henkilö- ja Auto-luokat viivalla 26
Yhteysviivatyypeistä Erilaisia viivatyyppejä käytetään merkitsemään erilaisia asioita Assosiaatio, riippuvuus, yleistys Yhteystyypin valinta kertoo painotuksesta Kaavioiden tehtävänä parantaa ihmisten välistä kommunikaatiota 27
Yhteydet: kytkentärajoitteet ja roolit Ohjelmakoodissa jokaisella henkilöllä on täsmälleen yksi auto ja auto liittyy korkeintaan yhteen henkilöön Nämä voidaan kuvata luokkakaaviossa kytkentärajoitteina Alla yhteyden oikeassa päässä on numero 1, joka tarkoittaa, että yhteen Henkilö-olioon liittyy täsmälleen yksi Auto-olio Yhteyden vasemmassa päässä 0..1, joka tarkoittaa, että yhteen Auto-olioon liittyy 0 tai 1 Henkilö-olioa Auton rooli yhteydessä on olla henkilön omaauto, rooli on merkitty Auton viereen Huom: roolin nimi on sama kun luokan Henkilö attribuuti jonka tyyppinä Auto Henkilön rooli yhteydessä on olla omistaja 28
Yhteydet: moniarvoisuusmääreet Esimerkissämme yhdellä Henkilö-oliolla on yhteys täsmälleen yhteen Auto-olioon Eli yhteyden Auto-päässä on kytkentärajoitteena 1 Jos halutaan mallintaa tilanne, jossa kullakin Henkilö-oliolla voi olla mielivaltainen määrä autoja (nolla tai useampi), niin kytkentärajoitteeksi merkitään * Alla tilanne, jossa henkilö voi omistaa useita autoja Kullakin autolla joko 0 tai 1 omistajaa 29
Moniarvoisuusmääreet (multiplicity) Kertoo, moniko yhteysluokan ilmentymä yhteyteen liittyy Esim. 1, *, 0..1 tai 1..* Alaraja 0 kertoo yhteyden olevan valinnainen Yläraja * kertoo yhteyksiä voivan olevan määrittelemätötömästi Lyhennysmerkinnät 1=1..1 ja * = 0..* 30
Esimerkki moniarvoisuusmääreestä Määritellään Java-ohjelmassa Pankkitili-luokan omistus-attribuutti seuraavasti Asiakas[] omitus = new Asiakas[3]; Tarkoittaen, että pankkitilillä voi olla korkeintaan kolme omistajaa Vaaditaan lisäksi, että pankkitilillä on oltava vähintään yksi omistaja Tämä ilmaistaan UML:llä näin: 31
Yhteyden navigoituvuus Yhteyskuvauksiin liitetty nuoli ilmaisee, että kyseessä on suunnattu yhteys Pankkitili tuntee omistajansa, mutta omistaja ei muista tilejään Tarvittaessa yhteydet voidaan suunnata molemminsuuntaisiksi 32
Esimerkki oliokaaviona 33
Yhteyksien yhdistäminen ja nimeäminen Ilmentymätasolla navigoitavat yhteydet ovat aina kaksisuuntaisia. Tällöin yhteydet voidaan yhdistää: Yhteydelle voi antaa nimen molempiin suuntiin Yhteyttä ei ole pakollista nimetä Nuoli yhteyden nimessä merkitsee lukusuunnan 34
Roolinimet Roolinimiä voidaan käyttää yhteysnimien lisäksi Esim. tili, omistaja Roolinimi voidaan [joskus] johtaa ohjelmakoodista, yhteyden toteuttavan kentän nimestä Roolinimi merkitään yhteyden kohteen päähän 35
Yhteyksien kuvaaminen eri abstraktiotasoilla Luokkia korkealla abstraktion tasolla kuvattaessa voimme jättää attribuutit ja/tai operaatiot merkitsemättä Vastaavasti, navigointimahdollisuus voidaan pudottaa pois Yhteysviivan kummassakaan päässä ei merkitä nuolenkärkeä 36
Yhteyksien kuvaamisen abstrahointi Navigointimahdollisuus jätetty esittämättä: Tämä tarkoittaa, että navigoiminen on mahdollista kumpaankin suuntaan Nuolenpää omistajasta suuntaan pankkitili Tämä kuvaa sveitsiläistä pankkitiliä omistaja tietää tilinsä, mutta tili ei omistajaansa. 37
Yhteys samaan luokkaan Molemmat yhteyden osapuolina olevat oliot voivat kuulua samaan luokkaan Esimerkki: työntekijällä on vain yksi välitön esimies Esimiehellä taas n alaista Ylimmällä päälliköllä ei ole esimiestä 38
Esimies-alainen suhde oliokaaviona 39
Ilmentymien järjestys Yhteyteen voidaan liittää järjestysmääre ilmaisemaan, että olioon yhteydessä olevien olioiden joukko on jollain perusteella järjestetty Esimerkki: kirjan kirjoittajat on järjestetty 40
Operaatioiden määritteleminen UML:ssä Operaatioille annettavat tiedot Näkyvyys (kuten attribuuteille) Nimi (ainut pakollinen osa) Parametrit Paluuarvon tyyppi Muut määreet Syntaksi (hakasuluilla merkitään optionaalinen osuus) [näkyvyys] nimi [(parametrit)] [: paluuarvon tyyppi] [{muut määreet}] l parametrimäärittelyn muoto on l[suunta] nimi: tyyppi [= oletusarvo] 41
Henkilötunnus-luokan attribuutit ja operaatiot Henkilötunnusta mallintavalla luokalla on neljä julkista operaatiota Yksi operaatioista on konstruktori Operaatio getbirthdate palauttaa Date-tyyppisen olion Konstruktorille annetaan parametrina henkilötunnus merkkijonona 42
Luokkamallin laatimisen yleisohje Laadi kohdealueen perussanasto Muodosta alustava luokkakaavio Tunnista luokkien ilmentymien väliset yhteydet Täsmennä mallia määrittelemällä attribuutit Määrittele yhteyksien moniarvoisuusmääreet Liitä luokkiin operaatiot ja lisää tarvittaessa uusia luokkia käyttötapausten perusteella Varmista käyttötapausten ja luokkamallin yhteensopivuus 43
Perussanaston laatiminen Etsi kohdealueen potentiaaliset luokat ja oliot esim. keskeiset toimijat, toiminnan kohteet, ilmiöt, tapahtumat, materiaalit, tuotteet, käsitteet, termit, Lähtökohtana esim. vapaamuotoinen tekstikuvaus Kerää luokkaehdokkaat perussanastoksi luokkaehdokkaat tekstissä usein subjekteja tai objekteja verbit voivat ilmaista yhteyksiä, samoin genetiivit 44
Turhien ehdokkaiden karsiminen perussanastosta Luokka oleellinen mallinnettavan ilmiön kannalta? Luokalla (useita) ilmentymiä? Ilmentymillä järjestelmän kannalta välttämätöntä tietosisältöä (yleensä oltava useita attribuutteja)? Poista synonyymit Karsiminen tyypillisesti iteratiivista 45
Yhteyksien tunnistaminen Etsi yhteyksiä sanastosta (ja muista kuvauksista) Käy läpi verbit ja genetiivit sekä muut ilmaukset, jotka kuvaavat kytkentää Onko yhteys oleellinen tarkasteltavan ilmiön kannalta? Onko se rakenteellinen? (vallitseva asiaintila) Esitä kukin asia vain kertaalleen Karsi tai merkitse johdettavissa olevat yhteydet Älä piilota yhteyksiä attribuuteiksi! Työntekijä osastonnimi Osasto nimi Työntekijä osasto nimi Osasto 46
Attribuuttien tunnistaminen Attribuutteja saattaa löytyä sanastosta Yleensä niiden löytäminen edellyttää lisäselvityksiä kohdealueesta, esimerkiksi toiminnan osapuolten haastatteluja Attribuuttien kohdalla pitäisi myös selvittää, mihin niitä tarvitaan Ja uudelleen: älä piilota yhteyksiä attribuutteihin! 47
Moniarvoisuusmääreet Moniarvoisuusmääreiden eli osallistumisrajoitteiden avulla ilmaistaan rakenteellisia sääntöjä Säännöt eivät välttämättä tule esiin sanastossa, vaan edellyttävät tarkempaa kohdealueen analysointia 48
Käyttötapausten rooli operaatioiden ja luokkien tunnistamisessa Käydään läpi kukin käyttötapaus ja sen määrittelemät toiminnalliset vaatimukset esimerkiksi taulukkomuodossa Määritellään yksi (tai useampi) pääluokka, joka vastaa toiminnallisuuden toteuttamisesta Määritellään yksi tai useampia operaatioita, jotka vastaavat toiminnallisuuden toteuttamisesta Määritellään tarvittaessa apuluokkia, joita pääluokka käyttää hyväksi 49
Käyttötapausten ja luokkamallin yhteensopivuus Käyttötapausmallin ja tietosisältömallin yhteensopivuuden varmistamiseksi voidaan käyttää riippuvuusmatriisia luokat ja yhteydet vs. käyttötapaukset alkiona riippuvuustieto: luo, muuttaa, poistaa, käyttää (ns. CRUD) matriisit voidaan esittää myös attribuuttitasolla, jolloin kuvataan kunkin attribuutin käsittely (tällä tasolla matriisit on kuitenkin syytä pilkkoa luokkakohtaisiksi) 50
Riippuvuusmatriisi 51
Riippuvuusmatriisin käyttö Jokaiselle luokalle ja yhteydelle täytyisi löytyä käyttötapaus, jolla voidaan luoda luokan ilmentymiä ja kytkeä olioita ko. yhteyteen Jokaiselle luokalle ja yhteydelle täytyisi löytyä käyttötapaus, joka hyödyntää luokan tietoja ja yhteyksiä Jos ilmentymät eivät ole ikuisia, pitää löytyä käyttötapaus, jolla poistetaan ilmentymiä Jos ilmentymän tietosisältö ei ole muuttumaton, pitää löytyä käyttötapaus, jolla tietosisältöä voidaan muuttaa Jos osapuoli voidaan irrottaa yhteydestä, täytyy tähän tarkoitukseen löytyä käyttötapaus Lisäksi: jokaisen käyttötapauksen täytyy jollain tavoin liittyä sisältöluokkiin 52
Kysymyksiä? 53
Lisäesimerkkejä yhteyksistä Jokaisella maalla on yksi pääkaupunki Pääkaupunki on ainoastaan yhden maan pääkaupunki Alla ensin luokkakaavio ja esimerkkitilanteen kuvaava oliokaavio 54
Henkilö voi omistaa usean yhtiön osakkeita Yhtiöllä on monia osakkeenomistajia Eli yhteen Henkilö-olioon voi liittyä monta Yhtiö-olioa Ja yhteen Yhtiö-olioon voi liittyä monta Henkilö-olioa 55
Yhtiössä työskentelee useita ihmisiä Ihminen työskentelee korkeintaan yhdessä yrityksessä Huomaa roolinimet: Ihmisen rooli yhteyden suhteen on työntekijä, employee Yrityksen rooli yhteydessä on työnantaja, employer 56
Lisää bisnesmaailman esimerkkejä Manageria kohti on useita assistentteja, assistentin johtajana (supervisor) toimii vähintään yksi manageri Yhtiöllä on yksi johtokunta, joka johtaa tasan yhtä yhtiötä Toimistoon on sijoitettu (allocated to) useita työntekijöitä. Työntekijällä on paikka yhdessä toimisto tai ei missään Johtokuntaan kuuluu kolmesta kahdeksaan henkeä. Yksi henkilö voi kuulua useisiin johtokuntiin, muttei välttämättä yhteenkään. 57