Tällä viikolla eräässä haastattelussa minulta kysyttiin ”mitä eroa on funktionaalisella, olio-orientoituneella ja proseduraalisella ohjelmoinnilla”, enkä rehellisesti sanottuna tiennyt, miten vastata tuohon kysymykseen (ja kuulin proseduraalisesta ohjelmoinnista ensimmäistä kertaa…). Joten tänään päätin tehdä hieman tutkimusta ja (yrittää) ymmärtää, mitkä ovat tärkeimmät erot.
Aloitetaan muutamalla määritelmällä:
” Funktionaalinen ohjelmointi (FP) on ohjelmointiparadigma – tyyli rakentaa tietokoneohjelmien rakenne ja elementit – joka käsittelee laskentaa matemaattisten funktioiden evaluointina ja välttää muuttuvien tilojen ja muuttuvien tietojen käyttöä.” – Wikipedia
” Oliopohjainen ohjelmointi (OOP) on ohjelmointiparadigma, joka perustuu ”objektien” käsitteeseen, jotka voivat sisältää dataa kenttien muodossa, joita usein kutsutaan attribuuteiksi, ja koodia proseduurien muodossa, joita usein kutsutaan metodeiksi.”” – Wikipedia
” Proseduraalinen ohjelmointi on strukturoidusta ohjelmoinnista johdettu ohjelmointiparadigma, joka perustuu proseduurikutsun käsitteeseen. Proseduurit, jotka tunnetaan myös nimellä rutiinit, aliohjelmat tai funktiot, sisältävät yksinkertaisesti sarjan suoritettavia laskennallisia vaiheita.”” – Wikipedia
Okei, tämä oli johdanto, mutta mennäänpä hieman yksityiskohtaisemmin.
Aluksi, mikä on ohjelmointiparadigma? Se on ohjelmointityyli, tapa ajatella ohjelmistojen rakentamista. Ohjelmointiparadigma ei viittaa tiettyyn kieleen vaan pikemminkin tapaan ohjelmoida, metodologiaan. Joillakin kielillä on helppo kirjoittaa joidenkin paradigmojen mukaisesti, mutta toisilla ei. Katso lisätietoja Wikipedian artikkelista.
Sukelletaan nyt kolmeen meitä tänään kiinnostavaan ohjelmointiparadigmaan:
Proseduraalinen ohjelmointi (PP), joka tunnetaan myös nimellä inline-ohjelmointi, noudattaa ylhäältä alaspäin suuntautuvaa lähestymistapaa. Siinä kirjoitetaan lista ohjeita, jotka kertovat tietokoneelle, mitä tehdä askel askeleelta. Se perustuu proseduureihin tai rutiineihin.
Objektipainotteisessa ohjelmoinnissa (OOP) on kyse tietojen ja käyttäytymisen kapseloinnista objekteihin. OOP-sovellus käyttää kokoelmaa objekteja, jotka osaavat suorittaa tiettyjä toimintoja ja olla vuorovaikutuksessa sovelluksen muiden osien kanssa. Objekti voi olla esimerkiksi henkilö. Henkilöllä olisi nimi (joka olisi objektin ominaisuus) ja hän osaisi kävellä (joka olisi metodi). OOP:n menetelmää voidaan pitää PP:n menettelynä, mutta tässä tapauksessa se kuuluu tiettyyn objektiin. Toinen tärkeä OOP:n osa-alue ovat luokat. Luokkaa voidaan pitää objektin pohjapiirustuksena.
Funktionaalisessa ohjelmoinnissa (FP) on kyse datan siirtämisestä funktiosta funktioon saadakseen tuloksen. FP:ssä funktioita käsitellään datana, eli niitä voidaan käyttää parametreina, palauttaa, rakentaa funktioita muista funktioista ja rakentaa omia funktioita. FP:ssä funktioiden on oltava puhtaita funktioita, niiden on vältettävä jaettua tilaa, ja sivuvaikutusten ja datan on oltava muuttumattomia. Puhdas funktio on funktio, joka palauttaa samantyyppisen syötteen yhteydessä aina saman tulosteen, eikä se ole riippuvainen paikallisesta tai globaalista tilasta. Jaettu tila on tila, joka on jaettu useamman kuin yhden funktion tai useamman kuin yhden tietorakenteen kesken. Kun kyseessä on jaettu tila, funktion vaikutusten ymmärtämiseksi on siis tiedettävä jokaisen jaetun muuttujan kaikki yksityiskohdat. Se lisää paljon monimutkaisuutta ja mahdollistaa vähemmän modulaarisuutta.