Hvad er en ren funktion?
fordele
der er flere fordele ved at bruge rene funktioner, både hvad angår ydeevne og brugervenlighed.
læsbarhed
rene funktioner er meget lettere at læse og begrunde. Alle relevante input og afhængigheder leveres som parametre, så der observeres ingen effekter, der ændrer variabler uden for sættet af input.
dette betyder, at vi hurtigt kan forstå en funktion og dens afhængigheder, bare ved at læse funktionens erklæring. Så hvis en funktion er erklæret som f(a, b, c)
så ved vi, at kun a
b
og c
er afhængigheder af f
.
portabilitet
da alle afhængigheder leveres som inputparametre og ikke er tilgængelige gennem en global kontekst, kan disse afhængigheder udskiftes afhængigt af den kontekst, hvori funktionen kaldes.
dette betyder, at den samme funktion kan virke på forskellige implementeringer af den samme ressource, for eksempel.
dette gør koden meget mere bærbar og genanvendelig, da den samme funktion kan bruges i forskellige sammenhænge snarere end at skulle skrive en anden funktion bare for at bruge en anden implementering af samme klasse.
for eksempel, i stedet for at skulle skrive to forskellige urene funktioner for at bruge to forskellige loggere, der er gemt globalt, ville en ren funktion bare tage den ønskede logger ind som input.
test
manglen på bivirkninger gør pure-funktioner meget lette at teste, da vi kun behøver at teste, at inputene producerer de ønskede output. Vi behøver ikke at kontrollere gyldigheden af nogen global programtilstand i vores test af specifikke funktioner.
da alle afhængigheder leveres som input, kan vi let håne afhængigheder. I en uren indstilling skal vi holde styr på tilstanden af en vis global afhængighed gennem alle testene.
men i en ren indstilling ville vi simpelthen give alle afhængigheder som input. Vi behøver ikke længere bekymre os om at opretholde global tilstand gennem vores test, og vi kan nu potentielt levere forskellige versioner af afhængigheder til forskellige tests.
Dette giver os mulighed for at teste funktioner, mens vi eksplicit har kontrol over de leverede afhængigheder i hver test.
referentiel gennemsigtighed
referentiel gennemsigtighed henviser til at være i stand til at erstatte en funktions opkald med dens tilsvarende outputværdi uden at ændre et programs opførsel.
for at opnå referentiel gennemsigtighed skal en funktion være ren. Dette har fordele med hensyn til læsbarhed og hastighed. Kompilatorer er ofte i stand til at optimere kode, der udviser referentiel gennemsigtighed.
Caching
da pure-funktioner altid returnerer det samme output for det samme input, kan vi cache resultaterne af pure-funktionsopkald.
Caching refererer til at bruge en teknik, såsom memoisering, til at gemme resultaterne af funktioner, så vi kun behøver at beregne dem en gang.
typisk for en funktion f: Input -> Output
dette opnås gennem et kort (såsom et hash-kort) fra Input -> Output
.
når vi udfører en funktion, kontrollerer vi først, om kortet indeholder input som en nøgle. Hvis det gør det, returnerer vi kortets outputværdi, ellers beregner vi f(input)
og gemmer derefter output på kortet, før det returneres.