Johdatus oliopohjaiseen ajatteluun

Preview:

DESCRIPTION

Johdatus oliopohjaiseen ajatteluun

Citation preview

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

Recommended