OOP-perusasiat

Timo Ahjos 19.5.1999

Miksi OOP on paras ajattelutapa?
Keskeiset OOP-käsitteet
Tietotekniset objektit

Näillä sivuilla lyhennettä OOP, joka tulee sanoista "Object-Oriented Programming" (oliopohjainen ohjelmointi), käytetään ohjelmoinnin lisäksi myös hahmottamisesta, analysoinnista, suunnittelusta ja kaikesta muustakin, missä toimitaan saman "paradigman" pohjalta, johon oliopohjainen ohjelmointi perustuu. Suomenkielen sana "olio" tuo helposti mieleen elollisen olennon. Näillä sivuilla käsitellään kuitenkin lähes yksinomaan elottomia ja abstrakteja olioita. Väärinkäsitysten välttämiseksi kutsun niitä sen vuoksi mieluummin lainasanaa käyttäen "objekteiksi".

Miksi OOP on paras ajattelutapa?

Koska se lienee ainoa ajattelutapa:-). Monet isotkin järjestelmät ja organisaatiot on kuitenkin rakennettu OOP-periaatteiden vastaisesti, ikäänkuin luonnonlakeja rikkoen. Tietokoneiden muistikapasiteetti on aivan viime vuosiin asti ollut liian vähäinen OOP:n soveltamiseksi konetasolla arkipäivän tietokonesovelluksissa.

Maailmankaikkeuden voidaan katsoa ns. kvanttitasolla koostuvan hiukkasista, joilla on toisaalta materiaalista ja toisaalta energialuonnetta. Elolliset olennot hahmottavat kuitenkin ympäristönsä koostuvan erilaisista objekteista jäljempänä kuvatulla tavalla. Objektien hahmotus tapahtuu aina ajattelijan aivoissa. Eri olennot hahmottavat saman todellisuuden koostuvan erilaisista objekteista. Jokaisen hahmotus on yhtä oikea ja oikeutettu. "In der Menschenwelt gibt es nur Menschendinge - In der Libellenwelt gibt es nur Libellendinge". (Ihmisen maailmassa on vain ihmisen esineitä - sudenkorennon maailmassa on vain sudenkorennon esineitä.)

Keskeiset OOP-käsitteet

Objekti:
Objekti (eli olio) on itsenäisenä kokonaisuutena hahmottuva todellisuuden osa. Esimerkiksi vieressäni oleva kirjahylly on eräs objekti. Sinulla oleva kirjahylly on toinen objekti. Objekti on aina tietty yksilö, eli sinun hyllysi on eri objekti kuin minun hyllyni, vaikka ne olisivat aivan samanlaiset.

Objektiluokka:
Objektiluokka on abstrakti käsite, jonka ilmentymiä (instances) yksittäiset objektit ovat. Sinun ja minun kirjahyllyni ovat molemmat objektiluokan "kirjahylly" ilmentymiä.

Luokkahierarkia:
Objektiluokat rakentuvat hierarkisesti. Esim. objektiluokka "kirjahylly" sisältyy objektiluokkaan "huonekalu". Sisältymisen relaatio (containership) on yksi OOP:n peruskäsitteistä. Esim. jos Lahdessa lopetettaisiin huonekalujen valmistus, se tarkoittaisi, että sekä kirjahyllyjen että pöytien valmistus lopetettaisiin. Siis myös objektiluokka "pöytä" sisältyy objektiluokkaan "huonekalu".

Luokan ja objektin ero:
Objekti voi syntyä kahdella tavalla: Se "instantioidaan" joko objektiluokasta tai toisesta objektista. Edellistä vastaa se, että kirjahylly tehdään piirustuksista. Piirustukset kuvaavat tietynlaisen kirjahyllyn samalla tavalla kuin objektiluokka kuvaa objektin. Kirjahyllyn kuva ei kuitenkaan ole kirjahylly. Vastaavasti objektiluokka ei ole objekti, vaan objektin kuvaus.

Ominaisuuksien periytyminen:
Objektiluokka muodostetaan usein toisesta objektiluokasta. Vastaavasti objekti syntyy usein toisesta objektista. Syntyessään objektiluokka tai objekti perii ominaisuuksia siitä objektiluokasta tai objektista, josta se muodostetaan. Esim. Lundian kirjahyllyn pohjana on objektiluokan "kirjahylly" yleinen määrittely, johin on lisätty Lundian erityispiirteet. Lundian hylly on alunperin perinyt kaikki normaalin kirjahyllyn yleiset ominaisuudet, mutta Lundia sittemmin muuttanut eräitä ominaisuuksia.

Kapselointi:
Kapselointi tarkoittaa sitä, että objektit ovat itsenäisiä toimivia komponentteja, joiden sisäisiin asioihin ulkopuoliset eivät pääse käsiksi. Kapselointi on kaikkien toimivien järjestelmien elinvoimaisuuden edellytys, siis yhtä hyvin biologisten olentojen, organisaatioiden kuin tietojärjestelmienkin. Kirjahyllyn tapauksessa kapselointi tarkoittaa esim. sitä, että myyntipakkaus sisältää puuosien lisäksi myös tarvittavat ruuvit, hyllynkannattimet, kokoamisohjeen, ehkä jonkin työkalun, jne. Saadessaan tuollaisen "kapselin" asiakas saa yhdellä kertaa kaiken sen, mistä kirjahylly koostuu, eikä hänen tarvitse mennä huonekaluostoksen jälkeen etsimään rautakaupasta siihen sopivia ruuveja ja muita nippeleitä. Toisaalta huonekaluliike myy vain kokonaisia kapseleita eikä esim. pura kirjahyllyn myyntipakkausta myydäkseen siitä pelkät hyllynkannattimet.

Polymorfismi:
Polyformismi tarkoittaa monimuotoisuutta siinä mielessä, että sama käsite voi tarkoittaa eri yhteyksissä yksityiskohdiltaan erilaisia asioita, jotka tietyllä abstraktiotasolla samaistetaan. Se helpottaa ajattelemista huomattavasti. Esim. huonekalun "kokoaminen" on tyypillinen polymorfinen ilmaus. Sekä kirjahylly että pöytä kootaan ja kummankin pakkauksessa on sitä varten ohje. Yksityiskohdissaan pöydän kokoaminen tapahtuu kuitenkin aivan eri tavalla kuin kirjahyllyn kokoaminen. Silloin kun ei ole tarpeen mennä yksityiskohtiin, voidaan polymorfisesti todeta, että kumpikin niistä kootaan oman ohjeensa mukaisesti.

Tapahtumat ja niiden käsittelyelimet:
Objektit kommunikoivat ympäristönsä kanssa ottamalla vastaan viestejä, reagoimalla niihin ja lähettämällä viestejä. Kapseloinnin periaatteisiin kuuluu, että ulkopuolelta tuleva viesti ei saa päästä suoraan objektin sisäelimiin vaan se otetaan vastaan objektin ulkopinnalla, jossa saatu viesti arvioidaan. Objekti reagoi vain sellaisiin viesteihin, joita varten sillä on tapahtuman käsittelijä (event handler). Esimerkiksi kirjahylly ei reagoi musiikkiin, mutta se reagoi kuumuuteen.

Ominaisuudet ja metodit:
Objekteilla on yleensä paljon erilaisia ominaisuuksia, joista osa on perittyjä ja osa myöhemmin hankittuja tai muutettuja. Metodeiksi kutsutaan sellaisia ominaisuuksia, joihin liittyy toimintaa. Esim. kirjahyllyn väri on vain tavallinen ominaisuus, mutta sen taipumus kaatua tietynlaisissa tilanteissa on toiminnallinen ominaisuus eli metodi.

Tietotekniset objektit

Hahmottaessaan todellisuutta ja erilaisia asioita ajatellessaan ihminen soveltaa huomaamattaan kaikkia edellä lueteltuja OOP-käsitteitä. Ihmisen aivot ovat aina toimineet OOP-periaatteella.

Tietotekniikassa emme käsittele fyysisiä objekteja, kuten kirjahyllyjä. Sensijaan tarkastelemme sitä informaatiota, joka on aivoissa tai tietokoneessa, vaikkapa kirjahyllystä. Pystymme luomaan täsmällisen mielikuvan esim. punaiseksi maalatusta kirjahyllystä nähtyämme valkeaksi maalatun hyllyn. Meillä on siis aivoissa ensin mielikuva näkemästämme valkeasta hyllystä. Sitten muutamme tuossa mielikuvassa ominaisuuden "väri=punainen", jonka jälkeen meillä on mielikuva punaiseksi maalatusta hyllystä. Mielikuvamme on niin todellinen, että voimme tulostaa sen paperille värikynillä piirtämällä, vaikka kenelläkään ei olisi punaista kirjahyllyä.

Biologisissa aivoissa on runsaasti lajikohtaisesti valmiiksi koodattua (hard-coded) aineistoa. Sensijaan tietokoneen "sähköaivot" ovat tyhjät, kun konetta käynnistetään. dBASE:sta puhuttaessa voimme lähteä siitä, että objektit ovat olemassa vain tietokoneen muistissa. Ne elävät siellä enintään niin kauan kuin kone on käynnissä. Analogia ihmisaivoihin toimii, jos unohdamme fyysiset objektit ja ajattelemme vain sitä informaatiota, mikä meillä on kustakin asiasta omissa aivoissamme. Esim. minulla on tuolla pysäköintipaikalla auto, jota voisimme pitää objektina. Toisaalta minulla on aivoissani mielikuva siitä autosta. Mielikuva pysyy aivoissani, vaikka auto romutettaisiin. Siis myöskin se mielikuva on todellisuutta ja sitäkin voidaan pitää objektina.

Edellä sanottu saattaa tuntua aluksi saivartelulta, mutta siihen sisältyy oivallus, jonka jälkeen vasta aloin ymmärtää dBASE:n objekteja ja luokkahierarkiaa.

Kun tietokone on sammutettuna, sen keskusmuistissa ei ole mitään. Levyillä voi olla objektiluokkien kuvauksia, mutta ei objekteja. Kun kone ja dBASE-istunto käynnistetään, koneen keskusmuistiin voidaan luoda eli "instantioida" objekteja joko objektiluokkien kuvauksista tai toisista objekteista. OOP on sitä, että ohjelmallisesti luodaan objekteja, joilla on halutut ominaisuudet. Toimintakin ohjelmoidaan siten, että jollekin objektille annetaan ominaisuudeksi kyky suorittaa kyseinen tehtävä. OOP-ohjelmoija ei varsinaisesti ohjelmoi sitä, mitä istunnon aikana tapahtuu (kuten ns. proseduraalisessa ohjelmoinnissa oli tapana).

Kun ihminen käyttää dBASE-sovellusta, hän aiheuttaa valinnoillaan ja toimenpiteillään erilaisia tapahtumia. dBASE-sovellus on tapahtumaohjattu (event driven). Objektit reagoivat tapahtumiin omien tapahtumakäsittelijöittensä (event handler) mukaisesti, esim. muuttamalla omia ominaisuuksiaan tai suorittamalla omia metodejaan.

Eräät dBASE-objektit kommunikoivat ulkomaailman kanssa. Esim. SQL-objekteilla on kyky käsitellä levyillä olevaa dataa ja raportti-objektilla on kyky tulostua paperille. Siten työn tulos saadaan talteen, vaikka kaikki tietokoneen keskusmuistissa olevat objektit kuolevatkin istunnon päättyessä.

Sivun alkuun