Funktionaalisella ohjelmointiparadigmalla tarkoitetaan sellaisia ohjelmointikäytänteitä, joiden keskiössä ovat matematiikan funktioita muistuttavat ns. pure-funktiot, jotka palauttavat tuloksen funktion syötteen perusteella ilman sivuvaikutuksia ympäristöönsä.
Funktionaalinen ohjelmointi on vaihtoehto valloillaan olevalle imperatiiviselle ohjelmointiparadigmalle, kuten esimerkiksi olio-ohjelmoinnille, jossa kuvataan erilaisia olioita sekä niiden tilamuutoksia. Siinä missä oliopohjaisessa koodauksessa pyritään kuvaamaan, miten olioiden tilaa ja ominaisuuksia muutetaan halutun lopputuloksen saamiseksi, funktionaalinen ohjelmointi keskittyy siihen, mitä koodilla halutaan saada aikaan.
Paradigmassa ei ylläpidetä olio-ohjelmoinnin tapaan jaettua tilaa, jossa jaetaan muuttujien arvoja useiden funktioiden ja prosessien kesken, vaan funktion on tarkoitus muistuttaa matematiikan funktiota, joka tietää ainoastaan sille syötetyn arvon. Funktio siis ottaa vastaan ja palauttaa arvoja itsenäisenä osana koodia, eikä se voi saada muuta tietoa ulkopuolista kautta.
Funktionaalinen koodaus ei sinänsä ole uusi ilmiö, vaan sen juuret ovat jo 1930-luvun lambdakalkyylissa. Tähän paradigmaan pohjautuvat kielet ovat olleet suosittuja jo pitkään akateemisessa maailmassa ja tutkimuskäytössä, mutta esimerkiksi teollisuudessa ja kaupallisessa ohjelmistokehityksessä ne ovat suhteellisen uusia tulokkaita.
Eräs syy funktionaalisen paradigman yleistymiseen on tietokoneiden komponenttien kehitys. Viime vuosina tietokoneiden prosessorien kellotaajuus ei ole kasvanut yhtä nopeasti suhteessa prosessien ydinten määrään, eli käytännössä koneilla ei voida suorittaa käskyjä yhtä nopeasti peräkkäin, vaan niitä suoritetaan sen sijaan rinnakkain. Funktionaalinen ohjelmointi soveltuu siis hyvin nopeaan rinnakkaislaskentaan, koska pure-funktioiden suorituksen järjestyksellä ei ole väliä.
Matemaattisia funktioita voidaan soveltaa koodauksessa lähes kaikkiin mahdollisiin tarpeisiin. Kun asiaa voidaan ajatella matemaattisesti, pystytään nostamaan koodin uudelleenkäytettävyyttä sekä abstraktiotasoa – abstraktimpi koodi on sekä monikäyttöisempää että lyhyempää.
Funktionaalinen koodi on lähtökohtaisesti tilatonta, koska funktio palauttaa vain tuloksen siihen syötettyjen arvojen perusteella, eikä siihen vaikuta ulkopuoliset tekijät. Tämän ansiosta koodin luettavuus, muokattavuus ja testattavuus helpottuu, kun ohjelmoija voi olla huoletta, etteivät muutokset vaikuta sivuvaikutuksena muihin ympäristön koodeihin.
Mikäli editoidaan jo olemassa olevaa ja vaikkapa vuosia sitten kirjoitettua koodia, sen muokkaaminen on usein hyvin hidasta riippumatta siitä, muokkaako sitä itse kirjoittaja vai ulkopuolinen henkilö. Vaatiikin yleensä aikaa ja vaivaa että ymmärretään, miten ja miksi tila vaihtuu jossain ympäristössä ja mihin se vaikuttaa. Funktionaalisessa ohjelmoinnissa muokkaaja voi siis luottaa funktion vaikuttavan vain omaan outputiinsa eli palautettavaan arvoon, ei muihin funktioihin.
Lisäksi suuri osa ohjelmointityöstä on koodin toimivuuden säännöllistä testausta. Funktiopohjaisen koodin testaaminen on yleensä vaivattomampaa, koska mainittua koodin ulkopuolista tilaa ei tarvitse ottaa huomioon, vaan funktioita voidaan testata omana osanaan erillään muista.
Kaikkiaan funktionaalinen koodi tuo siis suoraviivaisuutta sekä turvallisuuden tunnetta joko oman tai toisen työn jatkamiseen tai muokkaamiseen – etenkin, jos tarkkaa dokumentaatiota tilan ja sovelluksen käyttäytymisestä ei ole saatavilla.
Funktionaaliset ohjelmointimenetelmät ovat Metatavullakin vielä aikaisen käyttöönoton vaiheessa, mutta niitä on jo testattu onnistuneesti joissain projekteissa. Usein käytännön koodauksessa funktionaalisen ja oliopohjaisen ohjelmoinnin piirteet kuitenkin sekoittuvat, ja usein lähtökohtaisesti funktionaalisin menetelmin kehitetty sovellus sisältää myös oliopohjaista, tilaa muuttavaa koodia.
Ohjelmointiprojekteissa kannattaakin aina miettiä, mikä on paras työkalu suoritettavaan tehtävään. Jos jokin asia on huomattavasti helpompaa koodata oliopohjaisella paradigmalla funktionaalisen sijaan, ei työtä suotta kannata lähteä tekemään vaikeimman kautta. Funktionaalista ohjelmointia kannattaa siis ajatella yhtenä työkaluna pakissa – sen menetelmiä on hyvä osata käyttää ja se voi parhaimmillaan tuoda koodaukseen merkittäviäkin hyötyjä.
Ei siis suinkaan ole itseisarvo, että kaikki ohjelmoijat ja yritykset päätyvät käyttämään ainoastaan funktionaalista ohjelmointiparadigmaa, eikä niin luultavasti kannata ollakaan. Koodauksen maailmassa paradigmojen käyttö on vaihdellut vuosikymmenten aikana, ja onkin hyvä oppia sopeutumaan ja vastaamaan ajankohtaisiin tarpeisiin.
Metatavulla ohjelmakehityksemme ja osaamisemme ydin on laadukkaan softan suunnittelu ja toteutus. Näemme asiat kokonaisuuksina ja ymmärrämme, että aidosti arvoa tuottavan ja toimivan ratkaisun tekeminen vaatii paljon muutakin.
Kiinnostuitko? Olehan yhteydessä ja jutellaan lisää!