Delo s čistimi funkcijami je lahko veliko manj stresno, saj jih lahko preprosto preizkusite in o njih razmišljate z večjo samozavestjo.

Čiste funkcije so funkcije, ki ne povzročajo stranskih učinkov in bodo ob klicu z enakimi vhodnimi parametri vedno vrnile enak izhod.

Uporabite lahko čiste funkcije, da zagotovite, da je vaša koda čista, vzdržljiva in jo je mogoče preizkusiti. Te funkcije so idealne za te naloge, ker so predvidljive in ne spreminjajo zunanjih stanj.

Prav tako jih je lažje odpraviti, zaradi česar so v pomoč pri razvoju kompleksnih programskih sistemov. Tukaj boste raziskali čiste funkcije v JavaScriptu, njihove značilnosti in prednosti.

Značilnosti čiste funkcije

Za funkcijo da bi bil »čist«, mora izpolnjevati nekaj zahtev.

Konstantna povratna vrednost

Čista funkcija mora vedno vrniti isto vrednost glede na isti vnos, ne glede na to, kolikokrat je bila poklicana.

Na primer, upoštevajte spodnjo funkcijo:

funkcijopomnožiti(a, b) {
vrnitev a * b;
}

The pomnožiti funkcija v zgornjem primeru bo vedno vrnila zmnožek svojih dveh argumentov. Glede na isti nabor argumentov ima konstantno vrnjeno vrednost.

Večkratni klic te funkcije z istimi argumenti bo vsakič prinesel enak rezultat. Na primer:

pomnoži (2, 3); // vrne 6
pomnoži (2, 3); // vrne 6
pomnoži (2, 3); // vrne 6

Druga možnost je, da razmislite o spodnjem primeru:

funkcijomultiplyRandomNumber(št) {
vrnitev št * matematika.nadstropje(matematika.naključen() * 10);
}

multiplyRandomNumber(5); // Nepredvidljivi rezultati
multiplyRandomNumber(5); // Nepredvidljivi rezultati
multiplyRandomNumber(5); // Nepredvidljivi rezultati

The multiplyRandomNumber zgornja funkcija bo vrnila različne rezultate vsakič, ko jo pokličete, zaradi česar je nečista. Rezultati te funkcije so nepredvidljivi, zato je testiranje komponent, ki so odvisne od nje, težko.

Brez stranskih učinkov

Čista funkcija ne sme povzročiti stranskih učinkov. Stranski učinek se nanaša na kakršno koli spremembo stanja ali obnašanja zunaj obsega funkcije, kot je spreminjanje globalnih spremenljivk, izhoda konzole, omrežnih zahtev ali manipulacije DOM.

Ko ima čista funkcija stranski učinek, ni več čista, ker vpliva na zunanje stanje in krši načelo, da ni opaznih stranskih učinkov. Zato se čiste funkcije izogibajo stranskim učinkom in tako zagotovijo, da ne spremenijo stanja programa.

Na primer, upoštevajte spodnji primer:

pustiti štetje = 0;

funkcijoprirastek() {
štetje++;
konzola.log (štetje);
}

povečaj(); // Dnevniki 1
povečaj(); // Dnevniki 2
povečaj(); // Dnevniki 3

The prirastek funkcija v tem primeru ima stranski učinek spreminjanja štetje spremenljivka zunaj svojega obsega. Prav tako se prijavi v konzolo.

Ta funkcija ni čista, ker ima stranski učinek, ki lahko oteži napovedovanje njenega rezultata in testiranje v izolaciji. Da bi bil čist, ga lahko spremenite tako, da sprejme štetje spremenljivko kot argument in vrne povečano vrednost brez spreminjanja zunanjega stanja.

takole:

funkcijoprirastek(štetje) {
vrnitev štej + 1;
}

prirast(1); // vrne 2
prirast(1); // vrne 2
prirast(1); // vrne 2

Različica prirastek funkcija v zgornjem primeru nima stranskih učinkov, saj ne spreminja nobene zunanje spremenljivke ali beleži nobene vrednosti. Poleg tega ne glede na to, kolikokrat ga pokličete, vrne isto vrednost za isti vnos. Zato je to čista funkcija.

Druge značilnosti

Poleg tega, da imate konstantno povratno vrednost in ne povzročate stranskih učinkov, se morate držati naslednjih pravil, ko ustvarjanje funkcije JavaScript da želiš biti čist:

  • Vaša funkcija ne sme spreminjati nobenega od svojih argumentov. Namesto tega, če katera koli operacija zahteva mutacijo, naredite kopijo argumenta in mutirajte kopijo.
  • Vaša funkcija mora vedno imeti vrnjeno vrednost. Če vaša funkcija nima povratne vrednosti ali stranskih učinkov, ne more storiti ničesar!
  • Vaša funkcija ne sme biti odvisna od zunanjega stanja.

Prednosti čistih funkcij

Čiste funkcije imajo določene prednosti pred nečistimi funkcijami, med katerimi so nekatere naslednje.

Preizkušljivost

Čiste funkcije je enostavno preizkusiti, saj je njihovo vhodno/izhodno obnašanje dobro definirano. Prav tako čiste funkcije niso odvisne od zunanjega stanja ali stranskih učinkov. Zato jih lahko testirate ločeno, ne da bi vas skrbelo kakršna koli odvisnost ali interakcija z drugimi deli programa.

Nasprotno pa je preizkušanje nečistih funkcij, ki so odvisne od zunanjega stanja ali povzročajo stranske učinke, lahko bolj zahtevno, ker je njihovo vedenje lahko odvisno od stanja programa ali drugih zunanjih dejavnikov. To lahko oteži ustvarjanje celovitih testnih primerov in zagotavljanje, da se funkcija pravilno obnaša v vseh scenarijih.

Memoizacija

Ker čiste funkcije vedno proizvedejo enak izhod za isti vhod in ne povzročijo stranskih učinkov, jih lahko preprosto zapomnite.

Z zanašanjem na te lastnosti in uporabo memoizacije lahko predpomnite rezultat klica čiste funkcije za določen vnos. Vaša funkcija lahko nato ob naslednjem klicu z istim vnosom vrne predpomnjeni rezultat.

Zapomnitev čistih funkcij lahko izboljša delovanje programa, zlasti pri dragih izračunih, ki se večkrat ukvarjajo z istim vhodom, ne da bi pri tem skrbeli za motnje v stanju programa.

Nasprotno pa lahko nečiste funkcije proizvedejo različne rezultate za isti vnos, odvisno od stanja programa ali zunanjih dejavnikov. Zaradi tega jih je težko zapomniti, ker predpomnjeni rezultat morda ne bo več veljaven, če se odvisnosti funkcije ali zunanje stanje spremenijo med klici.

Sočasnost

Ker čiste funkcije ne spremenijo nobenega zunanjega stanja ali povzročijo stranskih učinkov, so varne za niti. Zaženete jih lahko sočasno, ne da bi vas skrbeli pogoji tekmovanja ali težave s sinhronizacijo.

Nasprotno pa je nečiste funkcije lahko izziv za sočasno izvajanje, ker lahko motijo ​​druga drugo ali povzročijo nepričakovano vedenje, ko se izvajajo vzporedno. Na primer, če dve niti dostopata do iste globalne spremenljivke in jo spreminjata, lahko prepišeta spremembe druga druge ali ustvarita nedosledne rezultate.

Čiste funkcije vs. Nečiste funkcije

Programe lahko pišete s kombinacijo čistih in nečistih funkcij, saj ima vsaka vrsta svojo uporabo.

Čiste funkcije je enostavno optimizirati, preizkusiti in vzporediti, zaradi česar so primerne za primere uporabe, kot so funkcijsko programiranje, predpomnjenje, testiranje, vzporedno programiranje in opravila obdelave podatkov.

Vendar nečiste funkcije predstavljajo izziv pri testiranju in sočasnosti, vendar so koristne pri delu s spremenljivimi podatkovnimi strukturami ali interakciji z zunanjimi sistemi in viri.