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 kommersielle programmer. Funksjonell programmering er et paradigme for å skrive kode og er veltalende satt i introduksjonen av Denne Wikipedia-artikkelen:
» – en stil for å bygge strukturen og elementene i dataprogrammer – som behandler beregning som evaluering av matematiske funksjoner og unngår endring-tilstand og foranderlige data. Det er et deklarativt programmeringsparadigme, som betyr programmering er gjort med uttrykk eller erklæringer i stedet for uttalelser.»
Vi vil komme inn på hva dette egentlig betyr veldig snart, men først, la oss få grunnleggende ut av veien ved å gi litt kontekst. Denne artikkelen tjener formålet med forhåpentligvis å introdusere de grunnleggende konseptene for funksjonell programmering til deg, og ved slutten av det ville vi ha etablert en grunnleggende forståelse av hvorfor vi ville velge å bruke den i våre kodestiler, hvordan Det gjelder JavaScript og noen grunnleggende mønstre som du kan begynne å implementere i koden din. Vær på utkikk etter en annen artikkel som vil bygge på denne og grave enda dypere inn i ideene diskutert her.røttene til funksjonell programmering ligger I Lambda-kalkulus, som var et system utviklet på 1930-tallet for å uttrykke beregning ved hjelp av funksjoner som ligner på det vi vil se veldig snart. For en stund, funksjonelle programmering konsepter og språk ble mye diskutert i akademia og vitenskapelige sammenhenger og til slutt blødde inn i utviklingen av kommersiell programvare. Det som gjør et programmeringsspråk funksjonelt eller ikke, er dets evne til å lette det funksjonelle programmeringsparadigmet, språk som Disse Er Ruby, Python, Julia og JavaScript, sistnevnte har egenskaper av imperative, objektorienterte og funksjonelle paradigmer.
La oss se på et eksempel på å bruke et imperativ, og deretter en funksjonell tilnærming til å fullføre en enkelt oppgave.
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
Funksjonell:
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
Bortsett Fra de åpenbare forbedringene den funksjonelle tilnærmingen gjør, som kortere kode, sparer oss et par tastetrykk, og det faktum at det er mye lettere å forstå med et raskt blikk, er det også elegant, noe som resulterer i renere kode, forenkler feilsøking, testing og vedlikehold.
La oss bryte dette ned litt, slik at vi kan nå en klar forståelse av forskjellene mellom de to tilnærmingene og definere hva funksjonell programmering er.
i den første tilnærmingen er vi imperatively beskriver hver hendelse som må skje for at vi skal oppnå oppgaven med å filtrere ut odde tall fra en matrise. Vi mater a fungere en array, inne i funksjonen lager vi et tomt array som vi vil bruke til a lagre odde tall i. Vi forteller det å sløyfe over arrayet, så erklærer vi en betinget, hvis den nåværende indeksen er et oddetall, skyv den til den tomme. For loop inkluderer ikke det siste nummeret i arrayet, det inkluderer bare tallene som fører opp til det, så hvis vårt siste nummer er merkelig, vil det ikke bli inkludert. Derfor legger vi til +1 når vi definerer mengden iterasjoner vår sløyfe må gjøre.
i den andre tilnærmingen definerer vi bare utfallet vi vil se ved å bruke en metode som kalles filter, og la maskinen ta vare på alle trinnene i mellom. Dette er en mer deklarativ tilnærming. Vi erklærer hva sluttresultatet må være, og vi resten blir håndtert for oss.
Nå kan Vi se hva den ovennevnte definisjonen forsøker å uttrykke. En måte å programmere, ved hjelp av erklæringer og uttrykk, snarere enn uttalelser. Denne definisjonen skraper bare overflaten av funksjonell programmering, og vi vil kontinuerlig bygge på vår definisjon etter hvert som vår forståelse vokser.
noen forskjeller mellom iterative og funksjonelle tilnærminger.
- Stilistisk definerer Vi et problem og endringene vi ønsker å se, i motsetning til å forklare det trinnvis.
- Vi trenger ikke å administrere stat i våre funksjoner som ovenfor der vi klarte tilstanden til vårt tomme array.
- Vi trenger ikke å bekymre deg så mye om rekkefølgen på utførelse.
- Vi bruker mindre looper, betingelser og bruker mer innebygde metoder, gjenbrukbare funksjoner og rekursjon.
ved å bruke denne tilnærmingen, vi til slutt skrive renere kode som som nevnt ovenfor, hjelper oss i debugging og vedlikehold. Det holder ting modulære, og deler av koden vår er brutt ned i mindre stykker som vi kan teste med letthet. Vi kan gjenbruke deler av koden vår ved hjelp av hjelpefunksjoner, og til slutt er det en mer effektiv, matematisk tilnærming til å skrive kode.
Søylene: Vår koding verktøykasse for å skrive funksjonell kode
følgende er noen viktige aspekter å skrive høy kvalitet funksjonell kode. Å se at dette er en oversikt, vi vil ikke dykke i for mye inn i hver, i stedet vil vi bare definere noen viktige egenskaper og ett eksempel på hver.
Rene Funksjoner:
Rene funksjoner returnerer en verdi utelukkende basert på hva som ble sendt inn i Den. Tanken bak det er at det vil være en ren funksjon hvis den alltid returnerer det samme resultatet hvis de samme verdiene sendes inn i den, og det endrer ikke verdier utenfor ts-omfanget, som gjør det uavhengig av enhver tilstand i systemet. Derfor kan en ren funksjon aldri mutere data, produsere ingen bivirkninger og kan lett gjenbrukes. Et eksempel på en ikke ren funksjon vil være en funksjon som gjør ET API-kall eller returnerer et uforutsigbart resultat.
Enkel Uren funksjon:
var tip = 0;function calculateTip( mealTotal ) {
tip = 0.15 * mealTotal;
}calculateTip( 150 )
console.log(tip)
Enkel Ren funksjon:
function isPure(x,y) {
return x * y
}console.log(isPure(3,5));
pure-funksjonen returnerer det nøyaktige resultatet hver gang, og det muterer ikke data utenfor det. Det viktigste å være oppmerksom på er at en ren funksjon må holde seg borte fra muterende data overhodet, så vær forsiktig når du velger hvilke metoder som skal brukes i dine rene funksjoner. For eksempel, hvis du ønsker å slå sammen to arrays inne i funksjonen, som man vanligvis ville gjøre i En React reducer, unngå å bruke Matrisen.prototype.trykk () metode. I stedet vil du bruke Array.prototype.concat (), som vil bevare tilstanden til de gamle arrays og returnere en ny til din bruk.
Høyere ordensfunksjoner:
i Javascript behandles funksjoner som objekter, derfor kan vi passere funksjoner rundt som vi ville noen annen verdi. En høyere ordensfunksjon er bare en funksjon som opererer på andre funksjoner. De kan ta i en funksjon som input, eller returnere en som utgang. Vi vil se et enkelt eksempel i følgende demonstrasjon.
Anonyme Funksjoner:
Anonyme funksjoner er svært nyttig når vi trenger å definere ad hoc logikk som vi trenger. Som navnet antyder, en anonym funksjon i navnløs, og for det meste funnet som et argument til en funksjon som erstatning for en navngitt funksjon, en funksjon tildelt en variabel, eller returnert som en funksjon i en høyere ordensfunksjon. Det er røtter ligge tungt I Lambda kalkulus og er svært viktig for alle funksjonelle programmeringsspråk.
Anonym funksjon tilordnet en variabel. Lett å passere rundt og påkalle når det trengs.
const myVar = function(){console.log(‘Anonymous function here!’)}myVar()
Anonym funksjon som argument
setInterval(function(){console.log(new Date().getTime())}, 1000);
Anonyme funksjoner innenfor en høyere ordensfunksjon
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’)
Rekursjon
Rekursjon er en velkjent funksjonell programmeringsteknikk. En rekursiv funksjon er ganske enkelt en funksjon som kaller seg selv, og fungerer derfor som en sløyfe som utfører den samme koden flere ganger. Den kommer med en advarsel skjønt, man må være forsiktig med å unngå uendelige rekursjoner. Derfor er det nødvendig med en base sak, for å fortelle det når du skal stoppe. Rekursive funksjoner eller algoritmer kan både implementeres ved hjelp av rekursjon og sløyfer, men det er bedre å bruke rekursjon. Nedenfor er den velkjente algoritmen for faktorisering av et tall både ved hjelp av rekursjon og en sløyfe.
Rekursiv funksjon
function factorialize(num){
if (num === 0 || num === 1){return 1;}
return (num * factorialize(num — 1));
}var result = factorialize(14);console.log(result);
Rekursjon ved hjelp av en sløyfe
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));
Vi har dekket noen av de essensielle ingrediensene for å skrive funksjonell kode. Det er ikke mulig å alltid skrive funksjonell kode i et program, men fordelene er gode når de brukes så mye som mulig. Rammer som Angular og React er sterkt påvirket av funksjonell programmering, og biblioteker som Redux og Lodash gjør det mulig for oss å utnytte fordelene med det, så det er definitivt en stor fordel å begynne å tenke PÅ FP-måten.
Ressurser for å lære mer? Her er noen gode artikler og ressurser for videre læring.
- Hvorfor Lære Funksjonell Programmering I JavaScript? Av Eric Elliot
- Eloquent JavaScript Av Marijn Haverbeke
- så du vil Være En Funksjonell Programmerer Av Charles Scalfani
jeg håper virkelig dette var nyttig, og i neste artikkel vil vi dykke litt dypere og pakke ut enda mer interessante og nyttige verktøy som javascript-metoder, delvis søknad, currying, argumentbinding og mer.
Føl deg fri til å klappe, dele, kritikk eller dele noen tanker om emnet!