Hva Er En Ren Funksjon?
Fordeler
det er flere fordeler med å bruke rene funksjoner, både når det gjelder ytelse og brukervennlighet.
Lesbarhet
Rene funksjoner er mye lettere å lese og begrunne om. Alle relevante innganger og avhengigheter er gitt som parametere, så ingen effekter observeres som endrer variabler utenfor settet av innganger.
Dette betyr at vi raskt kan forstå en funksjon og dens avhengigheter, bare ved å lese funksjonens erklæring. Så, hvis en funksjon er erklært som f(a, b, c)
så vet vi at bare a
b
og c
er avhengigheter av f
.
Portabilitet
siden alle avhengigheter leveres som inngangsparametere og ikke nås gjennom en global kontekst, kan disse avhengighetene byttes ut avhengig av konteksten der funksjonen kalles.
dette betyr at den samme funksjonen kan virke på forskjellige implementeringer av samme ressurs, for eksempel.
dette gjør koden mye mer bærbar og gjenbrukbar, da samme funksjon kan brukes i ulike sammenhenger, i stedet for å måtte skrive en annen funksjon bare for å bruke en annen implementering av samme klasse.for eksempel, i stedet for å måtte skrive to forskjellige urene funksjoner for å bruke to forskjellige loggere som er lagret globalt, ville en ren funksjon bare ta inn ønsket logger som en inngang.
Testing
mangelen på bivirkninger gjør rene funksjoner veldig enkle å teste, da vi bare trenger å teste at inngangene gir de ønskede utgangene. Vi trenger ikke å sjekke gyldigheten av noen global programstatus i våre tester av spesifikke funksjoner.
i tillegg, som alle avhengigheter er gitt som innganger, kan vi enkelt mock avhengigheter. I en uren setting måtte vi holde styr på tilstanden til noen global avhengighet gjennom alle testene.
Men i en ren setting ville vi bare gi alle avhengigheter som input. Vi trenger ikke lenger å bekymre oss for å opprettholde global tilstand gjennom våre tester, og vi kan nå potensielt gi forskjellige versjoner av avhengigheter til forskjellige tester.
Dette tillater oss å teste funksjoner mens eksplisitt har kontroll over de angitte avhengighetene i hver test.
Referansegjennomsiktighet
Referansegjennomsiktighet refererer til å kunne erstatte en funksjons kall med tilhørende utgangsverdi uten å endre oppførselen til et program.
for å oppnå referansegjennomsiktighet må en funksjon være ren. Dette har fordeler når det gjelder lesbarhet og hastighet. Kompilatorer er ofte i stand til å optimalisere kode som viser referansegjennomsiktighet.
Caching
som rene funksjoner returnerer alltid samme utgang for samme inngang, kan vi cache resultatene av rene funksjonssamtaler.
Caching refererer til å bruke en teknikk, for eksempel memoisering, for å lagre resultatene av funksjoner slik at vi bare trenger å beregne dem en gang.
Typisk, for en funksjon f: Input -> Output
dette oppnås gjennom et kart (for eksempel en hash-kart) fra Input -> Output
.
når du utfører en funksjon, sjekker vi først om kartet inneholder inngangen som en nøkkel. Hvis det gjør det, returnerer vi kartets utgangsverdi, ellers beregner vi f(input)
, og lagrer deretter utgangen i kartet før du returnerer den.