Jak napsat vlastní funkci kanálu v JS

Javascript je tak dynamický, že si můžeme vybrat mnoho způsobů, jak napsat náš kód. Proč to nedělat funkčním programovacím způsobem?

Co je funkční potrubí?

Pamatujete si na střední škole, v matematické třídě, že jste měli dvě funkce -
f (x) ag (x).
A pak byste mohli vytvořit novou funkci:
h (x) = f (g (x)).

Nová funkce by přijala argument a předala tento argument dva g (x) a poté předala vyhodnocenou hodnotu další funkci = f (g).

Takže funkční potrubí je stejná základní myšlenka, vytvoříte novou funkci, která „projde“ několika menšími funkcemi.

Psaní čistě

Ve funkčním světě píšeme čistě funkce.

Funkce se považuje za čistou, pokud:
1. Získává všechny parametry, které potřebuje (nepoužívá žádné globální proměnné ani členy třídy)
2. Vždy vraťte stejný výstup pro daný vstup
3. Nemá žádné vedlejší účinky (volání serveru, načítání db, vykreslování DOM atd.)

Čisté funkce mají mnoho výhod:
1. Je to testovatelné! Žádné další nastavení nebo psaní simulované třídy
2. Je to cache - ty funkce jsou deterministické, proč vypočítat stejný vstup více než jednou?
Existuje cool vzor s názvem memoize, prosím, podívejte se na to.

Výhodou, kterou jsme tu, je:
3. Je to schopný komponovat! můžete vložit tolik funkcí, kolik chcete, a vytvořit tak složitější funkci (nebo dokonce celou funkci).

Funkce redukce

Protože vytvoříme funkci kanálu na základě „Array.reduce ()“, krátce to vysvětlím.

redu () převezme prvky v poli, zpracuje je a vrátí jeden prvek. Tímto prvkem může být jakákoli věc, dokonce i funkce, jak uvidíme v další části.

// Funkce Sum, získá pole a vrátí součet
// es5 styl, mabye je to jasnější
funkce sum_es5 (arr) {
   arr.reduce (funkce (acc, Curr) {
      návrat acc + Curr
   }, 0
}
// Stejná funkce zapsaná v es6
const sum = arr =>
  arr.reduce ((acc, Curr) => acc + Curr, 0)
const mul = arr =>
  arr.reduce ((acc, Curr) => acc * Curr, 1)
součet ([1,2,3]) // 6
mul ([2,3,4]) // 24

Pojďme to rozebrat.
Funkce reduktoru má dva argumenty:

První
Funkce, tato funkce sama získá dva argumenty, akumulátor a aktuální hodnotu. První z nich obsahuje agregovanou hodnotu, kterou jsme doposud vypočítali. Druhým je aktuální prvek v našem poli.

Druhý
Počáteční hodnota. Akumulátor bude inicializován touto hodnotou.

Teď je snadné pochopit naši funkci Sum.
Počáteční hodnota je samozřejmě 0 a při každé iteraci vracíme součet dosud agregované hodnoty a aktuální prvek pole.

Vytvořte funkci potrubí

Řešení více než jednoho argumentu

Jak jsme viděli v naší potrubní funkci, zvládáme dobře s více argumenty předanými naší první funkci.

A co funkce s více argumenty, která není první funkcí?
Ve funkčním světě je krásný vzorec zvaný curry, který nám pomáhá tento problém vyřešit. Pokryju to v jiném článku.