Ako používať čiastočnú aplikáciu na vylepšenie kódu JavaScript

Využitie tejto funkčnej techniky môže spôsobiť, že váš kód bude elegantnejší

Funkčné programovanie nám dáva techniky na riešenie problémov v našom kóde. Jedna z nich, čiastočná aplikácia, je trochu zložitá na pochopenie, ale môže nám umožniť, aby sme toho napísali menej (znie to zaujímavo, že?).

Čo je to?

Čiastočná aplikácia sa začína funkciou. Vezmeme túto funkciu a vytvoríme novú s jedným alebo viacerými z jej argumentov, ktoré sú už „nastavené“ alebo čiastočne použité . Znie to zvláštne, ale zníži to počet parametrov potrebných pre naše funkcie.

Uveďme kontext, v ktorom by sme mohli použiť čiastočnú aplikáciu:

const list = (lastJoin, ...items) => { const commaSeparated = items.slice(0,-1).join(", "); const lastItem = items.pop(); return `${commaSeparated} ${lastJoin} ${lastItem}`;}

Táto malá funkcia prijíma jedno slovo lastJoina ľubovoľný počet items. Spočiatku listdeklaruje commaSeparatedpremennú. Táto premenná obsahuje čiarkami oddelené spojené pole všetkých prvkov okrem posledného. Na ďalšom riadku uložíme poslednú položku itemsv lastItempremennej. Funkcia sa potom vráti pomocou šablóny reťazca.

Funkcia potom vráti itemsreťazec vo formáte reťazca. Napríklad:

list("and", "red", "green", "blue"); // "red, green and blue"list("with", "red", "green", "blue"); // "red, green with blue"list("or", "red", "green", "blue"); // "red, green or blue"

Naša listfunkcia nám umožňuje vytvárať zoznamy, kedykoľvek chceme. Každý typ zoznamu, ktorý vytvoríme, je „a“, „s“, „alebo“ špecializáciou na všeobecnú listfunkciu. Nebolo by pekné, keby to mohli byť vlastné funkcie ?!

Ako používať čiastočnú aplikáciu

Tu môže pomôcť čiastočná aplikácia. Napríklad na vytvorenie listAndfunkcie „nastavíme“ (alebo čiastočne použijeme ) lastJoinargument na „a“. Výsledok tohto postupu znamená, že môžeme čiastočne vyvolať našu čiastočne použitú funkciu:

listAnd("red", "green", "blue"); // "red, green and blue"

Ani to sa nemusí zastaviť. Mnoho špecializovaných funkcií môžeme vytvoriť čiastočným uplatnením argumentu na našu funkciu zoznamu:

listOr("red", "green", "blue"); // "red, green or blue"listWith("red", "green", "blue"); // "red, green with blue"

Aby sme to dosiahli, musíme vytvoriť partialužitočnú funkciu:

const partial = (fn, firstArg) => { return (...lastArgs) => { return fn(firstArg, ...lastArgs); }}

Táto funkcia berie funkciu fnako prvý parameter a firstArgako svoj druhý parameter . Vráti úplne novú funkciu s jedným parametrom lastArgs. Toto zhromažďuje odovzdané argumenty.

Teraz, aby sme vytvorili našu listAndfunkciu, vyvoláme partialodovzdanie našej listfunkcie a nášho posledného spojeného slova:

const listAnd = partial(list, "and");

Naša listAndfunkcia teraz prijíma iba ľubovoľný zoznam položiek. Pri vyvolaní tejto funkcie sa následne vyvolá listfunkcia odovzdaná . Vidíme, že bude prijatý „a“ ako prvý argument a lastArgspotom zhromaždený .

Teraz sme vytvorili čiastočne použitú funkciu. Túto špecializovanú funkciu môžeme v našom programe používať znova a znova:

listAnd("red", "green", "blue"); // "red, green and blue"

Berieme to ďalej

partialFunkcia sme vytvorili, je ilustrovať, ako čiastočná aplikácia funguje. Existuje niekoľko vynikajúcich funkčných knižníc JavaScriptu, ktoré majú tento obslužný program zabudovaný, napríklad Ramda JS.

Stojí za zmienku, že aj keď ste v koncepcii čiastočnej aplikácie nováčikom, existuje veľká šanca, že ju už využívate. Ak ste niekedy použili .bind()metódu na funkcii, je to príklad čiastočnej aplikácie. Je bežnou praxou prejsť thisdo väzby a nastaviť jej kontext. Pod kapotou to čiastočne aplikuje thisa vracia novú funkciu.