Lucrul cu funcții pure poate fi mult mai puțin stresant, deoarece le poți testa cu ușurință și le poți argumenta cu mai multă încredere.

Funcțiile pure sunt funcții care nu produc efecte secundare și, atunci când sunt apelate cu aceiași parametri de intrare, vor returna întotdeauna aceeași ieșire.

Puteți folosi funcții pure pentru a vă asigura că codul este curat, întreținut și testabil. Aceste funcții sunt ideale pentru aceste sarcini, deoarece sunt previzibile și nu modifică stările externe.

De asemenea, sunt mai ușor de depanat, făcându-le utile în dezvoltarea sistemelor software complexe. Aici veți explora funcțiile pure în JavaScript, caracteristicile și avantajele lor.

Caracteristicile unei funcții pure

Pentru o functie pentru a fi „pur”, trebuie să satisfacă câteva cerințe.

Valoare de returnare constantă

O funcție pură ar trebui să returneze întotdeauna aceeași valoare având aceeași intrare, indiferent de numărul de apeluri.

De exemplu, luați în considerare funcția de mai jos:

funcţiemultiplica(a, b) {
întoarcere a * b;
}

The multiplica funcția din exemplul de mai sus va returna întotdeauna produsul celor două argumente ale sale. Având în vedere același set de argumente, are o valoare returnată constantă.

Apelarea acestei funcții de mai multe ori cu aceleași argumente va produce aceeași ieșire de fiecare dată. De exemplu:

multiplica(2, 3); // returnează 6
multiplica(2, 3); // returnează 6
multiplica(2, 3); // returnează 6

Alternativ, luați în considerare exemplul de mai jos:

funcţiemultiplicaRandomNumber(num) {
întoarcere num * Matematică.podea(Matematică.Aleatoriu() * 10);
}

multiplicaRandomNumber(5); // Rezultate imprevizibile
multiplicaRandomNumber(5); // Rezultate imprevizibile
multiplicaRandomNumber(5); // Rezultate imprevizibile

The multiplicaRandomNumber funcția de mai sus va returna rezultate diferite de fiecare dată când o apelați, făcând-o impură. Rezultatele acestei funcții sunt imprevizibile, astfel încât testarea componentelor care se bazează pe ea este dificilă.

Fără efecte secundare

O funcție pură nu trebuie să producă efecte secundare. Un efect secundar se referă la orice modificare a stării sau a comportamentului în afara domeniului de aplicare al funcției, cum ar fi modificarea variabilelor globale, ieșirea consolei, solicitările de rețea sau manipularea DOM.

Când o funcție pură are un efect secundar, nu mai este pură deoarece afectează starea externă și încalcă principiul de a nu avea efecte secundare observabile. Prin urmare, funcțiile pure evită efectele secundare pentru a se asigura că nu modifică starea programului.

De exemplu, luați în considerare exemplul de mai jos:

lăsa numără = 0;

funcţiecreştere() {
numără++;
consolă.log (număr);
}

creştere(); // Jurnalele 1
creştere(); // Jurnalele 2
creştere(); // Jurnalele 3

The creştere funcția din acest exemplu are ca efect secundar modificarea numara variabilă în afara domeniului său de aplicare. De asemenea, se conectează la consolă.

Această funcție nu este pură, deoarece are un efect secundar, care poate face mai dificilă prezicerea și testarea izolată. Pentru a-l face pur, îl puteți modifica pentru a prelua numara variabilă ca argument și returnează valoarea incrementată fără a modifica nicio stare externă.

Ca astfel:

funcţiecreştere(numara) {
întoarcere numără + 1;
}

creştere(1); // returnează 2
creştere(1); // returnează 2
creştere(1); // returnează 2

Versiunea lui creştere funcția din exemplul de mai sus nu are efecte secundare, deoarece nu modifică nicio variabilă externă și nici nu înregistrează nicio valoare. În plus, indiferent de câte ori îl apelați, returnează aceeași valoare pentru aceeași intrare. Prin urmare, este o funcție pură.

Alte caracteristici

Pe lângă faptul că aveți o valoare de returnare constantă și nu produce niciun efect secundar, ar trebui să respectați următoarele reguli atunci când sunteți crearea unei funcții JavaScript ca vrei sa fii pur:

  • Funcția dumneavoastră nu trebuie să modifice niciunul dintre argumentele sale. În schimb, dacă orice operație necesită mutație, faceți o copie a argumentului și modificați copia.
  • Funcția dvs. trebuie să aibă întotdeauna o valoare returnată. Dacă funcția dvs. nu are o valoare de returnare sau niciun efect secundar, nu poate face nimic!
  • Funcția dumneavoastră nu trebuie să depindă de nicio stare externă.

Avantajele Pure Functions

Funcțiile pure au anumite beneficii față de funcțiile impure, dintre care unele includ următoarele.

Testabilitate

Funcțiile pure sunt ușor de testat, deoarece comportamentul lor de intrare/ieșire este bine definit. De asemenea, funcțiile pure nu depind de starea externă sau de efectele secundare. Prin urmare, le puteți testa izolat, fără a vă face griji cu privire la dependențe sau interacțiuni cu alte părți ale programului.

În schimb, testarea funcțiilor impure care depind de starea externă sau produc efecte secundare poate fi mai dificilă, deoarece comportamentul lor poate depinde de starea programului sau de alți factori externi. Acest lucru poate face mai dificilă crearea de cazuri de testare cuprinzătoare și să se asigure că funcția se comportă corect în toate scenariile.

Memorarea

Deoarece funcțiile pure produc întotdeauna aceeași ieșire pentru aceeași intrare și nu produc efecte secundare, le puteți memoriza cu ușurință.

Bazându-vă pe aceste proprietăți și folosind memorarea, puteți stoca în cache rezultatul unui apel pur de funcție pentru o anumită intrare. Funcția dvs. poate returna rezultatul stocat în cache data viitoare când este apelată cu aceeași intrare.

Memorarea funcțiilor pure poate îmbunătăți performanța unui program, în special pentru calculele costisitoare care se ocupă în mod repetat de aceeași intrare, fără a vă face griji cu privire la interferența cu starea programului.

În schimb, funcțiile impure pot produce rezultate diferite pentru aceeași intrare, în funcție de starea programului sau de factori externi. Acest lucru le face dificil de memorat, deoarece rezultatul stocat în cache ar putea să nu mai fie valid dacă dependențele funcției sau starea externă se schimbă între apeluri.

Concurență

Deoarece funcțiile pure nu modifică nicio stare externă și nu produc efecte secundare, ele sunt sigure pentru fire. Le puteți rula simultan fără să vă faceți griji cu privire la condițiile de cursă sau problemele de sincronizare.

În schimb, funcțiile impure pot fi dificil de executat concomitent, deoarece pot interfera între ele sau pot produce un comportament neașteptat atunci când sunt executate în paralel. De exemplu, dacă două fire accesează și modifică aceeași variabilă globală, ele se pot suprascrie reciproc sau pot produce rezultate inconsecvente.

Funcții pure vs. Funcții impure

Puteți scrie programe folosind o combinație de funcții pure și impure, deoarece fiecare tip are utilizările sale.

Funcțiile Pure sunt ușor de optimizat, testat și paralelizat, făcându-le potrivite pentru cazuri de utilizare precum programarea funcțională, memorarea în cache, testarea, programarea paralelă și sarcinile de procesare a datelor.

Cu toate acestea, funcțiile impure reprezintă provocări în testare și concurență, dar sunt utile atunci când se lucrează cu structuri de date mutabile sau se interacționează cu sisteme și resurse externe.