Puhaste funktsioonidega töötamine võib olla palju pingevabam, kuna saate neid hõlpsalt testida ja enesekindlamalt arutleda.
Puhtad funktsioonid on funktsioonid, mis ei tekita kõrvalmõjusid ja tagastavad samade sisendparameetritega kutsudes alati sama väljundi.
Saate kasutada puhtaid funktsioone tagamaks, et teie kood on puhas, hooldatav ja testitav. Need funktsioonid on nende ülesannete jaoks ideaalsed, kuna need on etteaimatavad ega muuda väliseid olekuid.
Neid on ka lihtsam siluda, mis teeb neist abi keerukate tarkvarasüsteemide arendamisel. Siin saate uurida puhtaid JavaScripti funktsioone, nende omadusi ja eeliseid.
Puhta funktsiooni omadused
Sest funktsioon et olla "puhas", peab see vastama mõnele nõudele.
Pidev tootlusväärtus
Puhas funktsioon peaks alati tagastama sama väärtuse sama sisendi korral, olenemata sellest, mitu korda seda kutsutakse.
Näiteks kaaluge allolevat funktsiooni:
funktsioonikorrutada(a, b) {
tagasi a * b;
}
The korrutada funktsioon ülaltoodud näites tagastab alati oma kahe argumendi korrutise. Arvestades sama argumentide komplekti, on sellel konstantne tagastusväärtus.
Selle funktsiooni mitu korda samade argumentidega kutsumine annab iga kord sama väljundi. Näiteks:
korrutada (2, 3); // tagastab 6
korrutada (2, 3); // tagastab 6
korrutada (2, 3); // tagastab 6
Teise võimalusena kaaluge allolevat näidet:
funktsioonikorrutaJuhuslik arv(nr) {
tagasi number * matemaatika.floor(matemaatika.random() * 10);
}
multiplyRandomNumber(5); // Ettearvamatud tulemused
multiplyRandomNumber(5); // Ettearvamatud tulemused
multiplyRandomNumber(5); // Ettearvamatud tulemused
The korrutaJuhuslik arv ülaltoodud funktsioon tagastab iga kord, kui seda kutsute, erinevad tulemused, muutes selle ebapuhtaks. Selle funktsiooni tulemused on ettearvamatud, seega on sellele tuginevate komponentide testimine keeruline.
Puuduvad kõrvaltoimed
Puhas funktsioon ei tohi põhjustada kõrvalmõjusid. Kõrvalmõju viitab mis tahes oleku või käitumise muutmisele väljaspool funktsiooni ulatust, nagu globaalsete muutujate, konsooli väljundi, võrgupäringute või DOM-i manipuleerimine.
Kui puhtal funktsioonil on kõrvalmõju, ei ole see enam puhas, sest see mõjutab välist seisundit ja rikub põhimõtet, et sellel ei ole jälgitavaid kõrvalmõjusid. Seetõttu väldivad puhtad funktsioonid kõrvalmõjusid tagamaks, et need ei muuda programmi olekut.
Näiteks vaadake allolevat näidet:
lase arv = 0;
funktsioonijuurdekasv() {
count++;
konsool.log (loend);
}
increment(); // Logid 1
increment(); // Logid 2
increment(); // Logid 3
The juurdekasv Selle näite funktsioonil on kõrvalmõju, mis muudab funktsiooni loendama muutuja väljaspool selle ulatust. See logib ka konsooli.
See funktsioon ei ole puhas, kuna sellel on kõrvalmõju, mis võib raskendada selle väljundi ennustamist ja eraldi katsetamist. Selle puhtaks muutmiseks saate seda muuta, et see sisaldaks loendama muutuja argumendina ja tagastab suurendatud väärtuse ilma välist olekut muutmata.
Nagu nii:
funktsioonijuurdekasv(loendama) {
tagasi loe + 1;
}
inkrement (1); // tagastab 2
inkrement (1); // tagastab 2
inkrement (1); // tagastab 2
versioon juurdekasv funktsioonil ülaltoodud näites pole kõrvalmõjusid, kuna see ei muuda ühtegi välist muutujat ega logi ühtegi väärtust. Lisaks tagastab see sama sisendi jaoks sama väärtuse, olenemata sellest, mitu korda seda helistate. Seetõttu on see puhas funktsioon.
Muud omadused
Lisaks püsivale tagastamisväärtusele ja kõrvalmõjude puudumisele peaksite järgima järgmisi reegleid, kui olete JavaScripti funktsiooni loomine et sa tahad olla puhas:
- Teie funktsioon ei tohi muuta ühtegi selle argumenti. Selle asemel, kui mõni toiming nõuab mutatsiooni, tehke argumendist koopia ja muteerige koopia.
- Teie funktsioonil peab alati olema tagastusväärtus. Kui teie funktsioonil pole tagastusväärtust ega kõrvalmõjusid, ei saa see midagi teha!
- Teie funktsioon ei tohi sõltuda välisest olekust.
Puhaste funktsioonide eelised
Puhtal funktsioonidel on teatud eelised ebapuhaste funktsioonide ees, millest mõned hõlmavad järgmist.
Testitavus
Puhtaid funktsioone on lihtne testida, kuna nende sisend/väljund käitumine on täpselt määratletud. Samuti ei sõltu puhtad funktsioonid välisest olekust ega kõrvalmõjudest. Seetõttu saate neid katsetada eraldi, muretsemata sõltuvuste või koostoimete pärast programmi teiste osadega.
Seevastu välisest olekust või kõrvalmõjusid tekitavate ebapuhaste funktsioonide testimine võib olla keerulisem, kuna nende käitumine võib sõltuda programmi olekust või muudest välisteguritest. See võib raskendada terviklike testjuhtumite loomist ja tagada, et funktsioon toimib kõigis stsenaariumides õigesti.
Memoiseerimine
Kuna puhtad funktsioonid annavad sama sisendi jaoks alati sama väljundi ega tekita kõrvalmõjusid, saate need hõlpsalt meelde jätta.
Nendele omadustele tuginedes ja memoiseerimist kasutades saate vahemällu salvestada konkreetse sisendi jaoks puhta funktsioonikutse tulemuse. Teie funktsioon võib seejärel tagastada vahemällu salvestatud tulemuse järgmisel korral, kui seda sama sisendiga kutsutakse.
Puhaste funktsioonide meeldejätmine võib parandada programmi jõudlust, eriti kallite arvutuste puhul, mis tegelevad korduvalt sama sisendiga, muretsemata programmi oleku häirimise pärast.
Seevastu ebapuhtad funktsioonid võivad anda sama sisendi jaoks erinevaid tulemusi, olenevalt programmi olekust või välistest teguritest. See muudab nende meeldejätmise keeruliseks, kuna vahemällu salvestatud tulemus ei pruugi enam kehtida, kui funktsiooni sõltuvused või väline olek kõnede vahel muutuvad.
Samaaegsus
Kuna puhtad funktsioonid ei muuda välist olekut ega tekita kõrvalmõjusid, on need niidikindlad. Saate neid samaaegselt käivitada, muretsemata võistlustingimuste või sünkroonimisprobleemide pärast.
Seevastu ebapuhaste funktsioonide samaaegne täitmine võib olla keeruline, kuna need võivad üksteist segada või paralleelsel täitmisel tekitada ootamatut käitumist. Näiteks kui kaks lõime pääsevad juurde ja muudavad sama globaalset muutujat, võivad nad üksteise muudatused üle kirjutada või anda ebajärjekindlaid tulemusi.
Puhtad funktsioonid vs. Ebapuhtad funktsioonid
Saate kirjutada programme, kasutades puhaste ja ebapuhaste funktsioonide kombinatsiooni, kuna igal tüübil on oma kasutusala.
Puhtaid funktsioone on lihtne optimeerida, testida ja paralleelselt muuta, mistõttu need sobivad sellisteks kasutusjuhtudeks nagu funktsionaalne programmeerimine, vahemällu salvestamine, testimine, paralleelprogrammeerimine ja andmetöötlusülesanded.
Ebapuhtad funktsioonid kujutavad endast siiski väljakutseid testimisel ja samaaegsusel, kuid on abiks muudetavate andmestruktuuridega töötamisel või väliste süsteemide ja ressurssidega suhtlemisel.