Johdatus oliopohjaiseen Johdatus oliopohjaiseen ajatteluun ajatteluun Pasi Kellokoski Pasi Kellokoski
May 17, 2015
Johdatus oliopohjaiseen Johdatus oliopohjaiseen ajatteluunajatteluun
Pasi KellokoskiPasi Kellokoski
Mitä on oliokeskeisyys?
Oliolähestymistavan tavoitteena on sovelluskehitystyön tuottavuuden ja laadun kohottaminen
Oliolähestymistapa (eli oliokeskeisyys) tarkoittaa kehittämis- ja ohjelmointiparadigmaa, jonka mukaan todellisuus nähdään joukkona toisiinsa vuorovaikutuksessa olevia olioita (Koskimies, 1995)
Ohjelmointiparadigmat
Paradigma = esikuva, malli, kaava
Ohjelmointiparadigma on tapa kuvata erilaisten järjestelmien rakennetta ja toimintaa
Ohjelmointiparadigmoja
Proseduraalinen (esim. Pascal, Ada, Modula-2, C)
Funktionaalinen (Lisp, Scheme)
Logiikkaohjelmointi (Prolog)
Tietokantaohjelmointi (SQL)
Olioperustainen (Smalltalk, C++, Java)
Perinteinen osittava ohjelmistokehitys
toiminnankarkeakuvaus
1. tarkennus-askel
lopullinenkoodi
Perinteinen osittava ohjelmistokehitys (jatkoa)
Osittava (top-down) suunnittelu toimintasuuntautunutta
Toiminnallisuus kuvataan tarkentuvilla abstraktiotasoilla
Tietorakenteet määritellään kun niiden rooli tulee esille
Ohjelmisto riippuvainen ylempien tasojen ratkaisuista
Tietorakenteet irrallisia toimintojen kohteita
Sopii hyvin pienehköjen ohjelmien toteutukseen
Perinteinen osittava ohjelmistokehitys (jatkoa)
Ongelmia
Pieni muutos ylätasolla aiheuttaa suuria muutoksia koko ohjelmaan (esim. käyttöliittymä)
Heikko uudelleenkäytettävyys
Ylläpito hankalaa
Olioperustainen ohjelmistokehitys
Sovelluksenkäsitemaailma
Sovellus 1
Sovellus 2
Sovellukseen liittyviä käsitteitäja niiden välisiä suhteita
Luokkia ja niidenvälisiä suhteita
Syitä oliopohjaiseen ajatteluun
70-luvulla ”Ohjelmistokriisi”
Ylläpidon ja muutosten hallinnan ongelmat
Koodin elinikä ja uudelleenkäyttö
Syitä oliopohjaiseen ajatteluun (jatkoa)
Ohjelmiston kokonaiskustannukset:
30-50% rakentaminen, 50-70% ylläpito
Ylläpitokustannukset
42% käyttäjien uusia vaatimuksia
17% tietoesitysten muutoksia
12% hätäkorjauksia
9% rutiinikorjauksia
Käyttäjien uusia vaatimuksia
Tietoesitysten muutoksia
Hätäkorjauksia
Rutiinikorjauksia
Syitä oliopohjaiseen ajatteluun (jatkoa)
Uudet vaatimukset johtavat ohjelmiston rakenteen muuttamiseen
Yleisrakenne riippumattomaksi
Toiminnallisista muutoksista
Tietoesitysten muutoksista
Pieni vaatimusmuutos <-> pieni koodimuutos
Syitä oliopohjaiseen ajatteluun (jatkoa)
Ohjelmiston rakentamiskustannukset
Ohjelmistot suuria, monimutkaisia ja vaativia
Ohjelmistokomponenttien uudelleen käytettävyys
Alentaa kustannuksia
15% uusista ohjelmistoista uutta koodia, 85% muokattu vanhasta
Uudelleenkäytön tuki
Syitä oliopohjaiseen ajatteluun (jatkoa)
Vastaa hyvin reaalimaailman konkreettisia ja abstrakteja asioita
Olioperustainen ohjelma simuloi tapahtumia
Suora liitäntä todellisuuteen
Ominaisuudet
Käyttäytyminen
Palvelut
Syitä oliopohjaiseen ajatteluun (jatkoa)
Toiminnan muutos EI aiheuta syvällisiä muutoksia ohjelmaan
Muutoskohdat helppo löytää
Ohjelmiston rakentaminen systemaattinen hallittava prosessi
Koodin uudelleenkäyttö helpompaa
Syitä oliopohjaiseen ajatteluun (jatkoa)
Kuitenkin muistettava että:
Uudelleenkäytettävyys huomioitava suunnittelussa
Olioperustainen ohjelmistokehitys voi viedä enemmän aikaa
Syitä oliopohjaiseen ajatteluun (jatkoa)
Sopii kaikkiin sovelluksiin
Ei tehokkuushäviöitä
Ohjelmointikulttuuri (kielet, ohjelmointiympäristöt, kirjastot, analysointi- ja suunnittelumenetelmät, suunnittelumallit, sovelluskehykset, CASE-välineet...)
Olioparadigman historiaa
V. 1966: Simula (Dahl, Nygaard) (object-oriented programming)
V. 1972: Smalltalk (Kay, Xerox), termi ’object-oriented’ tuli yleisemmin käyttöön
V.1972: Boochin menetelmä: object-oriented design
1980-luvun puolivälistä alkaen uusia olio-ohjelmointikieliä: C++, Eiffel, Oberon-2
1980-luvun puolivälistä alkaen ensimmäisiä kaupallisia oliotietokantoja
Käynnistettiin useita konferenssisarjoja: (OOPSLA, ECOOP, TOOLS)
Olioparadigman historiaa (jatkoa)
1980-luvun lopussa menetelmiä, jotka kattavat myös määrittelyn: OOA, OOSE
1990-luvulla: object-oriented domain analysis, olio-ohjelmistojen testaus, oliopohjaiset CASE-välineet
Olioperustaisuus tänään
Suunnittelumenetelmät käytössä (esim. OMT, OMT++, Octopus)
Ohjelmistokehitysprosessit käytössä (RUP ym.)
CASE-välineet käytössä (Rational Rose, Select ym.)
Oliokielet käytössä (Java, C++, Smalltalk ym.)
Ohjelmointiympäristöt markkinoilla (MS Visual C++, Symantec Visual Café ym.)
Olioperustaisuus tänään (jatkoa)
Yleisesti: oliolähestymistapa on levinnyt mm. ohjelmointiin, tietojärjestelmien suunnitteluun, tietojärjestelmien analyysiin, liiketoimintojen analyysiin, strategiseen suunnitteluun
Olioperustaisuus tänään (jatkoa)
Oliotaitoja tarvitaan useissa tehtävissä (ohjelmointi, testaus, tietokannat, ohjelmistoarkkitehtuurit, käyttöliittymät, määrittely…)
Eri kehitysympäristöissä (Windows, sulautettu, web…)
Eri toimialoilla (e-business, tietoliikenne, langattomat päätelaitteet…)
Olioajattelu
Ohjelmiston rakentamisesta tulee systemaattinen, hallittavissa oleva prosessi, jossa sovelluksen käsiteanalyysistä johdetaan vähitellen ajettavissa oleva koodi
Oliosuuntautuneisuuden tausta
Käsitteemme muodostuvat havainnointimme perustalta
Käsitteitä muodostuu todellisista ja kuvitteellisista todellisuuden ilmentymistä
Abstrahointi
Periaate, jonka mukaan nostetaan esille ongelman kannalta relevantit piirteet ja jätetään huomiotta epärelevantit
Tehdään tarkastelukohteen yksinkertaistamiseksi tiettyä tarkoitusta varten
Saadaan muodostetuksi yleiskäsitteitä
Mallinnetaan todellisuutta
Olio
Rajattavissa ja yksilöitävissä oleva asia tai käsite, joka on merkityksellinen käsillä olevan tarkastelun kannalta
Ympäristöstä erottuva kokonaisuus, jolla oma identiteetti, sisäinen rakenne ja suhteet tiettyyn ympäristöön
Teknisessä mielessä ohjelman strukturoinnin perusyksikkö, joka ei ole puhtaasti toiminnallinen (esim. aliohjelma) tai puhtaasti tietoa sisältävä (esim. tietue), vaan sisältää molempia ominaisuuksia
Olio (jatkoa)
Sisältää
Tietoja
Toimintoja
Tällaista tiedon ja siihen liittyvien toimintojen pakkaamista yhdeksi kokonaisuudeksi kutsutaan ohjelmistotekniikassa usein kapseloinniksi
Proseduraalinen ohjelmointivs. olio-ohjelmointi
toimintorakennetietorakenteet +
olio = tieto + toiminnotkapselointi
Olio (jatkoa)
Pystyy suorittamaan tietyt tälle oliolle ominaiset toiminnot eli operaatiot
Pystyy tallettamaan tietoa olion attribuutteihin
Oliolla on sen yksilöivä viite
Suojattu kokonaisuus, jonka käyttö on rajattu tiettyihin muotoihin
Olio (jatkoa)
Kuuluu aina johonkin luokkaan, mutta vain yhteen luokkaan
Attribuutti
Olion pystyy tallettamaan tietoa olion attribuutteihin
Attribuutti kuvaa luokkaan kuuluvien olioiden ominaisuutta (esim. nimi, ikä, paino)
Attribuuttien arvojen yhdistelmiä kutsutaan olion tiloiksi
Operaatio
On olioon kohdistuva tai olion suorittama toimenpide
Tehtävät, joista olio on vastuussa
Mitä tehdään
Operaatiot ovat tyypillisesti
Olion tilaa muuttavia
Tilaa tutkivia
Olion osille tietyn toiminpiteen tekeviä toimintoja
Oliot ja viestit
Oliot kommunikoivat keskenään lähettämällä viestejä (palvelupyyntöjä) toisilleen
Viesti toimii eräänlaisena herätteenä, joka saa vastaanottavan olion käynnistämään viestissä viitatun operaation suorituksen
Oliokeskeinen tietojärjestelmä mallinnetaan palvelujen tarjoajina ja käyttäjinä, jotka tekevät keskenään yhteistyötä tietojärjestelmän vastuun täyttämiseksi
Palvelua käyttävä olio ei tunne palvelun tarjoajan sisäistä rakennetta
Terminologiaa
Täydellisesti olioperustainen ohjelma
Kaikki toiminta olioiden operaatioissa
Kaikki data olioiden attribuuteissa tai operaatioissa paikallisena
Puhdas oliokieli
Kieli, jossa ohjelmat ovat aina täydellisesti olioperustaisia
Juuriolio
Olio, joka luodaan ensin ja joka luo muut oliot (suoraan tai välillisesti)
Terminologiaa (jatkoa)
Moniparadigmakieli
Tukee usean eri ohjelmointiparadigman käsitteitä
Ohjelmoija voi valita haluamansa välineet
Hybridikieli
Perinteinen ohjelmointikieli, johon on lisätty olioperustaisen ohjelmoinnin vaatimat mekanismit
Terminologiaa (jatkoa)
Oliotyyppejä
Passiivinen olio: olio toimii vain silloin kun sen palveluja pyydetään
Aktiivinen olio: olio on jatkuvasti toimiva prosessi, joka toimii muiden olioiden kanssa rinnakkain
Koosteolio: oliolla on osinaan toisia olioita osa- tai asiakassuhteessa
Alistettu olio: toisen olion attribuuttina oleva kokonainen olio (eikä vain viite)
Olioiden elinikä
Oliotyyppejä eliniän mukaan:
Väliaikainen olio: häviää kun sen tehtävä on suoritettu (esim. tyyppimuunnoksien yhteydessä)
Alistettu olio: häviää kun isäntäolio häviää
Paikallinen olio: häviää kun ko. aktivaatio päättyy
Vapaa olio: häviää roskien keruussa tai erikseen tuhottaessa
Staattinen olio: häviää sovelluksen päättyessä
Pysyvä olio eli kantaolio: pysyvät sovelluksesta riippumatta
Miten löydän oliot?
Fyysiset oliot (talo, hevonen, auto)
Käsitteet (maksuaikatalu, juna-aikataulu)
Roolit (operaattori, käyttäjä, työntekijä)
Tapahtumia (keskeytys, hälytys, varaus)
Paikkoja (toimisto, valvomo)
Etsi siis substantiiveja! Älä ole liian kriittinen!
Järkevien olioiden etsintä
Karsi synonyymit
Jätä pois epäolennaiset ja epämääräiset
Jätä pois attribuutit
Unohda toteutuskäsitteet (listat, pinot jne.)
Karsi pois käyttöliittymäelementit, niiden aika on myöhemmin
Eri tyyppisiä olioita
Tekninen olio (Merkkijono, Lista)
Käyttöliittymäolio (Ikkuna, Painike)
Liiketoimintaolio (Tilaus, Maksu, Asiakas)
Toimialueen olio (Operaattori, Tilaaja, Palvelu, Yhteys)
...
Esimerkki
Short Message System
Mitä olioita järjestelmässä?
”Mikä Häkkinen” (Lähettäjä)
”Michael Schumacher” (Vastaanottaja)
”Ilmoja pidellyt. Terveisin Mika.” (SMS viesti)
Nokia 6110 (Puhelin)
Pentium III (Tietokone)
Kaverit (Ryhmä)
Soneran GSM-verkko (Verkko)
Historiaa: abstraktit tietotyypit
70-luvulla käytettiin abstrakteja tietotyyppejä, mm. ohjelmointikielissä Ada ja Modula-2
Abstrakteissa tietotyyppien idea ohjelmistojen modularisoinnista osaksi sama kuin olioperustaisessa ajattelussa
Abstrakti tietotyyppi
Määrittelee ilmentymiin sovellettavat kutsumuodot
Ei niiden toteutustapaa
Kapselointimekanismi
Rajapinta
Toteutus esim. moduulina
Liittymä: tyypille sovellettavat operaatiot
Runko: toteutus, ei näy ulos
Abstrakti tietotyyppi (jatkoa)
Ohjelmiston ”sisäinen käyttöliittymä” ohjelmiston komponenteille
Kytkimet, napit <-> operaatiot
Mittarit, lamput <-> arvon palautus
Ei tarvitse välittää "sisäisistä kytkennöistä"
Abstraktien tietotyyppien etuja
Vähentää osien riippuvuuksia toisistaan
Rakennettavuus
Ylläpidettävyys
Toteutus voidaan vaihtaa muuttamalla sisäistä osaa
Olio vs. abstrakti tyyppi
Olio vs. abstrakti tyyppi
Tiedot ja toiminta yhteen
Tarjottavat palvelut
Suojaus
Luokka
Oliokielissä olioiden piirteet (attribuutit ja operaatiot) määritellään tavallisesti olion luokassa
Luokka = malli, muotti tai aihio, jonka mukaisia olioita voidaan luoda
Olio = luokan ilmentymä
Luokka (jatkoa)
Luokka kertoo, mitä attribuutteja ja operaatioita luokan ilmentymillä on
Jokaisella tietyn luokan ilmentymällä on samat attribuutit ja operaatiot, vain attribuuttien arvot vaihtelevat
Jokaisella oliolla on yksikäsitteinen luokka, jonka mukaan olio on luotu
Luokka (jatkoa)
Kuvaa joukkoa , joka muodostuu rakenteeltaan ja käyttäytymiseltään (yleisesti ominaisuuksiltaan) samanlaisista olioista (esim. Asiakas,Työntekijä, Osasto)
Olioluokat muodostavat hierarkian, jossa on yliluokkia (esim. Työntekijä) ja niiden aliluokkia (esim. Projektipäällikkö, Suunnittelija, Ohjelmoija)
Luokka (jatkoa)
Tarjoaa eräänlaisen sisäisen käyttöliittymäkuvauksen luokan ilmentymille
Luokka on staattinen, käännösaikainen käsite
Olio on dynaaminen, ajonaikana (luokasta) luotava rakenne
Olion luominen
int a;
void p() {...}
int a;
void p() {...}
Luokka C
a
p
Luokan C ilmentymä
luonti
luonti
a
p
Luokan C ilmentymä
2
3
Olion rakentaja
Olio luodaan luontioperaatiolla
Rakentaja = olion operaatio, jonka olio suorittaa automaattisesti ensimmäisenä toimenpiteenään
Alustaa olion attribuutit
Oletusrakentaja tai ohjelmoijan määrittämä
Olion purkaja
Purkaja = olion operaatio, jonka olio suorittaa automaattisesti viimeisenä toimenpiteenään
Suorittaa toimenpiteitä, jotka ovat välttämättömiä ennen olion hävittämistä (esim. resurssien vapauttaminen)
Esimerkki - Luokka Ihminen
Attribuutteja
Nimi
Lempinimi
Syntymäaika
Pituus
Paino
Syntymäpaikka
Asuinpaikka
...
Operaatioita
Kävele
Juokse
Syö
Juo
Nuku
...
Esimerkki - Olio Teemu Selänne
Attribuutteja
Nimi: Teemu Selänne
Lempinimi: The Finnish Flash
Syntymäaika: 3.7.1970
Pituus: 183 cm
Paino: 93 kg
Syntymäpaikka: Helsinki
Asuinpaikka: Anaheim
...
Operaatioita
Kävele
Juokse
Syö
Juo
Nuku
...
Esimerkki - Luokka Kaupunki
Attribuutteja
Nimi
Pinta-ala
Väkiluku
Väestöntiheys
Veroprosentti
Työttömyysaste
...
Operaatioita
...
Esimerkki - Olio Tampere
Attribuutteja
Nimi: Tampere
Pinta-ala: 522,7 km2
Väkiluku: 195 000
Väestöntiheys: 370 henkilö/km2
Veroprosentti: 17,25
Työttömyysaste: 15,4 %
...
Operaatioita
...
Esimerkki - Olio Helsinki
Attribuutteja
Nimi: Helsinki
Pinta-ala: 686 km2
Väkiluku: 550 000
Väestöntiheys: 2976 henkilöä/maa-km2
Veroprosentti: 16,5
Työttömyysaste: 7,3 %
...
Operaatioita
...
Esimerkki - Luokka Auto
Attribuutteja
Merkki
Malli
Ovet
Vaihteet
Moottori
Teho
Huippunopeus
Kulutus
Rekisterinumero
...
Operaatioita
Kaasuta
Jarruta
Vaihda vaihde
Käännä oikealle
Käännä vasemmalle
...
Esimerkki - Olio Auto X
Attribuutteja
Merkki: Chrysler
Malli: PT Cruiser Classic
Ovet: 5
Vaihteet: Manuaali
Moottori: 2000 ccm
Teho: 104 kW
Huippunopeus: 190 km/h
Kulutus: 7 - 8.7 - 11.5 l/100km
Rekisterinumero ABC-123
...
Operaatioita
Kaasuta
Jarruta
Vaihda vaihde
Käännä oikealle
Käännä vasemmalle
...
Luokkaehdokkaiden löytäminen
Reaalimaailman ja erityisesti sen rajatun alueen, kohdealueen, analysointi
Lähteitä kohdealueen analysointiin
Kirjallinen aineisto: toimintakertomukset, raportit ja muistiot, liiketoiminnan kuvaukset
Käyttäjien ja muiden kohdealueen asiantuntijoiden haastattelu
Protoilu
Reaalimaailman havainnointi
Paljon käytetty tapa luokkaehdokkaiden löytämiseen: substantiivien alleviivaus tekstissä
Luetteloi luokkaehdokkaat
Luokkaehdokkaiden arviointi / analyysi
Kriteereitä luokkaehdokkaiden arvioimiseksi
Ovatko luokan oliot reaalimaailman olioita vs. teknisiä oliota
Luokan sisällön määrittely
Olioilmentymien tarkastelu
Yksilöivän avaimen määrittely
Olion attribuuttien etsiminen (attribuutti vai luokka?)
Olion tarjoamien palvelujen arviointi
Kapselointiratkaisujen arviointi
Kriittinen suhtautuminen --> jos 1 : 1, tarvitaanko molempia?
Luokkaehdokkaiden arviointi / analyysi
Luokka on epäilyttävä, jos
Luokassa ei ole operaatioita
Luokka = operaatio
Luokka perii tietorakenteita, joita se ei käytä
Luokkaa on vaikea nimetä
Luokka on suuri (satoja rivejä – riippuu tilanteesta...)
Luokan palveluja ei käytetä
Operaatiot käsittelevät erillisiä attribuuttijoukkoja
Luokassa on samankaltaista operaatiokoodia kuin jossakin muussa luokassa
Luokkien nimeäminen
Kohdealueen terminologiaan kuuluvat, yleisesti hyväksytyt nimet, mikäli mahdollista
Käytä luokan nimenä joko substantiivia tai adjektiivia ja substantiivia
Käytä luokan nimenä yksikössä oleva sanaa
Käytä täsmällisiä ja kuvaavia ilmaisuja, vaikka ne olisivatkin hieman pidempiä
Ei numeroita
Esimerkki - Pankkiautomaatti
Luokkia
Asiakas
Pankkiautomaatti
Pankki
Pankkikortti
Käteinen
Pankin tietoliikenneverkko
Pankin keskustietokone
Pankkitili
Transaktio
...
Esimerkki - Kurssille rekisteröitymisjärjestelmä
Luokkia
Kurssi
Kurssitoteutus
Opiskelija
Opettaja
Luokka
Tentti
Rekisteröityminen
Kurssin arvosana
...
Esimerkki - Tekstiviestijärjestelmä
Luokkia
Lähettäjä
Vastaanottaja
SMS viesti
Puhelin
Tietokone
Ryhmä
Verkko
...
Periytyminen
Luokka voi periä toisen luokan ominaisuudet eli olemassa olevaa luokkaa voidaan jalostaa erikoistuneemmaksi
Perintärelaatiossa perittyä luokkaa kutsutaan yliluokaksi ja johdettua luokkaa aliluokaksi
Luokkahierarkia
Luokka ALuokka A
a
b
Luokka BLuokka B
c
Luokka CLuokka C
d
e
Luokka DLuokka D
f
piirteet:: a, b, c
piirteet:: a, b, d, e, f
piirteet:: a, b, d, e
piirteet:: a, b
Periytyminen (jatkoa)
Keskeisiä käsitteitä
Yleistäminen: määritellään luokalle yleisempi yliluokka
Erikoistaminen: määritellään tietylle tapaukselle erikoistettu aliluokka
Olion perusluokka: luokka, jonka ilmentymänä olio on luotu
Yliluokka, aliluokka
Esi-isä, jälkeläiset
Luokkahierarkia ja kerroksittaisia olioita
AA
BB
DD
CC
EE FF
C
D
F
A A
C
F-olio
C-olio
Periytyminen (jatkoa)
Tavoitteita
Koodin uudelleenkäyttö
Inkrementaalinen ohjelmistokehitys
Käsitteelliseen mallintamiseen perustuva ohjelmistokehitys
Periytymisen merkitys
Pragmaattinen näkökulma: koodin uudelleenkäyttö, inkrementaalisuus
Käsitteellinen näkökulma: käsitteellisesti oikein olevat yleistys-erikoistus-suhteet
Periytyminen - esimerkkejäHenkilö
sosiaaliturvatunnusnimiiköpituuspainoosoitepuhelinnumerokotipaikka
Työntekijä
henkilönumerotyösuhteen alkamispäivätyösuhteen loppumispäiväkuukausipalkkatyöosoitetyöpuhelinnumeroosasto
Ohjelmoija Suunnittelija Päällikkö
Projektipäällikkö Ryhmäpäällikkö
Asiantuntija
Tietokanta-asiantuntija Käyttöliittymäasiantuntija Menetelmäasiantuntija
Periytyminen - esimerkkejä (jatkoa)
Alkoholijuoma
nimihintatuotenumerokuvausalkoholipitoisuusalkuperämaapullokokopakkauskokovalmistaja
OlutJuomasekoitus Katkero Siideri Long drinkLikööriViini Glögi
Periytyminen - esimerkkejä (jatkoa)
Alkoholijuoma
nimihintatuotenumerokuvausalkoholipitoisuusalkuperämaapullokokopakkauskokovalmistaja
Olut
oluttyyppi
IV A-olut Vahva olut III olut
Periytyminen - esimerkkejä (jatkoa)
Eläin
Kissa, Ankka, Koira…
Spanieli, Collie...
Kulkuneuvo
Juna, Moottoripyörä, Polkupyörä, Auto…
Bussi, Henkilöauto, Kuorma-auto, Traktori…
Lehti
Perhelehti, Naistenlehti, Miestenlehti, Sarjakuvalehti...
Korkeajännitys
Ilmojen korkeajännitys, Merten korkeajännitys, Aavikon korkeajännitys, Viidakon korkeajännitys...
Importointi vs. periytyminen
Importointi
Keskinäiset käyttösuhteet
Mahdollisuus viitata kirjastoon
Käännettävä ja ladattava
Periytyminen
Luodaan uusi tyyppi (luokka)
Sama käyttäytymismalli
Lisätyt tai muutetut käyttäytymismuodot
Voi edellyttää importoinnin käyttöä (yli-aliluokka viittaukset)
Suojaukset
Yleensä perityt piirteet perijän käyttöön
Mahdollisuuksia rajoituksiin (Java, C++)
Jos luokka esittelee samannimisen piirteen se peittää perityn
Samoin operaation uudelleenmäärittely
a
b
c
Yksittäisperiytyminen
Jokaisella luokalla on enintään yksi yliluokka
Luokkahierarkia on puu
Oliokielissä Java ja Smalltalk ainoastaan yksittäisperiytyminen on mahdollista
Moniperiytyminen
Olioilla voi olla useita rinnakkaisia yliluokkia
Luokkahierarkia on syklitön verkko (luokka ei voi periä itseään suoraan tai epäsuorasti)
Käytännössä ongelmallinen ja vaikeasti miellettävä
Hyödyllinen koodin uudelleenkäytössä
Javassa vain abstraktien rajapintojen moniperiytyminen
Grady Booch: ”Moniperiytyminen on kuin laskuvarjo. Yleensä et sitä tarvitse, mutta se on hyvä olla olemassa.”
Moniperiytyminen (jatkoa)
Moniperiytymisen käyttötavat
Käsitteellinen moniperiytyminen
Moniperiytyminen käsitteellisesti oikein, kuvaa luokkien välisiä todellisia suhteita
Pragmaattinen moniperiytyminen
Väline koodin uudelleenkäyttöön
Moniperiytymisen ongelmia
Monimutkaiset periytymissuhteet, vaikea hallita
Nimikonfliktit
Perii samannimisen ominaisuuden eri teitä
Kumpi voimassa?
Ratkaisuja
Kielletty
Uudelleennimeäminen
Yhdistyminen
Moniperiytymisen ongelmia (jatkoa)
Sama luokka peritään useaan kertaan
Toistuva periytyminen
Esim. henkilötiedot Kuljettajalta ja Rahastajalta Taksinkuljettajalle
Kahdentuminen
Erotteleva moniperiytyminen
Vain kertaalleen
Yhdistävä moniperiytyminen
Ratkaisuja
Kielletään
Kieli tai ohjelmoija määrittelee ratkaisun
Moniperiytyminen (jatkoa)
Oletetaan, että käsitteisiin liittyvät ominaisuudet:
Kuljettaja:
Ajokortin laatu (Integer-koodi)
Ajokortin myöntämisvuosi
Rahastaja:
Tilitysnumero
Tilitysvirheitä (Boolean)
Bussissa on erikseen henkilö, joka toimii rahastajana, mutta taksissa kuljettaja rahastaa. Näin ollen "Bussinkuljettaja" on "Kuljettajan" erikoistapaus, kun taas "Taksinkuljettaja" on sekä eräänlainen "Kuljettaja" että eräänlainen "Rahastaja".
Moniperiytyminen (jatkoa)
Kuljettaja
ajokortti
Kuljettaja
ajokortti
myöntö-vuosi
Kuljettaja
ajokortti
Rahastaja
virheitä
tilitys-numero
Taksinkuljettajaalue
Toistuva periytyminen
Toistuvassa periytymisessä sama attribuutti peritään useita reittejä pitkin
Erotteleva periytyminen
Molemmat perityt attribuutit ovat olemassa
Yhdistävä periytyminen
Luokka perii piirteen vain kerran
Toistuva periytyminen (jatkoa)
Henkilönimi
Kuljettaja
ajokortti
Kuljettaja
ajokortti
myöntö-vuosi
Kuljettaja
ajokortti
Rahastaja
virheitä
tilitys-numero
Taksinkuljettajaalue
Henkilönimi
Kuljettaja
ajokortti
Kuljettaja
ajokortti
myöntö-vuosi
Kuljettaja
ajokortti
Rahastaja
virheitä
tilitys-numero
Taksinkuljettajaalue
Henkilönimi
Luokkahierarkian linearisointi
AA
CC
BB AA
CC
BB
AA
BB
CCluokkahierarkian linearisointi
Myöhäinen sidonta
Aikainen sidonta
Aliohjelman kutsu liitetään käännösaikana määrittelyyn
Kutsuttava koodi tiedossa tuottamisvaiheessa
Myöhäinen sidonta
Oliokielissä
Toteutustapa tarkennetaan jälkeläisluokissa
Virtuaalioperaatiot
Virtuaaliset operaatiot
Avoin virtuaalioperaatio
Ilman runkoa
Runko jälkeläisluokissa
Luokalla ei voi olla ilmentymiä: abstrakti luokka
Kiinnitetty virtuaalioperaatio
Sisältää (oletus) rungon
Avoin virtuaalioperaatio - esimerkki
Henkilö
nimiikä
ristiminen(nimi : String){abstract} tervehdi()vanhene()sano(viesti : String)
Mies
tervehdi()kumarrus()
Nainen
tervehdi()niiaus()
sano("Hei")niiaus()
sano("Moro!")kumarrus()
Kiinnitetty virtuaalioperaatio - esimerkki
Henkilö
nimiikä
ristiminen(nimi : String)tervehdi()vanhene()sano(viesti : String)
Mies
tervehdi()kumarrus()
Nainen
tervehdi()niiaus()
niiaus()kumarrus()
sano("Tervehdys")
Virtuaalinen vs. ei-virtuaalinen
Virtuaalinen operaatio
+ lisää uudelleenkäytön mahdollisuuksia
+ antaa mahdollisuuden muuttaa perittyjen operaatioiden toimintatapaa
- tekee ohjelmasta vaikeammin ymmärrettävän
- pieni ajoaikainen rasite
Operaation merkityksen säilyminen uudelleenmäärittelyssä?
Monimuotoisuus eli polymorfismi
Ohjelmassa esiintyvä kohde voi tarkoittaa useita eri asioita
Perustuu myöhäiseen sidontaan ja luokille määriteltyyn yhteensopivuuteen
Muuttujan viittaama olio voi siis olla montaa eri luokkaa tarpeesta riippuen
Henkilö
Nainen
h
Henkilö h;
...
h = new Nainen();
Henkilö
Mies
h
Henkilö h;
...
h = new Mies();
Henkilöh
Henkilö h;
...
h = new Henkilö();
Operaatiopolymorfismi
Oliota pyydetään suorittamaan operaatio
Myöhäinen sidonta → suoritus riippuu olion perusluokasta (ei muuttujan staattisesta luokasta)
Tiedossa vasta ajonaikana
Kutsu aktivoi eri suorituskerroilla eri operaatioita
Myöhäisen sidonnan käyttötapoja
Rajapintaluokat
Samaan ohjelmaan erilaisia toteutuksia
Määrittelee avoimet virtuaalioperaatiot
Ei määrittele toteutusta
Operaatioita voidaan kutsua
Toteutusluokka
Perii rajapinnan eli attribuutit ja operaatiot
Samalla rajapintaluokalla voi olla useita toteutusluokkia
Myähäisen sidonnan käyttötapoja (jatkoa)
Avoin virtuaalioperaatio kun ei riittävästi tietoa toteuttamiseen
Ohjelmiston rakentaminen kiinnittämättä huomiota tarpeettomiin yksityiskohtiin
Määritysmoduulien rakentaminen
Voidaan tehdä useita eri toteutuksia tai kiinnittää toteutus myöhemmin
Monimuotoisuuden käyttötapoja
Säiliöluokka (heterogeeniset tietorakenteet)
Voi tallentaa mitä olioita hyvänsä
Luokka tarkentuu jälkeläisluokaksi
Olioiden luokka vaihtelee eri ilmentymissä
Käyttää periytymistä
Esim. pino, jono, verkko, puu, joukko