ce este o funcție pură?
beneficii
există mai multe beneficii pentru utilizarea funcțiilor pure, atât în termeni de performanță, cât și de utilizare.
lizibilitatea
funcțiile Pure sunt mult mai ușor de citit și de raționat. Toate intrările și dependențele relevante sunt furnizate ca parametri, deci nu se observă efecte care modifică variabilele în afara setului de intrări.
aceasta înseamnă că putem înțelege rapid o funcție și dependențele sale, doar citind declarația funcției. Deci, dacă o funcție este declarată ca f(a, b, c)
atunci știm că numai a
b
și c
sunt dependențe de f
.
portabilitate
deoarece toate dependențele sunt furnizate ca parametri de intrare și nu sunt accesate printr-un context global, aceste dependențe pot fi schimbate în funcție de contextul în care este apelată funcția.
aceasta înseamnă că aceeași funcție poate acționa pe diferite implementări ale aceleiași resurse, de exemplu.
Acest lucru face ca Codul să fie mult mai portabil și reutilizabil, deoarece aceeași funcție poate fi utilizată în diferite contexte, mai degrabă decât să fie nevoie să scrieți o funcție diferită doar pentru a utiliza o implementare diferită a aceleiași clase.
de exemplu, în loc să fie nevoie să scrieți două funcții impure diferite pentru a utiliza două loggere diferite care sunt stocate la nivel global, o funcție pură ar lua doar loggerul dorit ca intrare.
testarea
lipsa efectelor secundare face ca funcțiile pure să fie foarte ușor de testat, deoarece trebuie doar să testăm că intrările produc ieșirile dorite. Nu este necesar să verificăm validitatea vreunei stări globale a programului în testele noastre de funcții specifice.
în plus, deoarece toate dependențele sunt furnizate ca intrări, putem bate joc cu ușurință de dependențe. Într-un cadru impur, ar trebui să urmărim starea unei dependențe globale pe parcursul tuturor testelor.
cu toate acestea, într-un cadru pur, ne-ar oferi pur și simplu toate dependențele ca intrare. Nu mai trebuie să ne facem griji cu privire la menținerea stării globale pe parcursul testelor noastre și acum putem oferi versiuni diferite ale dependențelor la diferite teste.
Acest lucru ne permite să testăm funcțiile în timp ce avem în mod explicit controlul asupra dependențelor furnizate în fiecare test.
transparență referențială
transparență referențială se referă la posibilitatea de a înlocui apelul unei funcții cu valoarea de ieșire corespunzătoare fără a schimba comportamentul unui program.
pentru a obține transparența referențială, o funcție trebuie să fie pură. Acest lucru are beneficii în ceea ce privește lizibilitatea și viteza. Compilatoarele sunt adesea capabile să optimizeze codul care prezintă transparență referențială.
Caching
deoarece funcțiile pure returnează întotdeauna aceeași ieșire pentru aceeași intrare, putem memora în cache rezultatele apelurilor de funcții pure.Caching-ul se referă la utilizarea unei tehnici, cum ar fi memorizarea, pentru a stoca rezultatele funcțiilor, astfel încât trebuie să le calculăm o singură dată.
de obicei, pentru o funcțief: Input -> Output
aceasta se realizează printr-o hartă (cum ar fi o hartă hash) de laInput -> Output
.
când executăm o funcție, verificăm mai întâi dacă harta conține intrarea ca cheie. Dacă da, returnăm valoarea de ieșire a hărții, în caz contrar, calculăm f(input)
, apoi stocăm ieșirea pe hartă înainte de a o returna.