Sådan bruges en delvis applikation til at forbedre din JavaScript-kode
Brug af denne funktionelle teknik kan gøre din kode mere elegant

Funktionel programmering giver os teknikker til at løse problemer i vores kode. En af disse, delvis anvendelse, er lidt vanskelig at forstå, men det kan give os mulighed for at skrive mindre af det (lyder interessant, ikke?).
Hvad er det?
Delvis anvendelse starter med en funktion. Vi tager denne funktion og opretter en ny med et eller flere af dens argumenter, der allerede er "indstillet" eller delvist anvendt . Dette lyder underligt, men det reducerer antallet af parametre, der er nødvendige for vores funktioner.
Lad os give nogle sammenhænge omkring, hvornår vi kunne bruge delvis anvendelse:
const list = (lastJoin, ...items) => { const commaSeparated = items.slice(0,-1).join(", "); const lastItem = items.pop(); return `${commaSeparated} ${lastJoin} ${lastItem}`;}
Denne lille funktion indeholder et enkelt ord lastJoin
og et vilkårligt antal items
. Indledningsvis list
erklærer en commaSeparated
variabel. Denne variabel gemmer et kommasepareret sammenføjet array med alle elementerne undtagen det sidste. På den næste linje gemmer vi det sidste element items
i en lastItem
variabel. Funktionen vender derefter tilbage ved hjælp af en strengskabelon.
Funktionen returnerer derefter items
, som en streng, i listeformat. For eksempel:
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"
Vores list
funktion giver os mulighed for at oprette lister, når vi ønsker det. Hver type liste, vi opretter, “og”, “med”, “eller” er en specialisering af den generelle list
funktion. Ville det ikke være rart, hvis de kunne være deres egne funktioner ?!
Sådan bruges delvis applikation
Det er her, delvis anvendelse kan hjælpe. For eksempel for at lave en listAnd
funktion “indstiller vi” (eller bruger delvis ) lastJoin
argumentet til at være “og”. Resultatet af at gøre dette betyder, at vi kan påberåbe os delvist anvendt funktion på denne måde:
listAnd("red", "green", "blue"); // "red, green and blue"
Det behøver heller ikke stoppe der. Vi kan lave mange specialiserede funktioner ved delvist at anvende et argument på vores listefunktion:
listOr("red", "green", "blue"); // "red, green or blue"listWith("red", "green", "blue"); // "red, green with blue"
For at gøre dette skal vi oprette en partial
hjælpefunktion:
const partial = (fn, firstArg) => { return (...lastArgs) => { return fn(firstArg, ...lastArgs); }}
Denne funktion tager en funktion fn
som den første parameter og firstArg
som dens anden. Det returnerer en helt ny funktion med en parameter lastArgs
. Dette samler de bestemte i argumenter.
Nu for at gøre vores listAnd
funktion påkalder vi partial
videregivelse af vores list
funktion og vores sidste tilslutningsord:
const listAnd = partial(list, "and");
Vores listAnd
funktion tager nu kun en vilkårlig liste over varer. Denne funktion, når den påberåbes, vil igen påkalde den bestået list
funktion. Vi kan se, at det vil blive bestået “og” som det første argument og samlet lastArgs
derefter.
Vi har nu oprettet en delvist anvendt funktion. Vi kan bruge denne specialiserede funktion igen og igen i vores program:
listAnd("red", "green", "blue"); // "red, green and blue"
At tage det videre
Den partial
funktion, vi oprettede, er at illustrere, hvordan delvis anvendelse fungerer. Der er nogle gode funktionelle JavaScript-biblioteker til rådighed, som har dette værktøj indbygget, såsom Ramda JS.
Det er værd at bemærke, at selvom du er ny med delvis anvendelse som et koncept, er der enhver chance for, at du har brugt det. Hvis du nogensinde har brugt .bind()
metoden til en funktion, er dette et eksempel på delvis anvendelse. Det er almindelig praksis at passere this
i bind for at indstille sin kontekst. Under emhætten anvender den delvist this
og returnerer en ny funktion.