Functional programming - marissaverdonck/weekly-nerd-1920 GitHub Wiki
Functional Programming
Functional Programming, dit begrip ik vaak gevallen tijdens de minor. Ik wil voor mezelf nog eens samenvatten wat functional Programming precies inhoud en hoe dit wordt toepast. Als ik programmeer, is mijn eerste prioriteit iets werkend krijgen. Code is daardoor niet altijd netjes, wordt onnodig herhaald en is niet voor iedereen leesbaar. Wanneer ik zou letten op de regels van Functional Programming zou mijn code een stuk netter zijn.
Pure functions
Functioneel Programming is het proces van het bouwen van software door "pure functies" samen te stellen. De code is kort geschreven, voorspelbaar en gemakkelijk te testen. Dit zorgt voor minder bugs en het koste minder tijd om te schrijven/lezen.
Pure functies zijn herbruikbaar doordat ze argumenten gebruiken. Ze nemen een argument als input en retourneren de output op basis van die input. Bij dezelfde input zal altijd dezelfde output geven, ongeacht wanneer en hoe vaak je dit vraagt.
Pure functions zijn functies die geen andere functies beïnvloeden, ze geven geen "side-effects". Zo kunnen bugs worden voorkomen.
Side effects
Een side effect is het aanpassen van een globale variabele of een variabele in een andere functie. Probeer de "shared state" te verrmijden. Dit is een variabele die bereikbaar is in de global scope. Bij objectgeoriënteerd programmeren worden objecten met waardes tussen scopes gedeeld. De variabele uit de global scope kan veranderen in de tijd dat je functie is aangeroepen waardoor bugs kunnen ontstaan. Functioneel programmeren gebruikt dit juist niet. Het bouwt verder op gegevens uit de local scope. Bij functional programming houd je de code vaak gescheiden van andere software. Iets schrijven naar het scherm of loggen met de console zijn ook side effects. Frameworks weergeven daarom bijvoorbeeld vaak de status in afzonderlijke, los gekoppelde modules.
Function composition
Bij functioneel programmeren verdeel je de code over meerdere kleine functies. Function composition is het proces waarbij de output van twee of meer functies worden gecombineerd in een nieuwe functie.
Higher order functions
Met higher oder functies kunnen functies als variabelen worden behandeld. Het resultaat uit een functie kan aan andere functies worden doorgeven via argumenten. Je hoeft niet meer hetzelfde stuk code onnodig te herhalen voor verschillende inputs. Door de input via een argument mee te geven kan de code worden hergebruikt.
Declaratief vs imperatief
Functioneel programmeren is declaratief. Het beschrijft **wat ** te doen om een resultaat te krijgen. imperatief beschrijft de specifieke stappen hoe je om een resultaat te kan verkrijgen.
Voorbeeld imperatief
const doubleMap = numbers => {
const doubled = [];
for (let i = 0; i < numbers.length; i++) {
doubled.push(numbers[i] * 2);
}
return doubled;
};
console.log(doubleMap([2, 3, 4])); // [4, 6, 8]
Voorbeeld declaratief
const doubleMap = numbers => numbers.map(n => n * 2);
console.log(doubleMap([2, 3, 4])); // [4, 6, 8]
Beide codes doen hetzelfde. Bij de declaratiefe versie gebeurt dit in kortere code, het laat zien wat er gebeurd waardoor het duidelijker is en er minder bugs kunnen onstaan. De imperatieve versie is meer beschrijvend over hoe het gebeurt.
Functors
Een functor is functie die over alle waardes in een array kan "mappen" en hier een nieuwe array uit kan maken. Er zijn verschillende functors met verschillende doelen. Deze functors zijn declaratief.
filter()
Gaat langs alle waarde uit een array en verwijdert de waardes die niet aan de voorwaarde voldoen. In het volgende voorbeeld wordt er in de animals objecten gekeken of de species gelijk is aan dog. Op elke waarde wordt een true/false toegepast.
Var animals = [
{ name: ‘Caro, species: ‘dog’},
{ name: ‘Harold, species: ‘fish’},
{ name: ‘Jimmy, species: ‘cat’},
{ name: ‘Boy’, species: ‘dog’},
]
var isDog = function(animal){
return animal.species ===‘dogs’
}
var dogs = animals.filter(isDog)
map()
Map() transformeert alle waarde uit een array. Er wordt niet gekeken naar true of false. Alle items worden getransformeerd in een nieuwe array.
Var names = animals.map((animal) => {
return animal.name + ‘ is a ‘ + animal.species
})
reduce()
Reduce() is de multi tool is list transformaties. Als je geen andere tool kan gebruiken zoals map() of filter() kan reduce het vast voor je oplossen! De megegeven arhumenten (sum, order) gaan alle waardes langs. Sum telt alles cummulatief op en order geeft de huidige waarde. Hier een simper voorbeeld:
Var orders = [
{ amount: 250 },
{ amount: 400 },
{ amount: 100 },
{ amount: 325 },
]
Var totalAmount = orders.reduce(function(sum, order){
return sum + order.amount
}, 0)
Conclusie
Door alle punten van Functional Programming nog een keer op een rijtje te zetten is het voor mij nu duidelijk waar ik op kan letten bij het coderen.
- Let op dat je geen side-effects veroorzaakt. Gebruik lokale variabele.
- Gebruik Composition, korte functies in een functie.
- Gebruik korte functies als map() en reduce().
- Hergebruik je code door middel van argumenten.
Bronnen
Elliot, E. (2017, 4 januari) Master the JavaScript Interview: What is Functional Programming? Geraadpleegd van: https://medium.com/javascript-scene/master-the-javascript-interview-what-is-functional-programming-7f218c68b3a0
Elliot, E. (2016, 26 maart) Master the JavaScript Interview: What is a Pure Function? Geraadpleegd van: https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-pure-function-d1c076bec976
TK. (2018, 15 november). An Introduction to the basic principles of Functional Programming. Geraadpleegd van: https://www.freecodecamp.org/news/an-introduction-to-the-basic-principles-of-functional-programming-a2c2a15c84/
Fun Fun function. (2015, 21 juni) Higher-order functions - Part 1 till 4 of Functional Programming in JavaScript. Geraadpleegd van: https://www.youtube.com/watch?v=BMUiFMZr7vk&t=2s