Práce s čistými funkcemi může být mnohem méně stresující, protože je můžete snadno testovat a uvažovat o nich s větší jistotou.

Čisté funkce jsou funkce, které nevyvolávají vedlejší efekty a při volání se stejnými vstupními parametry vždy vrátí stejný výstup.

Můžete použít čisté funkce, abyste zajistili, že váš kód bude čistý, udržovatelný a testovatelný. Tyto funkce jsou pro tyto úlohy ideální, protože jsou předvídatelné a nemění vnější stavy.

Jsou také snadněji laditelné, což je činí užitečnými při vývoji složitých softwarových systémů. Zde prozkoumáte čisté funkce v JavaScriptu, jejich vlastnosti a výhody.

Charakteristika čisté funkce

Pro funkci aby byl „čistý“, musí splňovat několik požadavků.

Konstantní návratová hodnota

Čistá funkce by měla vždy vrátit stejnou hodnotu se stejným vstupem, bez ohledu na to, kolikrát byla volána.

Zvažte například funkci níže:

funkcenásobit(a, b) {
vrátit se a*b;
}

The násobit funkce ve výše uvedeném příkladu vždy vrátí součin svých dvou argumentů. Při stejné sadě argumentů má konstantní návratovou hodnotu.

Volání této funkce několikrát se stejnými argumenty vždy poskytne stejný výstup. Například:

násobit(2, 3); // vrátí 6
násobit(2, 3); // vrátí 6
násobit(2, 3); // vrátí 6

Případně zvažte následující příklad:

funkcemultiplyRandomNumber(č) {
vrátit se číslo * Matematika.podlaha(Matematika.random() * 10);
}

multiplyRandomNumber(5); // Nepředvídatelné výsledky
multiplyRandomNumber(5); // Nepředvídatelné výsledky
multiplyRandomNumber(5); // Nepředvídatelné výsledky

The multiplyRandomNumber výše uvedená funkce vrátí jiné výsledky pokaždé, když ji zavoláte, takže bude nečistá. Výsledky této funkce jsou nepředvídatelné, takže testování komponent, které na ni spoléhají, je obtížné.

Žádné vedlejší účinky

Čistá funkce nesmí mít žádné vedlejší účinky. Vedlejším efektem se rozumí jakákoli úprava stavu nebo chování mimo rozsah funkce, jako je úprava globálních proměnných, výstup konzoly, síťové požadavky nebo manipulace s DOM.

Když má čistá funkce vedlejší účinek, není již čistá, protože ovlivňuje vnější stav a porušuje zásadu, že nemá žádné pozorovatelné vedlejší účinky. Čisté funkce se proto vyhýbají vedlejším účinkům, aby bylo zajištěno, že nemění stav programu.

Zvažte například níže uvedený příklad:

nechat počítat = 0;

funkcepřírůstek() {
počet++;
řídicí panel.log (počet);
}

přírůstek(); // Protokoly 1
přírůstek(); // Protokoly 2
přírůstek(); // Protokoly 3

The přírůstek funkce v tomto příkladu má vedlejší účinek úpravy počet proměnná mimo její rozsah. Také se přihlásí do konzole.

Tato funkce není čistá, protože má vedlejší účinek, který může ztížit předpovědi jejího výstupu a testování v izolaci. Aby to bylo čisté, můžete jej upravit tak, aby přijalo počet proměnnou jako argument a vrátí zvýšenou hodnotu bez úpravy jakéhokoli externího stavu.

Jako tak:

funkcepřírůstek(počet) {
vrátit se počítat + 1;
}

přírůstek(1); // vrátí 2
přírůstek(1); // vrátí 2
přírůstek(1); // vrátí 2

Verze přírůstek funkce ve výše uvedeném příkladu nemá žádné vedlejší účinky, protože nemění žádnou externí proměnnou ani nezaznamenává žádnou hodnotu. Navíc, bez ohledu na to, kolikrát to zavoláte, vrátí stejnou hodnotu pro stejný vstup. Proto je to čistá funkce.

Další vlastnosti

Kromě toho, že máte konstantní návratovou hodnotu a nevyvoláváte žádné vedlejší účinky, měli byste, když jste, dodržovat následující pravidla vytvoření funkce JavaScript že chceš být čistý:

  • Vaše funkce nesmí měnit žádný ze svých argumentů. Místo toho, pokud nějaká operace vyžaduje mutaci, vytvořte kopii argumentu a zmutujte kopii.
  • Vaše funkce musí mít vždy návratovou hodnotu. Pokud vaše funkce nemá návratovou hodnotu ani žádné vedlejší účinky, nemůže nic dělat!
  • Vaše funkce nesmí záviset na žádném vnějším stavu.

Výhody čistých funkcí

Čisté funkce mají určité výhody oproti nečistým funkcím, z nichž některé zahrnují následující.

Testovatelnost

Čisté funkce lze snadno testovat, protože jejich vstupní/výstupní chování je dobře definované. Čisté funkce také nezávisí na vnějším stavu nebo vedlejších účincích. Proto je můžete testovat izolovaně, aniž byste se museli obávat jakýchkoli závislostí nebo interakcí s jinými částmi programu.

Naproti tomu testování nečistých funkcí, které závisí na vnějším stavu nebo mají vedlejší účinky, může být náročnější, protože jejich chování může záviset na stavu programu nebo jiných vnějších faktorech. To může ztížit vytváření komplexních testovacích případů a zajistit, aby se funkce chovala správně ve všech scénářích.

Pamatování

Protože čisté funkce vždy produkují stejný výstup pro stejný vstup a nevytvářejí žádné vedlejší efekty, můžete si je snadno zapamatovat.

Spoléháním se na tyto vlastnosti a používáním memoizace můžete ukládat do mezipaměti výsledek čistého volání funkce pro konkrétní vstup. Vaše funkce pak může vrátit výsledek uložený v mezipaměti při příštím volání se stejným vstupem.

Memorování čistých funkcí může zlepšit výkon programu, zejména u drahých výpočtů, které opakovaně pracují se stejným vstupem, aniž by se museli obávat interference se stavem programu.

Naproti tomu nečisté funkce mohou pro stejný vstup produkovat různé výsledky v závislosti na stavu programu nebo vnějších faktorech. Díky tomu je obtížné je zapamatovat, protože výsledek uložený v mezipaměti již nemusí být platný, pokud se mezi voláními změní závislosti funkce nebo vnější stav.

Konkurence

Protože čisté funkce nemění žádný vnější stav ani nevyvolávají žádné vedlejší účinky, jsou bezpečné pro vlákna. Můžete je provozovat souběžně, aniž byste se museli starat o závodní podmínky nebo problémy se synchronizací.

Naproti tomu nečisté funkce mohou být náročné na souběžné provádění, protože se mohou vzájemně rušit nebo způsobit neočekávané chování, když jsou prováděny paralelně. Pokud například dvě vlákna přistupují ke stejné globální proměnné a upravují ji, mohou si vzájemně přepsat změny nebo způsobit nekonzistentní výsledky.

Čisté funkce vs. Nečisté funkce

Programy můžete psát pomocí kombinace čistých a nečistých funkcí, protože každý typ má své využití.

Čisté funkce lze snadno optimalizovat, testovat a paralelizovat, takže jsou vhodné pro případy použití, jako je funkční programování, ukládání do mezipaměti, testování, paralelní programování a úlohy zpracování dat.

Nečisté funkce však představují problémy při testování a souběžnosti, ale jsou užitečné při práci s proměnlivými datovými strukturami nebo při interakci s externími systémy a zdroji.