Narzędzia Javascript w akcji
Odkryj kilka narzędzi JavaScript, aby podnieść poziom swojej gry programistycznej. Dowiedz się więcej o ESLint, Prettier i Husky!
Przeczytaj nasz artykuł, aby odkryć moc programowania funkcyjnego w JavaScript. Programowanie funkcyjne jest klasyfikowane jako paradygmat deklaratywny, w którym opis programu jest oddzielony od obliczeń.
"Mówiąc najprościej, programowanie funkcjonalne jest rozwój oprogramowania styl, który kładzie duży nacisk na wykorzystanie funkcji"
Fragmenty książki: Luis Atencio "Programowanie funkcyjne w JavaScript. Jak poprawić swoje JavaScript programy wykorzystujące techniki funkcjonalne"
Programowanie funkcjonalne jest klasyfikowany jako deklaratywny gdzie opis programu jest oddzielony od obliczeń. Nacisk kładziony jest tutaj na wykorzystanie wyrażeń do opisu logiki programu. Jest to przeciwieństwo imperatywny programowanie, gdzie kod jest wykonywana krok po kroku i szczegółowo informuje komputer, jak wykonać zadanie.
Rozważmy przypadek, w którym mamy tablicę liczb całkowitych i musimy podnieść każdą z nich do drugiej potęgi, a następnie wybrać tylko te wartości, które nie są parzyste.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const results = []
for(let i = 0; i < numbers.length; i++) {
const secondPower = Math.pow(numbers[i], 2)
if(secondPower & 1) { // lub % 2, ale operacje na bitach są szybsze
results.push(secondPower);
}
}
console.log(results) // [1, 9, 25, 49, 81]
Jeśli chodzi o imperatywny wyraźnie widać skupienie się na szczegółach implementacji. W pętli widać indeks tablicy oparty na potrzebie kontrolowania liczby elementów. Ze względu na dużą liczbę szczegółów w kodzie, trudniej jest skupić się na tym, co robi. Skupmy się teraz na deklaratywny rozwiązanie.
const risesToSecondPower = (num) => Math.pow(num, 2)
const isOdd = (num) => num & 1;
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const results = numbers
.map(risesToSecondPower)
.filter(isOdd);
console.log(results) // [1, 9, 25, 49, 81]
W tym rozwiązaniu implementacja została oddzielona od inwokacji poprzez przeniesienie logiki do osobnych funkcji. Dzięki temu rozwiązaniu możemy skupić się jedynie na nazwach funkcji, które opisują to, co się w nich dzieje. Dodatkowo, poziom abstrakcji został podniesiony, a logika może być teraz ponownie wykorzystana. Skupmy się teraz na wywołaniu. Nie widać w nim żadnych szczegółów, tylko opis, który mówi, co ten kod robi, krok po kroku:
map(risesToSecondPower)
- pobiera każdy element tablicy i podnosi go do drugiej potęgi,filter(isOdd)
- filtruj i wybieraj nieparzyste elementy.Programowanie funkcjonalne ma wiele zalet. Jeśli chodzi o JavaScriptUżycie funkcji jest naturalne, ponieważ jest to język funkcjonalny. Nawet klasy w tym języku są "cukrem syntaktycznym" i składają się z funkcji.
Jeśli chodzi o czytelność, w podejściu imperatywnym kod zwykle staje się listą z nazwami funkcji, które można odczytać sekwencyjnie bez zagłębiania się w ich logikę. W rezultacie nie skupiamy się na szczegółach implementacji.
Kolejną zaletą jest trzymanie się konwencji niezmiennych obiektów. Dzięki takiemu podejściu kod staje się bezpieczniejszy, ponieważ referencje w JavaScript są bardzo silne i łatwo jest zmodyfikować niechciany obiekt.
W programowaniu funkcjonalnym kod jest podzielony na małe funkcje, które można łatwo uznać za abstrakcyjny kod wielokrotnego użytku.
Jedną z ważnych kwestii w programowaniu funkcyjnym są czyste funkcje. Aby utworzyć taką funkcję, należy pamiętać o kilku zasadach:
// Funkcja Inpure
let counter = 5
...
const multipleCounter = (multiplier) => {
counter = counter * multiplier
}
multiplyCounter(2) // -> ? wynik zależy od wartości początkowej
// Czysta funkcja
const multiplyBy = (multiplier) => (value) => value * multiplier
const multipleByTwo = multiplyBy(2)
const counter = multiplyByTwo(5) // -> 10
Pierwsza funkcja jest nieprzewidywalna, ponieważ zależy od zewnętrznego parametru, który może ulec zmianie. Druga funkcja jest przezroczysta, zależy tylko od parametrów wejściowych, nie modyfikuje ich i nie używa zmiennych spoza zakresu. Jest przejrzysta, ponieważ zależy od parametrów, nie modyfikuje ich, nie używa zmiennych spoza zakresu i zwraca nową wartość.