Olio (ohjelmointi)

Olio on olio-ohjelmoinnissa tietokoneohjelman perusyksikkö, joka sisältää joukon loogisesti yhteenkuuluvaa tietoa (attribuutteja) ja toiminnallisuutta (jäsenfunktioita eli metodeja). Oliot voivat kommunikoida keskenään lähettämällä viestejä tai kutsumalla toisen olioiden metodeja. Viestin vastaanottaminen suorittaa määritellyn toiminnon vastaanottavassa oliossa. Oliota käytetään ohjelmistosuunnittelussa esittämään jonkin abstraktin tai reaalimaailman käsitteen ilmentymää ohjelmistossa. Oliokielillä laaditut ohjelmat koostuvat tavallisesti lukuisista olioista, joiden yhteistyön tuloksena on ratkaisu ohjelmointiongelmaan. 
Oliolla on määritelmä, josta käytetään nimeä luokka. Luokka määrittelee jonkun tietyn oliojoukon yhteiset piirteet. Olio luodaan laatimalla luokan ilmentymä eli "instanssi", esimerkiksi varaamalla olion vaatima muisti. Esimerkiksi henkilörekisteriohjelmassa voidaan määritellä luokka "Henkilö", joka määrittelee millaista tietoa henkilöistä halutaan esittää ja millä tavalla näitä tietoja voidaan käsitellä. Ohjelman ajon aikana luokasta "Henkilö" luodaan olioita esittämään yksittäisiä henkilöitä. 
Oliokielissä oliot toteutetaan ajonaikaisina tietorakenteina, jotka sisältävät jäsenmuuttujat olion tiedon tallentamiseen. Olioiden toiminnallisuus määritellään useimmiten luokkien jäsenfunktioissa, jolloin kaikki saman luokan oliot sisältävät täsmälleen saman toiminnallisuuden tiedon käsittelyyn. Oliokieli osaa selvittää olion määrittelevän luokan, eli tyypin, ja siten käyttää oikeita jäsenfunktioita eri olioiden yhteydessä. Oikean jäsenfunktion löytämiseen on kaksi keinoa. Joko kääntäjä voi tehdä sen käännöksen yhteydessä, jolloin puhutaan staattisesta sidonnasta, tai se tapahtuu ajonaikana, jolloin kyseessä on dynaaminen sidonta.
Yksi varhaisimmista oliokielistä, 1960-luvulla kehitetty Simula esitteli luokan, olion, perinnän ja dynaamisen sidonnan käsitteet.
Toisen koulukunnan luoja on ollut Smalltalk. Näiden kahden suunnan ohjelmointikielissä käytetään toisistaan eriävää termistöä. Simulasta oliomallinsa lainanneessa C++:ssa kutsutaan luokan jäsenfunktioita, Smalltalkin jälkeläisissä kuten Objective-C:ssä niille lähetetään viestejä. Smalltalkiin perustuvissa kielissä käytetään dynaamista sidontaa, kun taas Simulaan perustuvissa kielissä suorituskykysyistä staattista silloin kun se on mahdollista.
Yleisimpiä suunnittelumalleja objekteille.
Tärkeä käsite objekteille on suunnittelumalli (design pattern). Suunnittelumalli tarjoaa uudelleenkäytettävän mallin yleisen ongelman ratkaisemiseksi. Seuraavat oliokuvaus-esimerkit ovat joitain yleisimpiä suunnittelumalleja objekteille: 
Periytyminen.
Olio-ohjelmoinnissa periytyminen on yksi keskeisimmistä elementeistä. Periytymisessä on luokan piirteiden siirtymistä toiselle luokalle säilyttäen samanlaisen toteutuksen. Kyseessä on siis periaate siitä, että yleisempi määrittely on voimassa periytyneissä objekteissa tai luokissa. Perinnän idea on lukkien organisointi hierarkkisiin periytymispuihin, jossa lapsiluokkaa perii vanhempiensa tiedon ja toiminnallisuuden. Periytymisessä ominaisuuksia saavaa luokkaa nimitetään aliluokaksi ja puolestaan antavaa luokkaa yliluokaksi. Toisin sanoen yliluokalla viitataan luokan periytymishierarkiassa ylemmän tason luokkiin, kuten kantaluokkaan ja kantaluokan kantaluokkaan. Yliluokat toimivat olio-ohjelmoinnissa perustana aliluokille ja tarjoavat niille yhteisiä ominaisuuksia ja toiminnallisuuksia.
Periytymistyypit.
Erilaisia periytymistyyppejä:
Näkyvyysmääreet.
Näkyvyysmääreet ovat olio-ohjelmoinnissa keskeisiä tekijöitä, jotka määrittävät luokan jäsenien näkyvyyden muille. Näkyvyysmääreet voidaan luokitella seuraavasti:
Jaetut oliot.
Oliolähtöinen lähestymistapa ei ole ainoastaan ohjelmointimalli. Sitä voidaan käyttää yhtä hyvin rajapinnan määrittelykielenä jaetuille järjestelmille. Jaetun laskentamallin oliot ovat yleensä suurempirakenteisia, pitkäkestoisempia ja palvelulähtöisempiä kuin muut ohjelmoinnin oliot.  
Vakiomenetelmä jaettujen olioiden paketoimiseksi on Interface Definition Language (IDL) -käyttöliittymän kautta. IDL suojaa asiakkaan kaikilta jaetun palvelinolion yksityiskohdilta. Nämä yksityiskohdat voivat olla esimerkiksi millä tietokoneella olio sijaitsee tai mitä ohjelmointikieltä tai käyttöjärjestelmää se käyttää. IDL on myös yleensä osa jaettua ympäristöä, joka tarjoaa palveluja, kuten transaktioita ja jatkuvuutta kaikille objekteille yhtenäisellä tavalla. Kaksi suosituinta jaettujen olioiden standardia ovat Object Management Groupin CORBA-standardi ja Microsoftin DCOM. 
Jaettujen olioiden lisäksi on ehdotettu useita muita laajennuksia peruskäsitteeseen, jotta jaettu tietojenkäsittely olisi mahdollista: 
Osa näistä laajennuksista, kuten jaetut oliot ja protokollaoliot, ovat verkkoaluekohtaisia termejä erilaisille “tavallisille” objekteille, joita käytetään tietyssä yhteydessä. Toiset, kuten replikoidut oliot ja live-jaetut oliot, ovat epänormaaleja, koska ne hylkäävät tavanomaisen tapauksen, jossa olio sijaitsee yhdellä paikalla kerrallaan. Ne myöskin soveltavat konseptia sellaisiin kokonaisuuksiin (replikaatteihin), jotka saattavat ulottua useisiin sijainteihin saattavat olla vain heikosti johdonmukaisia ja joiden jäsenyys voi muuttua dynaamisesti.  
Semanttinen web.
Semanttinen web on käytännössä hajautettujen objektien kehys. Kaksi keskeistä tekniikkaa semanttisessa webissä ovat Web Ontology Language (OWL) ja Resource Description Framework (RDF). RDF mahdollistaa perusobjektien, kuten nimien, ominaisuuksien, attribuuttien ja suhteiden määrittämisen, jotka ovat saatavilla internetin kautta. OWL lisää rikkaamman objektimallin, joka perustuu joukko-oppiin ja joka tarjoaa lisää mallinnusmahdollisuuksia, kuten moniperintöisyyden.
OWL-objektit eivät ole samanlaisia kuin standardit, suurikokoiset hajautetut objektit, joihin päästään Interface Definition Language -ohjelman avulla. Tällainen lähestymistapa ei sovellu internetille, koska internet muuttuu jatkuvasti, eikä standardointi yhdelle rajapintajoukolle ole helppoa. OWL-objektit ovat yleensä samankaltaisia kuin ohjelmointikielien, kuten Javan ja C++, sovellusalueiden määritysmalleissa käytettävät objektit.
OWL-objektien ja perinteisten objektipohjaisten ohjelmointiobjektien välillä on kuitenkin tärkeitä eroja. Perinteiset objektit käännetään staattisiin hierarkioihin yleensä yksiperintöisyydellä, mutta OWL-objektit ovat dynaamisia. OWL-objekti voi muuttaa rakennettaan suoritusaikana ja tulla uuden tai erilaisen luokan ilmentymäksi.
Toinen tärkeä ero on mallin tapa käsitellä tietoa, joka ei ole tällä hetkellä järjestelmässä. Ohjelmointiobjektit ja useimmat tietokantajärjestelmät käyttävät "suljetun maailman oletusta". Jos tosiasiaa ei tunneta järjestelmässä, se oletetaan vääräksi. Semanttisessa webissä käytetään avointa maailman oletusta: lausuntoa pidetään vääränä vain, jos on todellista asiaankuuluvaa tietoa, että se on väärä, muuten sitä pidetään tuntemattomana, ei totuutena eikä myöskään vääränä.
OWL-objektit ovat itse asiassa eniten samankaltaisia kuin tekoälykehysten, kuten KL-ONE:n ja Loomin objektit.
Polymorfismi.
Polymorfismi on yksi keskeisimmistä käsitteistä olio-ohjelmoinnissa. Se tarkoittaa sitä, että saman nimiset metodit tai funktiot voivat toimia eri tavalla eri objekteille. Polymorfismi mahdollistaa koodin uudelleenkäytön ja tekee siitä modulaarisempaa.
Polymorfismi perustuu periytyvyyteen, joka on toinen tärkeä olio-ohjelmoinnin käsite. Periytyvyys tarkoittaa sitä, että luokka voi periä toiselta luokalta sen ominaisuuksia ja metodeja. Periytyvyyden avulla voidaan väittää saman koodin kirjoittamista uudelleen ja useaan kertaan ja tehdä koodista modulaarisempaa ja helpommin ylläpidettävää.
Polymorfismi toteutetaan usein abstraktien luokkien tai rajapintojen avulla. Abstrakti luokka on luokka, jolla on yksi tai useampi abstrakti metodi. Abstrakti metodi on metodi, joka ei ole toteutettu kyseisessä luokassa, vaan sen toteutus jätetään sen aliluokkien vastuulle. Rajapinta on taas määrittely siitä, mitä metodeja luokka toteuttaa. Rajapinta ei toteuta mitään metodeja itse, vaan sen aliluokat toteuttavat rajapinnan metodit.
Polymorfismi on tärkeä käsite myös dynaamisissa ohjelmointikielissä, kuten Pythonissa ja JavaScriptissä. Näissä kielissä tyypit päätellään automaattisesti suorituksen aikana, mikä mahdollistaa eri tyyppisten objektien käytön samassa koodissa.
Polymorfismi on siis keskeinen käsite olio-ohjelmoinnissa, joka mahdollistaa koodin uudelleenkäytön ja tekee siitä modulaarisempaa ja helpommin ylläpidettävää. Se perustuu periytyvyyteen ja toteutetaan usein abstraktien luokkien tai rajapintojen avulla. Polymorfismi on tärkeä myös dynaamisissa ohjelmointikielissä, joissa se mahdollistaa eri tyyppisten objektien käytön samassa koodissa.
Olio-ohjelmointia tukevat kielet.
Simula (1967) on yleisesti pidetty ensimmäisenä kielenä, jolla on ensisijaiset ominaisuudet objektiperustaisesta ohjelmoinnista. Se luotiin tekemiseen, joita myöhemmin alettiin kutsumaan olioiksi. Smalltalk (1972–1980) on toinen esimerkki varhaisesta kielestä, jolla suuri osa OOP-teoriasta kehitettiin. Olio-ohjelmoinnin suhteen voidaan havaita seuraavia eroavaisuuksia: