A beginner friendly intro to functional programming
Functional programming is a highly valued approach to writing code, and it’s popularity is continuously increasing in Komerční softwarové aplikace. Funkční programování je paradigma psaní kódu, a je výstižně řečeno v úvodu tohoto článku Wikipedie:
“ -styl budovy, struktura a prvky počítačové programy — dárky výpočet jako vyhodnocení matematické funkce a vyhýbá se mění-stát a proměnlivých údajů. Jedná se o deklarativní programovací paradigma, což znamená, že programování se provádí pomocí výrazů nebo deklarací místo prohlášení.“
dostaneme se do toho, co přesně to znamená velmi brzy, ale nejprve, pojďme dostat základy z cesty tím, že poskytneme nějaký kontext. Tento článek slouží doufejme, že zavedení základních pojmů funkcionální programování k vám a do konce, měli bychom mít stanoveny základní pochopení toho, proč jsme se rozhodli aplikovat do našeho kódování styly, jak to souvisí s JavaScript a některé základní vzorce, které můžete začít implementovat do svého kódu. Dávejte pozor na druhý článek, který bude stavět na tomto článku a kopat ještě hlouběji do myšlenek zde diskutovaných.
kořeny funkcionální programování ležet v Lambda kalkulu, což byl systém vyvinut v roce 1930 vyjádřit výpočty pomocí funkce podobné tomu, co budeme vidět velmi brzy. Na nějakou dobu, funkční programovací koncepty a jazyky byly široce diskutovány v akademické obce a vědeckých kontextech a nakonec krvácel do vývoje komerčního softwaru. To, co dělá programovací jazyk funkční, nebo ne, je jeho schopnost usnadnit funkcionální programovací paradigma, jazyků, jako jsou Ruby, Python, Julie a JavaScript, druhý z nich má vlastnosti nezbytné, objektově orientované a funkcionální paradigma.
podívejme se na příklad použití imperativu a pak funkčního přístupu k dokončení jediného úkolu.
imperativ:
const arr = function getOdds(arr){
let odds = ; for(let i = 0; i < arr.length + 1; i++){
if ( i % 2 !== 0 ){
odds.push( i )
};
};
return odds
};console.log(getOdds(arr))
// logs
funkční:
function getOdds2(arr){
return arr.filter(num => num % 2 !== 0)
}console.log(getOdds2(arr))
// logs // this can be even shorter
const getOdds3 = arr => arr.filter(num => num % 2 !== 0)console.log(getOdds3(arr))
// logs
Kromě zjevné zlepšení funkční přístup umožňuje, stejně jako kratší kód, šetří nám pár stisků kláves, a skutečnost, že je mnohem snazší pochopit, na rychlý pohled, to je také elegantní, což má za následek čistší kód, zjednodušuje ladění, testování a údržbu.
pojďme to trochu rozebrat, abychom mohli jasně pochopit rozdíly mezi těmito dvěma přístupy a definovat, co je to funkční programování.
v prvním přístupu nezbytně popisujeme každou událost, která se musí uskutečnit, abychom dosáhli úkolu odfiltrovat lichá čísla z pole. Krmíme funkci pole, uvnitř funkce vytvoříme prázdné pole, které použijeme k uložení lichých čísel. Řekneme mu, aby smyčka přes pole, pak deklarujeme podmíněné, pokud je aktuální index liché číslo, zatlačte jej na prázdné. Smyčka for neobsahuje poslední číslo v poli, obsahuje pouze čísla vedoucí k němu, takže pokud je naše poslední číslo liché, nebude zahrnuto. Proto přidáme +1 při definování množství iterací, které naše smyčka potřebuje.
Ve druhém přístupu, jsme jednoduše definovat výsledek chceme vidět pomocí metody zvané filtr, a nechte přístroj, aby se postarat o všechny kroky v mezi. Jedná se o deklarativnější přístup. Deklarujeme, jaký musí být konečný výsledek, a my zbytek je zpracován za nás.
nyní vidíme, co se výše uvedená definice snaží vyjádřit. Způsob programování, použití deklarací a výrazů, spíše než prohlášení. Tato definice pouze škrábe povrch funkčního programování, a budeme neustále stavět na naší definici, jak naše porozumění roste.
některé rozdíly mezi iteračními a funkcionálními přístupy.
- stylisticky definujeme problém a změny, které bychom chtěli vidět, na rozdíl od jeho vysvětlení krok za krokem.
- nepotřebujeme spravovat stav v našich funkcích, jako je výše, kde jsme spravovali stav našeho prázdného pole.
- nemusíme se tolik starat o pořadí provedení.
- používáme méně smyček, podmínek a používáme více vestavěných metod, opakovaně použitelných funkcí a rekurze.
pomocí tohoto přístupu nakonec napíšeme čistší kód, který, jak je uvedeno výše, nám pomáhá při ladění a údržbě. Udržuje věci modulární a části našeho kódu jsou rozděleny na menší kousky, které můžeme snadno otestovat. Můžeme znovu použít části našeho kódu pomocí pomocných funkcí a nakonec je to efektivnější matematický přístup k psaní kódu.
sloupy: Naše kódovací sada nástrojů pro psaní funkčního kódu
níže uvádíme několik důležitých aspektů psaní vysoce kvalitního funkčního kódu. Když vidíme, že se jedná o přehled, nebudeme se do každého příliš ponořit, místo toho definujeme jen několik klíčových charakteristik a jeden příklad každého z nich.
čisté funkce:
čisté funkce vrátí hodnotu pouze na základě toho, co do ní bylo předáno. Myšlenka je, že to bude čistě funkci, pokud to vždy vrátí stejný výsledek, pokud stejné hodnoty jsou předávány do něj, a to nebude měnit hodnoty mimo ts působnosti, která je nezávislá na stavu v systému. Čistá funkce proto nikdy nemůže mutovat data, nevyvolávat žádné vedlejší účinky a lze ji snadno znovu použít. Příkladem čisté funkce bude Funkce, která provede volání API nebo vrátí nepředvídatelný výsledek.
jednoduchá nečistá funkce:
var tip = 0;function calculateTip( mealTotal ) {
tip = 0.15 * mealTotal;
}calculateTip( 150 )
console.log(tip)
jednoduchá čistá funkce:
function isPure(x,y) {
return x * y
}console.log(isPure(3,5));
čistá funkce vrátí přesný výsledek pokaždé a nemutuje žádná data mimo ni. Důležité je věnovat pozornost tomu, že čistá funkce musí zůstat daleko od mutace dat, takže buďte opatrní při výběru metod, které chcete použít ve svých čistých funkcích. Například, pokud chcete sloučit dvě pole uvnitř vaší funkce, jako obvykle v reduktoru React, nepoužívejte pole.prototyp.metoda push (). Místo toho byste chtěli použít pole.prototyp.concat (), který zachová stav starých polí a vrátí nový pro vaše použití.
funkce vyššího řádu:
v JavaScriptu jsou funkce považovány za objekty, proto můžeme funkce předávat stejně jako jakoukoli jinou hodnotu. Funkce vyššího řádu je jednoduše funkce, která pracuje na jiných funkcích. Mohou převzít funkci jako vstup nebo vrátit jako výstup. Jednoduchý příklad uvidíme v následující ukázce.
anonymní funkce:
anonymní funkce jsou velmi užitečné, když potřebujeme definovat logiku ad hoc, jak potřebujeme. Jak název napovídá, anonymní funkce v bezejmenných a většinou nalézt jako argument funkce jako náhradu za jménem funkce, funkce přiřazena proměnné, nebo vrátit jako funkce vyšších řádů funkce. Jeho kořeny leží těžce v Lambda počtu a je velmi důležité pro všechny funkční programovací jazyky.
anonymní funkce přiřazená proměnné. Snadno projít kolem a vyvolat v případě potřeby.
const myVar = function(){console.log(‘Anonymous function here!’)}myVar()
Anonymní funkce jako argument
setInterval(function(){console.log(new Date().getTime())}, 1000);
Anonymní funkce v rámci vyššího řádu funkce
function mealCall(meal){
return function(message){
return console.log(message + " " + meal + ‘!!’)
}
}const announceDinner = mealCall(‘dinner’)
const announceLunch = mealCall(‘breakfast’)announceDinner(‘hey!, come and get your’)
announceLunch(‘Rise and shine! time for’)
Rekurze
Rekurze je dobře známo, že funkční programovací techniky. Rekurzivní funkce je jednoduše funkce, která se volá, a proto funguje jako smyčka vykonávající stejný kód vícekrát. Dodává se s jedním upozorněním ačkoli, jeden musí být opatrný, aby se zabránilo nekonečné rekurze. Proto je zapotřebí základní případ, který by mu řekl, kdy přestat. Rekurzivní funkce nebo algoritmy mohou být implementovány pomocí rekurze a smyček, ale je lepší použít rekurzi. Níže je uveden dobře známý algoritmus pro faktorizaci čísla pomocí rekurze i smyčky.
Rekurzivní funkce
function factorialize(num){
if (num === 0 || num === 1){return 1;}
return (num * factorialize(num — 1));
}var result = factorialize(14);console.log(result);
Rekurze pomocí smyčky
function factorialize(num) {
if (num === 0 || num === 1){
return 1;
}
for (var i = num-1; i >= 1; i-- ) {
num *= i;
}
return num;
}
console.log(factorialize(6));
Jsme se zabývali několika základních složek na psaní funkčního kódu. Není možné vždy psát funkční kód v aplikaci, ale výhody jsou skvělé, pokud jsou používány co nejvíce. Rámců, jako Úhlové a reakce jsou silně ovlivněny funkcionálního programování a knihovny jako Redux a Lodash nám umožní využít výhody, takže je tam určitě velký přínos pro začátek, že v FP.
zdroje pro další informace? Zde jsou některé skvělé články a zdroje pro další vzdělávání.
- proč se učit funkční programování v JavaScriptu? Eric Elliot
- Výmluvný JavaScript Marijn Haverbeke
- chcete být Funkční Programátor Charles Scalfani
já opravdu doufám, že to bylo užitečné a v příštím článku se budeme ponořit trochu hlouběji a rozbalit i další zajímavé a užitečné nástroje, jako je JavaScript metody, částečná aplikace, mazání, argument závazný a další.
neváhejte tleskat, sdílet, kritizovat nebo sdílet jakékoli myšlenky na toto téma!