Mitä oliot ovat?

Tähän asti ohjelmissa on käsitelty yksinkertaisia muuttujia, jotka voivat saada arvokseen esimerkiksi kokonaislukuja tai desimaalilukuja, sekä listoja ja muita tietorakenteita, joissa kaikki alkiot ovat olleet keskenään samantyyppisiä. Monesti käytännön sovelluksissa joudutaan kuitenkin käsittelemään selvästi monimutkaisempia kokonaisuuksia.

Ajatellaan esimerkkinä ohjelmaa, jonka halutaan käsittelevän erään ohjelmointikurssin opiskelijoita. Kurssilla on kaksi osasuoritusta, tentti ja harjoitukset, joista kummastakin annetaan oma arvosana. Jokaisesta opiskelijasta tarvitaan ohjelmasssa ainakin nimi, opiskelijanumero, tenttiarvosana ja harjoitusarvosana. Kysymys on siitä, miten opiskelijoiden tietoja kannattaisi käsitellä kirjoitettavassa ohjelmassa.

Yksi tapa olisi tehdä neljä eri listaa: yksi opiskelijoiden nimiä, yksi opiskelijanumeroita, yksi tenttiarvosanoja ja yksi harjoitusarvosanoja varten. Saman opiskelijan tiedot olisivat eri listoissa aina samalla indeksillä. Jos esimerkiksi opiskelijan nimi on listassa nimet indeksillä 5, on myös hänen harjoitusarvosanansa listassa harjoitusarvosanat indeksillä 5. Tämä tapa on kuitenkin huono, koska siinä yhden opiskelijan tiedot on hajautettu neljään eri listaan. Ohjelmassa ei ole järkevää tapaa käsitellä yhden opiskelijan tietoja yhtenä kokonaisuutena, vaan tiedot on aina yhdistettävä neljästä eri listasta. Tapa on myös hyvin altis virheille. Jos listoista poistetaan yhden opiskelijan tiedot, on muistettava poistaa alkio jokaisesta neljästä listasta. Muussa tapauksessa eri opiskelijoiden eri tiedot menevät täysin sekaisin.

Toinen tapa olisi koota yhden opiskelijan tiedoista yksi lista, jossa on ensimmäisenä alkiona opiskelijan nimi, toisena alkioina opiskelijan opiskelijanumero, kolmantena alkiona tenttiarvosana ja neljäntenä alkiona opiskelijan harjoitusarvosana. Listan alkiot voivat olla keskenään erityyppisiä, joten ei haittaa, vaikka nimi ja opiskelijanumero ovat merkkijonoja ja arvosanat kokonaislukuja. Kurssin kaikista opiskelijoista muodostetaan puolestaan suurempi lista, jonka alkiot ovat yksittäisten opiskelijoiden tietoja sisältäviä listoja.

Toinen tapa on selvästi ensimmäistä tapaa parempi. Siinä yhden opiskelijan tiedot on koottu yhdeksi kokonaisuudeksi. Tässäkin tavassa on kuitenkin puutteita. Esimerkiksi se, missä järjestyksessä opiskelijan eri tiedot on annettu listassa, perustuu vain sopimukseen, joka ohjelmoijan pitää muistaa. Olisi helpompaa, jos voitaisiin selkeästi nimetä, että nyt käsitellään opiskelijan nimeä sen sijaan, että puhuttaisiin vain listan indeksillä 0 olevasta alkiosta. Lisäksi listatoteutus ei vielä mitenkään määrittele sitä, millaisia operaatioita opiskelijan tiedoille voidaan tehdä. Olisi hyödyllistä, jos voitaisiin selkeästi määritellä esimerkiksi se, miten opiskelijan tenttiarvosanaa voidaan muuttaa. Tässä määrittelyssä voitaisiin ottaa huomioon se, että arvosanan on oltava määrätyllä välillä ja estää antamasta opiskelijalle virheellisiä (esimerkiksi negatiivisia tai liian suuria) arvosanoja.

Olio-ohjelmointi (engl. object-oriented programming) tarjoaa tavan samalla säilyttää toisen ratkaisutavan edut (yhden opiskelijan tietoja käsitellään yhtenä kokonaisuutena) ja ratkaista siinä olevat ongelmat. Olio-ohjelmoinnissa jokaista kurssin oikeaa opiskelijaa vastaa ohjelmassa yksi opiskelijaolio. Opiskelijaolion eri tiedot (nimi, opiskelijanumero, harjoitusarvosana ja tenttiarvosana) on selvästi nimetty ja ohjelmassa on myös selvästi määritelty, millaisia operaatioita opiskelijaolioille voidaan suorittaa ja miten nämä operaatiot tehdään.

Kurssin kaikkia opiskelijoita käsittelevässä ohjelmassa luodaan siis jokaista oikeaa opiskelijaa kohti opiskelijaolio. Lisäksi voidaan tehdä lista, joka sisältää kaikki luodut opiskelijaoliot ja päästä näin käsittelemään kurssin kaikkia opiskelijoita. Tarkastelemme tällaista listaa vasta myöhemmin ja aloitamme ohjelmilla, jotka käsittelevät vain paria opiskelijaa.

Jo tässä vaiheessa on syytä huomata, että tällä kurssilla käsitellään olio-ohjelmoinnin mahdollisuuksista vain hyvin pientä osaa. Olio-ohjelmointi sisältää paljon muutakin (esimerkiksi perintä), mikä ei kuulu tämän kurssin aihealueeseen.