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.