mikä on puhdas funktio?
hyödyt
puhtaiden toimintojen käytöstä on useita etuja sekä suorituskyvyn että käytettävyyden kannalta.
luettavuus
puhtaita funktioita on paljon helpompi lukea ja järkeillä. Kaikki merkitykselliset syötteet ja riippuvuudet ilmoitetaan parametreina, joten ei havaita vaikutuksia, jotka muuttaisivat muuttujia syöttöjoukon ulkopuolella.
tämä tarkoittaa, että voimme nopeasti ymmärtää funktion ja sen riippuvuudet pelkästään lukemalla funktion julistuksen. Eli jos funktio ilmoitetaan f(a, b, c)
, niin tiedämme, että vain a
b
, ja c
ovat riippuvaisia f
.
siirrettävyys
koska kaikki riippuvuudet annetaan syöttöparametreina, eikä niitä voida käyttää globaalin kontekstin kautta, nämä riippuvuudet voidaan vaihtaa sen mukaan, missä kontekstissa funktiota kutsutaan.
tämä tarkoittaa, että sama funktio voi toimia esimerkiksi saman resurssin eri toteutuksissa.
tämä tekee koodista paljon kannettavamman ja uudelleenkäytettävämmän, koska samaa funktiota voidaan käyttää eri yhteyksissä sen sijaan, että saman luokan eri toteutusta varten pitäisi kirjoittaa eri funktio.
esimerkiksi sen sijaan, että tarvitsisi kirjoittaa kaksi eri epäpuhdasta funktiota käyttääkseen kahta eri loggeria, jotka on tallennettu maailmanlaajuisesti, puhdas funktio ottaisi vain halutun loggerin syötteeksi.
testaus
sivuvaikutusten puute tekee puhtaista toiminnoista erittäin helppoja testata, sillä meidän tarvitsee vain testata, että tulot tuottavat halutut tuotokset. Meidän ei tarvitse tarkistaa minkään globaalin ohjelman tilan pätevyyttä tiettyjen toimintojen testauksissamme.
lisäksi, koska kaikki riippuvuudet annetaan syötteinä, voimme helposti pilkata riippuvuuksia. Epäpuhtaissa olosuhteissa meidän olisi seurattava jonkin maailmanlaajuisen riippuvuuden tilaa kaikkien testien ajan.
kuitenkin puhtaassa asetelmassa antaisimme kaikki riippuvuudet syötteenä. Meidän ei enää tarvitse huolehtia globaalin tilan ylläpitämisestä testeissämme, ja voimme nyt mahdollisesti tarjota erilaisia versioita riippuvuuksista eri testeihin.
tämän avulla voimme testata funktioita ja hallita erikseen annettuja riippuvuuksia kussakin testissä.
Referentiaalinen läpinäkyvyys
Referentiaalinen läpinäkyvyys tarkoittaa sitä, että funktion kutsu voidaan korvata sen vastaavalla lähtöarvolla muuttamatta ohjelman käyttäytymistä.
referentiaalisen läpinäkyvyyden saavuttamiseksi funktion on oltava puhdas. Tästä on hyötyä luettavuuden ja nopeuden kannalta. Kääntäjät pystyvät usein optimoimaan koodia, joka osoittaa viittaavan avoimuuden.
välimuistin tallentaminen
koska puhtaat funktiot palauttavat aina saman lähdön samalle syötölle, voimme välimuistata puhtaiden funktiokutsujen tulokset.
välimuistilla tarkoitetaan tekniikan, kuten memooinnin, käyttämistä funktioiden tulosten tallentamiseen niin, että niitä tarvitsee laskea vain kerran.
tyypillisesti funktiolle f: Input -> Output
tämä tapahtuu kartan (kuten hash-map) avulla Input -> Output
.
funktiota suoritettaessa tarkistetaan ensin, sisältääkö kartta syötteen avaimena. Jos niin käy, palautamme kartan lähtöarvon, muuten laskemme f(input)
ja tallennamme lähtökartalle ennen sen palauttamista.