Nástroje Javascript v akci
Objevte některé nástroje pro načítání JavaScript, které vám pomohou zlepšit vaši programovací hru. Zjistěte více o ESLint, Prettier a Husky!
Přečtěte si náš článek a objevte sílu funkcionálního programování v JavaScript. Funkcionální programování je klasifikováno jako deklarativní paradigma, kde je popis programu oddělen od výpočtů.
"Zjednodušeně řečeno, funkcionální programování je vývoj softwaru styl, který klade hlavní důraz na používání funkcí."
Ukázky z knihy: Luis Atencio "Funkcionální programování v JavaScript. Jak zlepšit svůj JavaScript programy využívající funkční techniky"
Funkční programování je klasifikován jako deklarativní paradigma, kde je popis programu oddělen od výpočtů. Důraz je zde kladen na použití výrazů pro popis logiky programu. Je to opak imperativ programování, kde kód je prováděn krok za krokem a podrobně říká počítači, jak má práci provést.
Uvažujme případ, kdy máme pole celých čísel a potřebujeme každé z nich zvýšit na druhou mocninu a poté vybrat pouze ty hodnoty, které nejsou sudé.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const results = []
for(let i = 0; i < numbers.length; i++) {
const secondPower = Math.pow(čísla[i], 2)
if(secondPower & 1) { // nebo % 2, ale operace s bity jsou rychlejší
results.push(secondPower);
}
}
console.log(results) // [1, 9, 25, 49, 81]
Pokud jde o imperativ řešení je jasně patrné zaměření na implementační detaily. Ve smyčce je vidět index pole založený na potřebě kontrolovat počet prvků. Vzhledem k velkému množství detailů v kódu je obtížnější zaměřit se na to, co dělá. Nechť nás se nyní zaměřte na deklarativní řešení.
const risesToSecondPower = (num) => Math.pow(num, 2)
const isOdd = (num) => num & 1;
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const results = numbers
.map(risesToSecondPower)
.filter(isOdd);
console.log(results) // [1, 9, 25, 49, 81]
V tomto řešení byla implementace oddělena od volání tím, že logika byla přenesena do samostatných funkcí. Díky tomuto řešení se můžeme zaměřit pouze na názvy funkcí, které popisují, co se v nich děje. Navíc se zvýšila úroveň abstrakce a logika nyní může být opakovaně použitelná. Nyní se zaměřme na volání. Nevidíte v něm žádné podrobnosti, pouze popis, který vám krok za krokem řekne, co tento kód dělá:
map(risesToSecondPower) - vezme každý prvek pole a zvýší jej na druhou mocninu,filter(isOdd) - filtru a vyberte liché prvky.Funkční programování má mnoho výhod. Pokud jde o JavaScript, je použití funkcí přirozené, protože se jedná o funkcionální jazyk. Dokonce i třídy v tomto jazyce jsou "syntaktickým cukrem" a jsou pod ním složeny z funkcí.
Pokud jde o čitelnost, v imperativním přístupu se kód obvykle stává seznamem s názvy funkcí, které lze číst postupně, aniž by bylo nutné pronikat do jejich logiky. V důsledku toho se nesoustředíme na implementační detaily.
Další výhodou je dodržení konvence neměnných objektů. Díky tomuto přístupu se kód stává bezpečnějším, protože reference v kódu JavaScript jsou velmi silné a nežádoucí objekt lze snadno upravit.
Ve funkcionálním programování je kód rozdělen na malé funkce, které lze snadno považovat za opakovaně použitelný abstraktní kód.
Jedním z důležitých aspektů funkcionálního programování jsou čisté funkce. Chcete-li takovou funkci vytvořit, musíte si zapamatovat několik pravidel:
// Funkce Inpure
let counter = 5
...
const multipleCounter = (multiplikátor) => {
counter = counter * multiplikátor
}
multiplyCounter(2) // -> ? výsledek závisí na počáteční hodnotě
// Čistá funkce
const multiplyBy = (multiplikátor) => (hodnota) => hodnota * multiplikátor
const multipleByTwo = multiplyBy(2)
const counter = multiplyByTwo(5) // -> 10
První funkce je nepředvídatelná, protože závisí na vnějším parametru, který se může změnit. Druhá funkce je transparentní, závisí pouze na vstupních parametrech, nemění je a nepoužívá proměnné mimo rozsah. Je transparentní, protože závisí na parametrech, nemění je, nepoužívá proměnné mimo rozsah a vrací novou hodnotu.
