Читать книгу JavaScript funkcyjnie. Zrównoważone, pragmatyczne programowanie funkcyjne w JavaScript - Kyle Simpson - Страница 8

Pierwszy rzut oka

Оглавление

Zilustrujmy po krótce pojęcie „Lekko funkcyjny JavaScript” za pomocą kawałka kodu przed i po. Rozważmy:

var numbers = [4,10,0,27,42,17,15,-6,58];

var faves = [];

var magicNumber = 0;

pickFavoriteNumbers();

calculateMagicNumber();

outputMsg(); // The magic number is: 42

// ***************

function calculateMagicNumber() {

for (let fave of faves) {

magicNumber = magicNumber + fave;

}

}

function pickFavoriteNumbers() {

for (let num of numbers) {

if (num >= 10 && num <= 20) {

faves.push( num );

}

}

}

function outputMsg() {

var msg = `The magic number is: ${magicNumber}`;

console.log( msg );

}

A teraz popatrzmy na inny styl kodu, który daje dokładnie taki sam wynik:

var sumOnlyFavorites = FP.compose( [

FP.filterReducer( FP.gte( 10 ) ),

FP.filterReducer( FP.lte( 20 ) )

] )( sum );

var printMagicNumber = FP.pipe( [

FP.reduce( sumOnlyFavorites, 0 ),

constructMsg,

console.log

] );

var numbers = [4,10,0,27,42,17,15,-6,58];

printMagicNumber( numbers ); // Magiczna liczba to: 42

// ***************

function sum(x,y) { return x + y; }

function constructMsg(v) { return `The magic number is: ${v}`; }

Gdy zrozumiemy FP i lekkie FP, drugi fragment kodu przeczytamy i mentalnie przetworzymy w poniższy sposób.

Najpierw tworzymy funkcję o nazwie sumOnlyFavorites(..), która jest kombinacją trzech innych funkcji. Łączymy dwa filtry, z których jeden sprawdza, czy wartość jest większa lub równa 10, a drugi, czy jest mniejsza lub równa 20. Następnie dołączamy reduktor sum(..) do kompozycji transduktora. Wynikowa funkcja sumOnlyFavorites(..) jest reduktorem, który sprawdza, czy wartość przechodzi oba testy filtrów, a jeśli tak, to dodaje wartość do wartości akumulowanej.

Potem tworzymy kolejną funkcję o nazwie printMagicNumber(..), która najpierw redukuje listę liczb za pomocą zdefiniowanego wcześniej reduktora sumOnlyFavorites(..), dając w wyniku sumę tylko tych liczb, które przeszły przez sprawdzenie ulubionych wartości (favorite). Następnie printMagicNumber(..) przekazuje potokowo tę końcową sumę do constructMsg(..), która tworzy wartość łańcuchową przekazywaną ostatecznie do console.log(..).

Wszystkie te ruchome elementy przemawiają do dewelopera FP w sposób, który jak na razie może nam się wydać niezrozumiały. Ta książka ma nam pomóc mówić według tych samych reguł, aby było to dla nas czytelne jak każdy inny kod, jeśli nie lepiej!

Oto kilka innych uwag na temat tego porównania kodów:

 Prawdopodobnie dla wielu czytelników pierwszy fragment kodu wygląda na bardziej przyjazny/czytelny/łatwiejszy do utrzymania niż ten drugi. Jeśli tak jest, nie ma się co przejmować. Jesteście we właściwym miejscu. Jestem przekonany, że jeśli będziecie trzymać się tej książki i przerabiać wszystko, o czym jest mowa, drugi fragment kodu stanie się o wiele bardziej naturalny, a może nawet preferowany!

 Może ktoś to zadanie zrobić całkiem inaczej niż oba prezentowane fragmenty. To też nie szkodzi. Ta książka nie podaje przepisów, dyktując, że coś ma być zrobione w określony sposób. Celem jest ilustracja zalet i wad różnych wzorców i umożliwienie wam podejmowania decyzji. Gdy dojdziemy do końca książki, wasze podejście do zadania znajdzie się zapewne nieco bliżej tego drugiego fragmentu, niż jest to teraz.

 Możliwe też jest, że czytelnik to doświadczony deweloper FP, który przegląda początek tej książki, aby zobaczyć, czy znajdzie tam coś użytecznego. Drugi fragment kodu ma zdecydowanie elementy, które będą dobrze znane. Ale założę się też, że kilka razy taka osoba pomyśli „Hmm, ja bym tego nie zrobił w ten sposób…”. To jest w porządku i jest całkiem rozsądne.

Nie jest to tradycyjna, kanoniczna książka o FP. Pokażemy tu kilka podejść, które wydadzą się całkiem heretyczne. Szukamy pragmatycznej równowagi między jasnymi, niezaprzeczalnymi zaletami FP a potrzebą dostarczenia działającego, możliwego do utrzymania kodu JS, bez konieczności ogarnięcia zniechęcającej góry matematyki/notacji/terminologii.

To nie jest wasze FP, to lekko funkcyjny JavaScript. Jakikolwiek jest powód czytania tej książki, zapraszam!

JavaScript funkcyjnie. Zrównoważone, pragmatyczne programowanie funkcyjne w JavaScript

Подняться наверх