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 lastJoinog et vilkårligt antal items. Indledningsvis listerklærer en commaSeparatedvariabel. Denne variabel gemmer et kommasepareret sammenføjet array med alle elementerne undtagen det sidste. På den næste linje gemmer vi det sidste element itemsi en lastItemvariabel. 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 listfunktion 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 listfunktion. 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 listAndfunktion “indstiller vi” (eller bruger delvis ) lastJoinargumentet 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 partialhjælpefunktion:

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

Denne funktion tager en funktion fnsom den første parameter og firstArgsom dens anden. Det returnerer en helt ny funktion med en parameter lastArgs. Dette samler de bestemte i argumenter.

Nu for at gøre vores listAndfunktion påkalder vi partialvideregivelse af vores listfunktion og vores sidste tilslutningsord:

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

Vores listAndfunktion tager nu kun en vilkårlig liste over varer. Denne funktion, når den påberåbes, vil igen påkalde den bestået listfunktion. Vi kan se, at det vil blive bestået “og” som det første argument og samlet lastArgsderefter.

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 partialfunktion, 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 thisi bind for at indstille sin kontekst. Under emhætten anvender den delvist thisog returnerer en ny funktion.