Funksjonell programmering forklart på 5 minutter [With Examples]

Å bygge programvare er en veldig teknisk og utfordrende prosess som krever planlegging og strategisering for å formulere den riktige måten å løse et problem ved å bruke programvaren.

I denne forbindelse er det et viktig skritt å vurdere programmeringsparadigmet før du utvikler programvare.

Et programmeringsparadigme er en modell eller tilnærming til programmering som gir funksjoner, mønstre, prinsipper, regler og stiler for å designe, strukturere og skrive dataprogrammer.

Eksempler på populære programmeringsparadigmer inkluderer blant annet objektorientert programmering (OOP), prosedyreprogrammering, hendelsesdrevet programmering og funksjonell programmering.

Spesielt funksjonell programmering har fått mye oppmerksomhet den siste tiden, da den lover mindre buggy-kode som er svært gjenbrukbar og enkel å vedlikeholde. Så hva er funksjonell programmering?

Funksjonell programmering er et underparadigme av det deklarative programmeringsparadigmet. Deklarativ programmering er et paradigme som fokuserer på å skrive kode som beskriver hva et program skal gjøre i stedet for hvordan programmet skal gjøre det.

Et eksempel på dette kan sees når du spør etter data i SQL-databaser. I stedet for eksplisitt å si hvordan du vil at det skal hentes, er alt du spesifiserer dataene du ønsker skal hentes.

Funksjonell programmering i seg selv er et paradigme for å bygge dataprogrammer ved hjelp av uttrykk og rene funksjoner som brukes i rekkefølge for å løse problemer eller oppnå ønskede resultater.

I funksjonell programmering er hele funksjonaliteten til et program delt inn i gjenbrukbare, rene funksjoner med ett ansvar. Alt i programmet skjer ved bruk av rene funksjoner.

En ren funksjon er en deterministisk funksjon som, når den gis de samme inngangsverdiene, vil returnere den samme utgangen og ikke påvirke noen andre deler av applikasjonene.

Resultatet av en ren funksjon er altså utelukkende avhengig av dens input og ikke en global variabel i applikasjonen som kan endre resultatene av funksjonen.

Disse rene funksjonene mottar input, behandler dem lokalt og produserer en utgang uten å endre noen annen del av programmet.

Funksjonell programmering bruker uforanderlige data, det vil si data som ikke kan endres når de først er opprettet, og den unngår også delte tilstander, der de samme dataene kan nås og endres av forskjellige deler av et program.

Siden funksjonell programmering er sterkt avhengig av funksjoner, blir funksjoner referert til som førsteklasses borgere, noe som betyr at de kan sendes som et argument, lagres i en variabel og også returneres fra en annen funksjon.

I tillegg er funksjonell programmering sterkt avhengig av uttrykk i stedet for utsagn og unngår dermed loop-utsagn som for og while. Dette gjøres for å gjøre programmets logikk enkel å følge og feilsøke.

Typer funksjonelle programmeringsspråk

Det er to hovedtyper funksjonelle programmeringsspråk. Disse inkluderer:

  • Rent funksjonelle språk – Dette er programmeringsspråk som støtter, håndhever og fremmer bruken av funksjonelle paradigmer som bruk av førsteklasses rene funksjoner, uforanderlighet av tilstander og data, og funksjoner som ikke har bivirkninger til andre deler av programmet. Eksempler på rent funksjonelle språk inkluderer Haskell, Agda, Clean, Idris, Futhark og Elm, blant andre.
  • Urene funksjonelle språk – Dette er språk som har støtte for funksjonelle programmeringsparadigmer, men som også tillater bruk av urene funksjoner, mutasjoner av et programs tilstand og operasjoner som har bivirkninger. Eksempler på urene funksjonelle språk inkluderer Javascript, Rust, Erlang, Python, Ruby, Java, Kotlin og Clojure, blant andre.
  Hvilken bør du bruke?

Både rent funksjonelle og urene funksjonelle språk er i bruk av utviklere. Men å skifte til et rent funksjonelt språk kan ta mye tid og krefter hvis du aldri har brukt funksjonell programmering før.

Funksjonelle programmeringsspråk og biblioteker

Noen populære funksjonelle programmeringsspråk og biblioteker inkluderer:

#1. Haskell

Haskell er et statisk skrevet, lat, rent funksjonelt programmeringsspråk som regnes som legemliggjørelsen av det funksjonelle programmeringsparadigmet.

I tillegg til typeslutning, tilbyr språket støtte for lat evaluering, der uttrykk bare evalueres når resultatene deres er nødvendige. Haskell tilbyr også støtte for samtidig programmering, og kompileringen kommer med en høyytelses søppeloppsamler og et lett samtidighetsbibliotek.

Gjennom sin bruk og strenge overholdelse av funksjonelle programmeringsprinsipper, kan Haskell gjøre bygging av komplekse programvaresystemer enklere og også lett å vedlikeholde.

Blant mange bransjeaktører er Haskell det viktigste språket når man bygger selvstendige systemer eller domenespesifikke språk. Den har også bred bruk i akademia og forskning. Noen selskaper som bruker Haskell inkluderer Microsoft, Github, Hasura og Lumi, blant mange andre.

#2. Ramda

Ramda er et funksjonelt programmeringsbibliotek for JavaScript-språket. Ramda gjør det enkelt å bygge kompleks logikk gjennom funksjonell sammensetning og gir et sett med verktøyfunksjoner som oppmuntrer og støtter bruken av funksjonelle programmeringsprinsipper i JavaScript.

Ramda gir også en enkel måte å bruke uforanderlige objekter og funksjoner uten bivirkninger, som er nøkkelbegreper i funksjonell programmering.

Siden JavaScript ikke er et rent funksjonelt programmeringsspråk som Haskell, ved bruk av et bibliotek som Ramda, kan du bruke funksjonell programmering og høste ytelsesfordelene med funksjonell programmering mens du bruker JavaScript.

#3. Eliksir

Elixir er et generellt, samtidig, funksjonelt programmeringsspråk som er designet for å være skalerbart, enkelt å vedlikeholde og også feiltolerant. Språket ble opprettet i 2011 av Jose Valim, kjører på den virtuelle BEAM-maskinen, og brukes av selskaper som Heroku, Discord, change.org og Duffel, blant andre.

Som et funksjonelt programmeringsspråk, oppmuntrer Elixir til uforanderlighet av tilstander og data, bruk av rene funksjoner når du skriver kode, og transformasjon av data.

Nøkkelbegreper i funksjonell programmering

#1. Rene funksjoner

Funksjonell programmering gjør utstrakt bruk av rene funksjoner. Rene funksjoner har to hovedegenskaper. For det første produserer de samme utgang for samme input uavhengig av eksterne faktorer, noe som gjør dem deterministiske og dermed forutsigbare.

For det andre har rene funksjoner ikke bivirkninger. Det vil si at de ikke endrer det ytre miljøet utenfor deres virkeområde på noen måte.

Noen eksempler på rene funksjoner inkluderer:

//function to calculate the square of a number
function square(x) {
    return x * x;
}

//function to add two variables
function add(a, b) {
    return a + b
}

Funksjonene ovenfor returnerer samme utgang for de samme inngangene og har ingen bivirkninger utenfor deres omfang.

#2. Uforanderlighet

I funksjonell programmering er dataene som brukes uforanderlige. Dette betyr at når variabler først er initialisert, kan de ikke endres. Dette sikrer bevaring av tilstanden til en variabel gjennom hele programmet.

  12 Gratis sikkerhetskopieringsprogramvare med åpen kildekode for å holde dataene dine sikre

I tilfelle du ønsker å gjøre endringer i variabelen eller utføre en operasjon på den, kan du opprette en ny variabel for å lagre de oppdaterte dataene uten å endre den opprinnelige variabelen.

#3. Funksjoner av høyere orden

Funksjoner av høyere orden er funksjoner som aksepterer en eller flere funksjoner som argumenter og/eller returnerer en funksjon.

Funksjoner av høyere orden er nyttige i funksjonell programmering ettersom de tillater å kombinere flere funksjoner for å lage nye funksjoner, tillater bruk av tilbakeringinger, tillater abstraksjon av vanlige mønstre til gjenbrukbare funksjoner, og til slutt, funksjoner av høyere orden tillater skriving av mer konsise og uttrykksfull kode.

Et eksempel på en høyere ordens funksjon er vist nedenfor:

// A higher-order function which returns a function that multiplies
// a number by a given factor
function multiplier(factor) {
    return function (number) {
      return number * factor;
    }
  }
  
const double = multiplier(2); 
const triple = multiplier(3);
const quadruple = multiplier(4);
  
console.log(double(5)); // Output: 10
console.log(triple(5)); // Output: 15
console.log(quadruple(5)); // Output: 20

#4. Rekursjon

Siden funksjonell programmering er avhengig av uttrykk i stedet for setninger, unngås kontrollflytsetninger som for og while-løkker i dette paradigmet. Disse loop-setningene blir i sin tur erstattet med rekursjon, som er det som brukes til å utføre iterasjoner i funksjonell programmering.

Rekursjon innebærer at en funksjon kaller seg selv gjentatte ganger til en utgangsbetingelse er oppfylt. Ved å bruke rekursjon brytes et komplekst problem ned i mindre, enklere delproblemer som deretter løses rekursivt inntil et grunnleggende tilfelle er nådd, og gir en løsning på det større komplekse problemet.

#5. Deklarativ programmering

Funksjonell programmering er et underparadigme i det bredere deklarative programmeringsparadigmet som omfatter programmeringsparadigmer som fokuserer på å skrive kode med tanke på hva som må gjøres i stedet for å eksplisitt angi hvordan det skal gjøres.

I den forbindelse, når du bruker det funksjonelle programmeringsparadigmet, bør koden din beskrive hva som må oppnås eller problemet som skal løses.

Hvordan det skal oppnås er opp til programmeringsspråket du bruker. Dette hjelper deg med å skrive mer kortfattet og lett lesbar kode.

#6. Statsløs

Funksjonell programmering legger vekt på statsløs kode, der koden ikke opprettholder en global tilstand som kan modifiseres av funksjoner. Resultatene av funksjoner er utelukkende avhengige av inndata som sendes og kan ikke påvirkes av avhengigheter av andre deler av koden.

Funksjonene som brukes kan ikke endre en tilstand eller variabel i programmet som er utenfor dets omfang.

#7. Parallell utførelse

Siden funksjonell programmering bruker uforanderlige tilstander, bruker rene funksjoner og uforanderlige data, tillater den parallell utførelse av flere beregninger samtidig.

Siden hver funksjon kun må håndtere et gitt input uten å bekymre deg for å pådra seg bivirkninger fra andre deler av et program, kan komplekse problemer brytes opp i mindre delproblemer og utføres samtidig parallelt, noe som gir forbedret ytelse og effektivitet.

Fordeler med funksjonell programmering

Noen av fordelene med funksjonell programmering inkluderer:

Færre programvarefeil

Bortsett fra det faktum at kode som implementerer det funksjonelle programmeringsparadigmet er mer lesbart og lettere å forstå på grunn av bruken av rene funksjoner, tillater funksjonell programmering å skrive kode med færre feil.

  26 beste Tycoon-spill på Roblox

Siden funksjonell programmering fungerer med uforanderlige tilstander, har du aldri flere deler av et program som endrer tilstanden til en variabel eller hele programmet. Dette resulterer igjen i færre feil som kunne ha oppstått fra data som ble endret fra flere områder på grunn av delte tilstander.

Forbedrer kodelesbarheten

Funksjonell programmering er et underparadigme av det deklarative paradigmet, som legger vekt på å skrive kode som beskriver hva som må gjøres i stedet for hvordan det skal gjøres. Dette, kombinert med bruk av rene funksjoner, resulterer i kode som er selvforklarende, lettere å lese og forstå, og lett å vedlikeholde.

Forbedre gjenbrukbarheten av kode

Implementering av funksjonell programmering krever å bryte sammen komplekse problemer i mindre delproblemer og løse disse problemene ved hjelp av rene funksjoner. Disse funksjonene kan enkelt settes sammen og gjenbrukes for å løse andre komplekse problemer. Gjennom bruk av rene funksjoner og uforanderlige tilstander tillater funksjonell programmering skriving av svært gjenbrukbar kode.

Enklere testing og feilsøking

Funksjonell programmering bruker rene funksjoner som ikke har bivirkninger, bare er avhengige av deres innganger, og produserer konsistente deterministiske utganger for det samme settet med innganger.

Dette gjør funksjonell programmering enkelt å teste og feilsøke ettersom du ikke trenger å spore en variabel og hvordan den endres gjennom ulike deler av et program.

Siden det ikke er noen avhengigheter i funksjonell programmering, blir feilsøking og testing enklere ettersom du kan målrette mot bestemte deler av et program.

Støtter samtidighet og parallellitet

Siden funksjonell programmering oppmuntrer til tilstandsløshet og uforanderlighet av data, gjør det det mulig å trygt utføre flere rene funksjoner parallelt eller samtidig. Muligheten til å kjøre flere operasjoner parallelt resulterer i bedre behandlingshastigheter og bedre utnyttelse av prosessorer med flere kjerner.

Som et programmeringsparadigme kan funksjonell programmering hjelpe til med å skrive mer lesbar og lettforståelig kode med færre feil og utmerket støtte for parallellitet som muliggjør effektiv bruk av flerkjerneprosessorer. Funksjonell programmering gjør det mulig å bygge programvaresystemer som er mer pålitelige og enkle å skalere.

Begrensninger ved funksjonell programmering

Selv om funksjonell programmering har mye å tilby, kommer den med en læringskurve som krever at utviklere investerer mye tid og krefter på å lære å bruke paradigmet. Dette er fordi det introduserer nye måter å strukturere kode på og nye programmeringskonsepter.

Koding ved hjelp av funksjonell programmering kan være ekstremt komplisert og vanskelig siden den ikke bruker mer intuitive funksjoner som for og while-løkker. Å skrive programmer rekursivt er ikke lett.

Som et resultat kan utviklere ta mer for å mestre funksjonell programmering, spesielt når de kommer fra språk som bruker foranderlige tilstander, for eksempel i objektorientert programmering.

En annen begrensning ved funksjonell programmering oppstår fra kjerneprinsippet om uforanderlighet. Siden data og tilstander kan endres, og nye datastrukturer opprettes i stedet for å modifisere eksisterende, resulterer dette i funksjonell programmering som bruker mer lagringsplass. Den uforanderlige karakteren til funksjonell programmering kan også resultere i dårligere ytelse i applikasjoner.

Konklusjon

Selv om funksjonell programmering har eksistert i lang tid, har det blitt et trendparadigme i nyere tid. Så mye som det kan være litt vanskelig å plukke opp, vil utviklere ha enorm nytte av å lære om paradigmet og forskjellige måter de kan implementere funksjonell programmering når de skriver programmer.

Siden du ikke trenger å bruke rent funksjonelle programmeringsspråk som Haskell, kan du implementere funksjonelle programmeringskonsepter i språk som Javascript, Java, Python og Kotlin og høste fordelene av funksjonell programmering i prosjektene dine.

Du kan også utforske noen ressurser for å lære Python for nybegynnere.