maanantai 2. maaliskuuta 2009

Luento 15 - Oliokielten erityispiirteitä

Oliot, nuo kaikenkarvaiset pikkukaverit, olivat viikon ainoan luennon aiheena. Sinänsä asia oli jo varsin tuttua, mutta kertauksesta ei ollut haittaa. Samalla tuli opittua muutama uusi asiakin.

Olio-ohjelmointiparadigma on varsin käytetty mutta väärin ymmärretty tapa koostaa ohjelmia. Ei olekaan yllätys, että olio-ohjelmointi on määritelty usein eri tavoin.

Luennolla esitetty Boochin määritelmä oliosta tilan, käyttäytymisen ja identiteetin summana on mielestäni varsin toimiva abstraktilla tasolla. Olio-ohjelmoinnissa on olennaista nimenomaan tämä toisiinsa liittyvien asioiden paketointi samaan kokonaisuuteen eli olioon.

Käsittääkseni olio-ohjelmoinnin lähtökohtana on ollut tarve mallintaa todellisen maailman simuloitavia kohteita. Tätä vartenhan Simulakin kehitettiin. Toki käytännössä mallinnuskohteen ei tarvitse olla konkreettinen, reaalimaailman aspekti. Tässä kohden olio-ohjelmointi voikin muuttua jossain määrin haasteelliseksi. Ongelmaksi muodostuu tilanteeseen sopivan abstraktion löytäminen.

Olio-ohjelmointi voidaan esittää myös abstraktin datatyypin (ADT) ja perinnän summana. Tämä määritelmä jättää kuitenkin huomiotta useita olio-ohjelmoinnissa olennaisia käsitteitä. Taivalsaaren määritelmä, jossa olio-ohjelmointi nähdään olioiden ja summaus (increment)/muokkausoperaatioiden (modification) summana on jo lähempänä sopivaa kompromissia.

Boochin määritelmän (olio=tila+käyttäytyminen+identiteetti) osat ovat sellaisinaan varsin mielenkiintoisia. Tila voidaan rinnastaa attribuutteihin, käyttäytyminen metodeihin ja identiteetti voidaan ajatella esimerkiksi muistiosoitteena, joka osoittaa olion sijaintiin muistissa. Identiteetti voidaan määritellä myös muita tapoja käyttäen.

Periaatteessa identiteetti voisi olla piilotettu attribuutti, joka sisältyy olioon itseensä. Identiteetin tapauksessa oleellista lienee se, että se pysyy konsistenttina koko järjestelmässä koko ajan (toisin sanoen, jos identiteetin arvoa muutetaan, tulee muutoksen heijastua koko järjestelmään) sekä että se on uniikki.

Luennolla esiteltiin ratkaisuja tapaukseen, jossa oliot on hajautettu useisiin eri paikkoihin (hajautettu järjestelmä). Tässä yhteydessä en ryhdy käymään esitettyjä malleja läpi. Mielestäni tässä tapauksessa uniikkiuden vaatimuksesta voidaan kuitenkin hieman joustaa.

Joustaminen on mahdollista siinä tapauksessa, että hajautettuja osia ajatellaan kokonaisuuksina, joille kullekin määritellään oma järjestelmien tasolla uniikki tunniste. Kyseistä tunnistetta käytetään olion oman tunnisteen siinä tapauksessa, kun olion identeetti tulee selvittää. Tällöin kunkin osajärjestelmän oliot voivat sisältää samoja tunnisteita.

Mitä jos olio siirrettäisiin toisesta osajärjestelmästä toiseen? Tässä tapauksessa on mahdollista, että tunnisteet törmäävät. Toisin sanoen kyseisen operaation tapauksessa olion tunnistetta tulee muuttaa. Muutoksen tulee heijastua koko järjestelmään, jotta siinä olisi mitään mieltä.

Käytännössä yllä esitettyä ratkaisutapaa helpompiakin tapoja löytyy. Tarkoituksena oli lähinnä osoittaa, että identiteetin käsitettä voi tarvittaessa osittaa.

Luennolla käytiin läpi myös prototyyppi- ja luokkaperustainen tapa luoda olioita. Luokkaperustainen tapa on ehdottomasti näistä käytetympi. Näenkin sen prototyyppipohjaisen tavan abstraktiona. Luokkien avulla voidaan tarvittaessa toteuttaa prototyyppiperustainen järjestelmä. Näin ainakin Pythonissa. Toki kyseinen temppu vaatii hieman metaohjelmointia, muttei paljon.

Lambda-syntaksina kumpikin tapa näytti varsin yksinkertaiselta. Notaatiota muistutti minua suuresti hajautustauluista avain-arvo pareineen. Ei olekaan tavatonta toteuttaa oliotoiminnallisuutta juuri hajautustauluja käyttäen. Lua on hyvä esimerkki tästä.

Olio-ohjelmoinnin suolana voidaan pitää perintää. Tämä näkyy jo aiemmin mainitusta määritelmästä olio-ohjelmointi=ADT+perintä. Pohjimmiltaan kyse on siitä, kuinka kutsuttuja metodeja etsitään. Perivä olio voi yksinkertaisimmillaan sisältää vain viitteet vanhempiinsa. Käsittääkseni tämä tapa toimii myös moniperinnän tapauksessa, kunhan etsintäjärjestys on sovittu jotenkin järkevästi. Moniperinnän ongelmanahan on se, että samanniminen metodi voidaan määritellä useassa vanhemmassa. Toki myös suorat viitteet käytettävissä oleviin attribuutteihin ja metodeihin toimivat. Tämä tapa tosin syö enemmän muistia kuin suora viite vanhempiolioihin.

1 kommentti:

  1. Tähän postaukseen en keksi mitään oleellista lisättävää. Mielestäni luennolla käytiin olio-ohjelmointiin liittyviä asioita ihan asiallisesti läpi. Suuri osa luennolla läpi käydyistä asioista oli jo ennalta hyvin tuttuja. Ehkä tärkein käyty asia oli tuo perintään liittyvät viitteet ja niiden käsittely.

    VastaaPoista