Funktionaalinen ohjelmointi hyödyllisenä osana koodaajan työkalupakkia

Funktionaalisen ohjelmoinnin käytänteet ovat yleistymässä softakehityksen alalla, ja funktionaalisen paradigman osaajille onkin tarvetta yhä useammissa kotimaisissa ohjelmointialan yrityksissä. Tässä blogitekstissä tutustumme funktionaaliseen ohjelmointiin sekä avaamme, mitä hyötyjä se tuo nykypäivän koodaukseen. 

Mitä funktionaalinen ohjelmointi on?

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. 

”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.”

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ä.

Mitä hyötyjä funktionaaliset menetelmät tuovat käytännön koodaukseen?

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. 

Ohjelmointia tavoite edellä

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.

Miksi funktionaalista ohjelmointia kannattaa siis harkita sovelluskehityksessä?

  • sen menetelmät vastaavat hyvin tämän päivän prosessorikehityksen tarpeisiin
  • lyhyempi ja abstraktimpi koodi helpottaa sen lukemista
  • funktion muokkaaminen ja tarkistaminen onnistuu ilman huolta tilamuutoksista ja sivuvaikutuksista
  • se on hyödyllinen osa ohjelmoinnin työkalupakkia monipuolisissa projekteissa