Rad s čistim funkcijama može biti mnogo manje stresan, jer ih možete jednostavno testirati i razmišljati o njima s više povjerenja.
Čiste funkcije su funkcije koje ne proizvode nuspojave i, kada se pozovu s istim ulaznim parametrima, uvijek će vratiti isti izlaz.
Možete koristiti čiste funkcije kako biste osigurali da je vaš kod čist, održavan i testiran. Ove su funkcije idealne za te zadatke jer su predvidljive i ne mijenjaju vanjska stanja.
Također ih je lakše ispraviti, što ih čini korisnima u razvoju složenih softverskih sustava. Ovdje ćete istražiti čiste funkcije u JavaScriptu, njihove karakteristike i prednosti.
Karakteristike čiste funkcije
Za funkcija da bi bio "čist", mora zadovoljiti nekoliko zahtjeva.
Konstantna povratna vrijednost
Čista funkcija uvijek treba vraćati istu vrijednost s istim unosom, bez obzira na to koliko je puta pozvana.
Na primjer, razmotrite funkciju u nastavku:
funkcijapomnožiti(a, b) {
povratak a * b;
}
The pomnožiti funkcija u gornjem primjeru uvijek će vratiti umnožak svoja dva argumenta. S obzirom na isti skup argumenata, ima konstantnu povratnu vrijednost.
Pozivanje ove funkcije nekoliko puta s istim argumentima dat će isti izlaz svaki put. Na primjer:
pomnožiti(2, 3); // vraća 6
pomnožiti(2, 3); // vraća 6
pomnožiti(2, 3); // vraća 6
Alternativno, razmotrite primjer u nastavku:
funkcijapomnožiSlučajniBroj(br) {
povratak broj * matematika.kat(matematika.random() * 10);
}
pomnožiSlučajniBroj(5); // Nepredvidivi rezultati
pomnožiSlučajniBroj(5); // Nepredvidivi rezultati
pomnožiSlučajniBroj(5); // Nepredvidivi rezultati
The pomnožiSlučajniBroj gornja funkcija vratit će različite rezultate svaki put kada je pozovete, čineći je nečistom. Rezultati ove funkcije su nepredvidivi, pa je testiranje komponenti koje se oslanjaju na nju teško.
Nema nuspojava
Čista funkcija ne smije proizvoditi nikakve nuspojave. Nuspojava se odnosi na bilo koju promjenu stanja ili ponašanja izvan opsega funkcije, kao što je izmjena globalnih varijabli, izlaza konzole, mrežnih zahtjeva ili manipulacije DOM-om.
Kada čista funkcija ima nuspojavu, ona više nije čista jer utječe na vanjsko stanje i krši načelo da nema vidljivih nuspojava. Stoga čiste funkcije izbjegavaju nuspojave kako bi se osiguralo da ne mijenjaju stanje programa.
Na primjer, razmotrite primjer u nastavku:
neka brojati = 0;
funkcijaprirast() {
brojati++;
konzola.log (brojiti);
}
povećanje(); // Dnevnici 1
povećanje(); // Dnevnici 2
povećanje(); // Dnevnici 3
The prirast funkcija u ovom primjeru ima nuspojavu modificiranja računati varijabla izvan svog opsega. Također se prijavljuje na konzolu.
Ova funkcija nije čista jer ima nuspojavu, što može otežati predviđanje njezinog izlaza i testiranje u izolaciji. Da biste ga učinili čistim, možete ga modificirati da uzme računati varijablu kao argument i vraća povećanu vrijednost bez mijenjanja vanjskog stanja.
ovako:
funkcijaprirast(računati) {
povratak brojati + 1;
}
povećanje (1); // vraća 2
povećanje (1); // vraća 2
povećanje (1); // vraća 2
Verzija od prirast funkcija u gornjem primjeru nema nuspojava jer ne modificira nijednu vanjsku varijablu niti bilježi bilo koju vrijednost. Osim toga, bez obzira koliko puta ga pozovete, vraća istu vrijednost za isti unos. Dakle, to je čista funkcija.
Ostale karakteristike
Osim što imate stalnu povratnu vrijednost i ne izazivate nikakve nuspojave, trebali biste se pridržavati sljedećih pravila kada stvaranje JavaScript funkcije da želiš biti čist:
- Vaša funkcija ne smije mijenjati niti jedan svoj argument. Umjesto toga, ako bilo koja operacija zahtijeva mutaciju, napravite kopiju argumenta i mutirajte kopiju.
- Vaša funkcija uvijek mora imati povratnu vrijednost. Ako vaša funkcija nema povratnu vrijednost ili bilo kakve nuspojave, ne može učiniti ništa!
- Vaša funkcija ne smije ovisiti ni o kakvom vanjskom stanju.
Prednosti čistih funkcija
Čiste funkcije imaju određene prednosti u odnosu na nečiste funkcije, a neke od njih uključuju sljedeće.
Ispitljivost
Čiste funkcije lako je testirati jer je njihovo ulazno/izlazno ponašanje dobro definirano. Također, čiste funkcije ne ovise o vanjskom stanju ili nuspojavama. Stoga ih možete testirati zasebno bez brige o bilo kakvim ovisnostima ili interakcijama s drugim dijelovima programa.
Nasuprot tome, testiranje nečistih funkcija koje ovise o vanjskom stanju ili proizvode nuspojave može biti veći izazov jer njihovo ponašanje može ovisiti o stanju programa ili drugim vanjskim čimbenicima. To može otežati stvaranje sveobuhvatnih testnih slučajeva i osigurati da se funkcija ispravno ponaša u svim scenarijima.
Memoizacija
Budući da čiste funkcije uvijek proizvode isti izlaz za isti ulaz i ne proizvode nikakve nuspojave, možete ih jednostavno zapamtiti.
Oslanjajući se na ta svojstva i koristeći memoizaciju, možete predmemorirati rezultat čistog poziva funkcije za određeni unos. Vaša funkcija zatim može vratiti predmemorirani rezultat sljedeći put kada se pozove s istim unosom.
Memoriranje čistih funkcija može poboljšati izvedbu programa, posebno za skupe proračune koji se više puta bave istim unosom, bez brige o smetnjama u stanju programa.
Nasuprot tome, nečiste funkcije mogu dati različite rezultate za isti unos, ovisno o stanju programa ili vanjskim čimbenicima. Zbog toga ih je teško memorirati jer predmemorirani rezultat možda više nije valjan ako se ovisnosti funkcije ili vanjsko stanje promijene između poziva.
Konkurencija
Budući da čiste funkcije ne mijenjaju nikakvo vanjsko stanje niti proizvode bilo kakve nuspojave, sigurne su za niti. Možete ih pokrenuti istovremeno bez brige o uvjetima utrke ili problemima sa sinkronizacijom.
Nasuprot tome, nečiste funkcije mogu biti izazovne za istovremeno izvršavanje jer mogu ometati jedna drugu ili proizvesti neočekivano ponašanje kada se izvode paralelno. Na primjer, ako dvije niti pristupaju i mijenjaju istu globalnu varijablu, mogu prebrisati međusobne promjene ili proizvesti nedosljedne rezultate.
Čiste funkcije vs. Nečiste funkcije
Možete pisati programe koristeći kombinaciju čistih i nečistih funkcija, budući da svaka vrsta ima svoju upotrebu.
Čiste funkcije lako je optimizirati, testirati i paralelizirati, što ih čini prikladnima za slučajeve upotrebe kao što su funkcionalno programiranje, predmemorija, testiranje, paralelno programiranje i zadaci obrade podataka.
Međutim, nečiste funkcije postavljaju izazove u testiranju i konkurentnosti, ali su korisne pri radu s promjenjivim strukturama podataka ili interakciji s vanjskim sustavima i resursima.