Systeemityö 2 Olioajattelu, luokkakaavio Teppo Räisänen, Principal Lecturer Oulu University of Applied Sciences, School of Business and Information Management teppo.raisanen@oamk.fi, 050 382 6587
Olioajattelu Luokka ja olio Periytyminen Monimuotoisuus Luokkakaavio
Olioajattelu – Luokka ja olio Oliosuuntautuneen mallinnuksen tärkeimmät elementit Luokat, oliot ja niiden väliset suhteet Luokat ja oliot mallintavat kuvattavan järjestelmän sisältöä Luokkien väliset suhteet näyttävät, kuinka ne rakentuvat toisiinsa nähden Kun järjestelmä rakennetaan oliosuuntautuneella ohjelmointikielellä, luokat ja suhteet muuttuvat suoraan lähdekoodiksi koodigeneraattori
Olioajattelu – Luokka ja olio Olio (object) Asia, josta voidaan keskustella ja jota voidaan käsitellä On olemassa oikeassa maailmassa Voi olla osa mitä tahansa järjestelmää, kuten konetta, organisaatiota tai yritystä Luokka (class) Kuvaus olion tyypistä Kuvailee yhden tyypin olioiden ominaisuudet ja käyttäytymisen Kaikki oliot ovat jonkun luokan ilmentymiä (instances) Olioita luodaan luokista, jolloin ne ovat luokkansa mukaisia ilmentymiä
Esimerkki – Luokka ja olio Opettaja T. Räisänen Luokka: opettaja Olio: T. Räisänen Oppilas S. Virtanen Luokka: oppilas Olio: S. Virtanen Oulun seudun ammattikorkeakoulu Luokka: koulu (ammattikorkeakoulu) Olio: OAMK
Luokkakaavio Luokkakaavio on staattinen mallinnustyyppi Kuvaa järjestelmän staattisen eli pysyvän rakenteen luokkien ja niiden välisten suhteiden avulla Luokkakaavion yksi tehtävä on määrittää perusta muille kaavioille Esimerkiksi olioiden tiloja ja olioiden välistä yhteistyötä kuvaaville dynaamisille kaavioille työskentelee opiskelee Opettaja Koulu Oppilas
Luokkakaavio Luokkakaaviota varten luokat on tunnistettava ja kuvattava Luokkakaavio kuvaa sovelluksen Luokat, niiden sisällön ja luokkien väliset suhteet Luokkakaavio on oliomenetelmien keskeisin kuvaustapa, jonka varaan muut oliomallinnuksen kuvaukset pitkälti rakentuvat Oliokaavio Luokkakaavion muunnos, jossa kuvataan olioita
Luokkakaavio Rakennus Huone Huonekalu
Luokkakaavio Rakennus Huone Huonekalu
Olioajattelu – Luokka Luokka on olion malli Sen ohjeiden mukaan luodaan ohjelmaa ajettaessa olioita Luokka on eräänlainen pohjapiirrustus Luokka määrittelee olion piirteet Luokalla on aina nimi ja yleensä attribuutteja ja metodeja
Olioajattelu – Luokka Luokka piirretään suorakulmiona, joka on jaettu kolmeen osastoon Nimiosasto Attribuuttiosasto Operaatio-osasto Nimi keskitettynä ja tummennettuna Luokan nimi johdetaan ongelma-alueelta ja on yksikäsitteinen ilman etu- tai takaliitteitä Nimi Attribuutit Operaatiot
Attribuuttiosasto Luokilla on attribuutteja, jotka kuvaavat olioiden ominaisuuksia Oikein valitut attribuutit sisältävät tiedot, jotka kuvaavat yksittäistä luokan ilmentymää ja erottavat sen muista saman luokan ilmentymistä Vain järjestelmän kannalta kiinnostavat attribuutit tulisi ottaa mukaan Attribuutin määrittelyn muodollinen syntaksi: Visibility name : type multiplicity = default { property string } Näkyvyys nimi : tietotyyppi lukumäärä = alkuarvo { ominaisuus } UML 1.5: nimi ja tietotyyppi pakollisia UML 2.0: nimi pakollinen
Esimerkki Opettaja nimi palkka ikä sotu
Attribuutti Attribuuteilla on tietotyyppi, joka kertoo minkälainen attribuutti on kyseessä Tietotyyppi voi olla mikä tahansa ohjelmointikielissä käytetty tietotyyppi Kokonaisluku (integer) Totuusarvo (boolean) Desimaaliluku (real) Piste (point) Lista (IList) Muu luokka!
Harjoitus: opiskelija-luokka Mitä attribuutteja opiskelija-luokalla pitäisi olla?
Attribuutti Attribuuteilla voi olla erilaisia näkyvyyksiä (visibility) Julkinen (public) merkitään plus-merkillä (eli +) Yksityinen (private) miinusmerki (-) Suojattu (protected) risuaita (#) Jos näkyvyyden määrittelemää merkkiä ei ole, näkyvyys on määrittämätön Työkaluilla on usein oletusarvo (esim. private) /-merkki attribuutin edessä tarkoittaa, että attribuutti voidaan laskea muista attribuuteista Esim. ikä voidaan laskea syntymäajasta
Attribuutti Attribuutilla voi olla oletusarvo, joka sijoitetaan muuttujaan samalla hetkellä, kun luokasta luodaan olio +nimi : String = ”Teppo” -ikä : int = 0 Attribuutti voi olla luokkatason attribuutti (class variable), jolloin attribuutti jaetaan kaikkien luokan olioiden kesken Luokkatason attribuutti alleviivataan Attribuutti voi myös olla arvoaluemääritys (tagged value) Esim. lasku-luokan attribuutti tila: +tila : maksamatta { maksamatta, maksettu } +siviilisaaty : naimaton { naimaton, naimisissa, eronnut, leski }
Esimerkki Opettaja Opettaja nimi palkka ikä sotu +nimi : String -palkka : double =1000 -ikä : int -sotu : String
Esimerkki public class Opettaja { public String nimi; private int palkka = 3000; private int ikä; private String sotu, }
Harjoitus: opiskelija-luokka Miettikää opiskelija-luokan attribuuteille näkyvyys, alkuarvo ja tietotyypit
Operaatio-osasto Operaatioilla Käsitellään attribuutteja Tehdään muita toimenpiteitä Operaatioita kutsutaan myös funktioiksi tai metodeiksi public int function laskePalkka(int perusPalkka, int työvuodet) { public int palkka = 0; palkka = perusPalkka + (työvuodet * 50); return (palkka); }
Operaatio-osasto Operaatiota kutsuttaessa sitä sovelletaan yhteen olioon, eli sitä kutsutaan tälle oliolle Luokan operaatiot kuvaavat mitä luokka voi tehdä
Operaatio-osasto Kun Opettaja-luokasta luodaan olio ”Teppo Räisänen”, ja tälle oliolle kutsutaan operaatiota haeSotu, saadaan tuloksena ”Teppo Räisänen”-olion sotu Opettaja nimi palkka Ikä sotu muutaPalkka haeSotu
Operaatio-osasto Luokalla voi olla myös luokkatason operaatioita Operaatioita voidaan kutsua ilman luokan oliota mutta se voi tällöin käsitellä vain luokkatason muuttujia Luokkatason operaatioilla suoritetaan yleisiä toimenpiteitä, kuten olioiden luomista ja etsimistä
Operaatio-osasto Operaation muodollinen syntaksi: näkyvyys nimi ( parametrilista ) : palautusarvotyyppi { ominaisuus } Visibility name ( parameter-list ) : return-type { property-string } Parametrilista on pilkuilla erotettu lista muodollisia parametreja määriteltynä syntaksilla: Nimi : tietotyyppi = oletusarvo Näkyvyys: + julkinen, - yksityinen Operaatiolla on oltava ainutlaatuinen muoto, eli nimen, palautusarvon ja parametrien yhdistelmä
Operaatio-osasto Opettaja nimi palkka Ikä sotu +muutaPalkka(uusiPalkka: int) +haeSotu()
Harjoitus: opiskelija-luokka Miettikää opiskelija-luokan operaatiot
UML -Luokka Henkilo Luokan nimi Luokan attribuutit Luokan operaatiot Public nimi : String asetaNimi(String) haeNimi()
Esimerkkejä
Luokkien löytäminen Luokkien löytämiseksi tarvitaan ongelma- alueen asiantuntijoita Luokat nimetään oikeassa elämässä vastaavien asioiden mukaan Luokkia voidaan etsiä esimerkiksi kysymysten avulla Onko olemassa tietoa, jota pitäisi tallentaa tai analysoida? Onko olemassa ulkoisia järjestelmiä? Mitä rooleja toimijoilla on? Onko olemassa organisaation osia, jotka liittyvät järjestelmään?
Olioajattelu – Olio Olio tallentaa kuvaamansa ja käsittelemänsä tiedot sisäisiin tietokenttiin, joita kutsutaan attribuuteiksi Attribuuttien arvojen yhdistelmiä kutsutaan olion tiloiksi Olio sisältää lisäksi joukon operaatioita, joilla voidaan käsitellä olion attribuutteja Operaatioita kutsutaan metodeiksi Olion attribuutteja ja metodeita kutsutaan olion piirteiksi Luokka määrittelee olion piirteet
Esimerkki Mustang vuosimalli väri moottori nopeus kiihdytä() jarruta()
Esimerkki Mustang Luokka vuosimalli väri moottori nopeus kiihdytä() jarruta() Olio
Esimerkki Mustang Jokaisella oliolla on -vuosimalli -väri -moottori -nopeus attribuutit. vuosimalli väri moottori nopeus kiihdytä() jarruta()
Esimerkki Mustang vuosimalli väri moottori nopeus kiihdytä() jarruta() Olio voi lisäksi -kiihdyttää -jarruttaa
Periytyminen / yleistys Periytymisellä tarkoitetaan tilannetta, jossa aliluokka perii kaikki yläluokan ominaisuudet Tärkeää koodin uudelleenkäytössä Yläluokka (superclass), alaluokka (subclass) Yläluokkaan tehdyt muutokset periytyvät alaluokkiin
Periytyminen / yleistys Mustang vuosimalli väri moottori nopeus kiihdytä() jarruta()
Periytyminen / yleistys Mustang vuosimalli väri moottori nopeus kiihdytä() jarruta() Coupe Fastback Convertible coupePerä fastbackPerä avoKatto laskeKatto() nostaKatto()
Periytyminen / yleistys Materiaali Tunnus Nimi Tila Kirja Äänite Lehti Tekijä Kustantaja Julkaisuvuosi ISBN Artisti Äänitetyyppi Julkaisuvuosi Vuosikerta Numero Sivumäärä
Periytyminen / yleistys Luokka voi olla sekä yläluokka että alaluokka Jos ohjelma pyytää parametriksi kulkuväline- luokan oliota, sille voidaan antaa parametrinä alaluokan olio function laskeMatkaKustannukset(Kulkuvaline) Arvo = laskeMatkaKustannukset (veneOlio); Arvo = laskeMatkaKustannukset (autoOlio); Arvo = laskeMatkaKustannukset (moottoriveneOlio); Arvo = laskeMatkaKustannukset (soutuveneOlio);
Harjoitus Piirtäkää luokkakaavio, jossa on luokat ihminen, mies, nainen ihminen, mies, nainen, lapsi, nisäkäs, selkärankainen
Luokkien väliset suhteet Suhteet kuvaavat luokkien välistä viestintää Neljää eri tyyppiä Assosiaatio (assocition) Kooste (composition / aggregation) Yleistys (generalization) Riippuvuus (dependency) Tarkennus (refinement) Kirjailija Kirja
Luokkien väliset suhteet Assosiaatio Yhteys kahden luokan välillä, jolloin myös luokkien olioiden välillä on yhteys Oliot tietävät toisistaan Oliot ovat yhteyksissä toisiinsa On yleensä kaksisuuntainen
Luokkien väliset suhteet Tavallinen assosiaatio Rekursiivinen assosiaatio Koostumussuhde Valitsinassosiaatio Tai-assosiaatio Järjestetty assosiaatio Kolmioassosiaatio Assosiatiivinen luokka
Tavallinen assosiaatio Yleisin assosiaatio on pelkkä yhteys luokkien välillä Piirretään yhtenäisenä viivana luokkien välille Assosiaatiolle voi antaa nimen Assosiaatio voi olla yksisuuntainen tai kaksisuuntainen Merkitään nuolella Kirjailija Kirja
Tavallinen assosiaatio Kirjailija Kirja Asiakas Tili Käyttää Tilaus Tilausrivi
Luokkien väliset suhteet Assosiaatio Kooste Riippuvuus Kirjailija Kirja Rakennus Huone Hinta Tarjous
Luokkien väliset suhteet Jaettu (aggregation) ja vahva (composition) kooste Rakennus Huone Joukkue Pelaaja
Luokkien väliset suhteet Kerrannaisuus Kuinka monta objektia esiintyy luokkien välisessä suhteessa Merkitään suhteen molempiin päihin Jos ei ole määritelty, oletusarvo on 1 Esimerkkejä 0..1 0..* 1..* 1..8 Huone Huonekalu 0..1 0..*
Harjoitus 2-3 hengen ryhmissä piirtäkää luokkakaaviot, joissa käytetään seuraavia luokkia henkilöauto, ajoneuvo, rekka-auto, linja-auto, rengas, ovi, moottori, kori opiskelija, opettaja, koulu, yksikkö, opintojakso, pakollinen, valinnainen, suuntautumisvaihtoehto
Perinnän / yleistyksen rajoitukset Päällekkäinen (overlapping) Kaikki aliluokat, jotka perivät tämän perimisen aliluokkia, voivat periä monta luokkaa Erillinen (disjoint) Aliluokkia ei saa periä yhteiseen aliluokkaan Oletus
Perinnän / yleistyksen rajoitukset Täydellinen (complete) Uusia aliluokkia ei saa tehdä Epätäydellinen (incomplete) Uusia aliluokkai voi tehdä
Abstrakti luokka Luokka, josta ei voi tehdä olioita Voidaan vain periä Nimiosastossa nimen alle {abstract} tai kirjoitetaan nimi kursiivilla Luokasta tekee abstraktin myös se, jos sillä on abstrakteja operaatioita Abstraktilla operaatiolla ei ole toteuttavaa metodia, vai muoto tunnetaan
Abstrakti luokka public abstract class Kulkuväline { public abstract function aja(); } public abstract class Vene extends Kulkuväline { public class Soutuvene extends Vene { public function aja() { souda();
Monimuotoisuus Aliluokat voivat muuttaa perittyä ominaisuutta Toiminnallisesti erilaiset metodit samalla nimellä Esimerkiksi Ympyrä- ja Neliö-olioiden pinta-ala lasketaan eri kaavoilla
Monimuotoisuus Mustang Shelby GT 500 vuosimalli väri moottori nopeus kiihdytä() jarruta() Shelby GT 500 remmiahdin kiihdytä()
Korvataan kiihdytä –metodi uudella samannimisellä metodilla Monimuotoisuus Mustang vuosimalli väri moottori nopeus kiihdytä() jarruta() Korvataan kiihdytä –metodi uudella samannimisellä metodilla Shelby GT 500 remmiahdin kiihdytä()
Esimerkki Koodissa assosiaatio ja attribuutit eivät eroa juurikaan toisistaan henkilö auto 0..1 *
Esimerkki Koodissa assosiaatio ja attribuutit eivät eroa juurikaan toisistaan henkilö auto 0..1 * class henkilö { public IList autolista; private String nimi; } class auto { public henkilö omistaja; private Money hinta; }
Esimerkki tilausrivi asiakas tilaus class tilaus { public asiakas tilaaja; public tilausrivi tuotteet; public Date pvm; } class asiakas { public String nimi; Class tilausrivi { public int tuoteId; tilausrivi asiakas tilaus
Esimerkki tilausrivi tilaus tilausrivi tilaukset tilaus
Johdettu assosiaatio Johdettu assosiaatio voidaan laskea muiden assosiaatioiden ja attribuuttien avulla Budjetti kustannus kiinteät kustannus muuttuvat /kustannus kokonaiskustannus
Rekursiivinen assosiaatio Luokka voidaan kytkeä itseensä assosiaatiolla Yhteyden molemmat osapuolet kuuluvat samaan luokkaan Roolinimi Roolinimen käyttäminen välttämätöntä Kertoo mitä roolia luokka esittää assosiaation puitteissa Roolinimi kuuluu assosiaatioon naimisissa mies Henkilö int ikä int sukupuoli vaimo
Riippuvuus, tarkennus Toinen luokka on riippuvainen toisesta Tarkennus Toinen itsenäinen/riippumaton, toinen riippuvainen Muutos itsenäiseen luokkaan vaikuttaa riippuvaiseen luokkaan Tarkennus Kuvataan samaa asiaa eri abstraktiotasoilla Yleiskatsaus ja yksityiskohtainen kaavio
Valitsinassosiaatio Yhden suhde moneen tai monen suhde moneen –assosiaatio Valitsin erottelee moni-päässä olevat oliot toisistaan Toimii valinta-avaimena Piirretään pienenä laatikkona siihen päähän, mistä navigoinnin tulee tapahtua
Tai-assosiaatio Kahden tai useamman assosiaation rajoitin Luokan oliot voivat osallistua korkeintaan yhteen assosiaatioon kerralla
Assosiatiivinen luokka Assosiaatioon voidaan kytkeä luokka Assosiatiivinen luokka antaa lisätietoa yhteydelle Jokainen assosiatiivinen yhteys on yhteydessä assosiatiivisen luokan olioon
Järjestetty assosiaatio Olioiden välisillä assosiaatioilla voi olla tietty järjestys Oletusarvo ”järjestämätön” Merkitään {ordered} assosiaatioviivan viereen järjestettyjen olioiden luokan lähelle {ordered by date}, {ordered by name}
Kolmioassosiaatio Assosiaatioon voi liittyä enemmän kuin kaksi luokkaa Kolmoisassosiaatio liittää kolme luokkaa keskenään Piirretään vinoneliönä
Rajapinnat Luokka voi tarjota rajapinnan Luokka voi vaatio rajapintaa Provides an interface Luokka voi vaatio rajapintaa Requires an interface
UML säännöt Rajoitukset (constraints) Johteet (derivations) Säännöt Rajoittavat mallia Tai-assosiaatio, järjestetyt assosiaatiot, perimisrajoitukset Johteet (derivations) Sääntöjä asioiden johtamiselle Johdettu attribuutti / assosiaatio Säännöt Kaikille mallinnuselementeille Aaltosulkujen sisällä mallinnuselementin lähellä
UML-Mallin laatimisen vaiheet Kartoita luokkaehdokkaita Osallistujat, toiminnan kohteet, tapahtumat, materiaalit, tuotteet, tiedot Pohjana vapaamuotoinen tekstikuvaus Karsi ehdokkaita Liittyykö ehdokkaaseen/ilmiöön tietosisältöä, joka on järjestelmän kannalta välttämätön Onko asia riittävän tärkeä kohdealueen kannalta Iteratiivinen prosessi: kartoita <-> karsi Tunnista olioiden väliset yhteydet Onko yhteys järjestelmän kannalta välttämätön Täsmennä luokkakuvauksia määrittelemällä attribuutit Vapaamuotoisesta kuvauksesta Selvitys mihin/miksi attribuuttia tarvitaan Määrittele yhteyksiin liittyvät osallistumisrajoitteet Määrittele luokkien operaatiot/palvelut Varmista operaatioiden/palveluiden ja tietosisällön yhteensopivuus
Harjoitus Etsikää mahdollisia luokkia annetusta materiaalista Koettakaa käyttää periytymistä Miettikää kerrannaisuuksia Mallintakaa Windows-käyttöjärjestelmän ikkuna Käyttäkää periytymistä ja koostetta
Lähteet Fowler, Martin. 2003. UML distilled : a brief guide to the standard object modeling language. Boston : Addison-Wesley. Eriksson, Hans-Erik. 2004. UML 2 toolkit. Indianapolis, Ind. : Wiley. http://www.okol.org/verkkokurssit/datanomi/tietojarjestelmien_kaytto_ja_ke hittaminen/johdatus_tietojarjestelmiin/oliomallinnuksen_perusteet/oliomalli nnuksen_perusteet_asia.htm