Zloženie funkcií v JavaScripte

Skladba funkcií je bodová aplikácia jednej funkcie na výsledok inej. Vývojári to robia ručne každý deň, keď hniezdo funguje:

compose = (fn1, fn2) => value => fn2(fn1(value))

Ale toto sa ťažko číta. Existuje lepší spôsob použitia zloženia funkcií. Namiesto ich čítania zvnútra:

add2AndSquare = (n) => square(add2(n))

Môžeme použiť funkciu vyššieho rádu na ich reťazenie usporiadaným spôsobom.

add2AndSquare = compose( add2, square)

Jednoduchá implementácia komponovania by bola:

compose = (f1, f2) => value => f2( f1(value) );

Aby sme získali ešte väčšiu flexibilitu, môžeme použiť funkciu reduRight:

compose = (...fns) => (initialVal) => fns.reduceRight((val, fn) => fn(val), initialVal);

Čítanie písania správy zľava doprava umožňuje jasné reťazenie funkcií vyššieho rádu. Príkladmi zo skutočného sveta sú pridanie autentifikácií, protokolovania a kontextových vlastností. Je to technika, ktorá umožňuje opätovné použitie na najvyššej úrovni. Tu je niekoľko príkladov, ako ho používať:

// example const add2 = (n) => n + 2; const times2 = (n) => n * 2; const times2add2 = compose(add2, times2); const add6 = compose(add2, add2, add2); times2add2(2); // 6 add2tiems2(2); // 8 add6(2); // 8

Možno si myslíte, že toto je pokročilé funkčné programovanie a nie je to pre frontend programovanie relevantné. Ale je to užitočné aj pri jednostránkových aplikáciách. Napríklad môžete pridať správanie k komponentu React pomocou komponentov vyššieho rádu:

function logProps(InputComponent) { InputComponent.prototype.componentWillReceiveProps = function(nextProps) { console.log('Current props: ', this.props); console.log('Next props: ', nextProps); }; return InputComponent; } // EnhancedComponent will log whenever props are received const EnhancedComponent = logProps(InputComponent);

Na záver zloženie funkcií umožňuje opätovné použitie funkčnosti na veľmi vysokej úrovni. Ak sú funkcie dobre štruktúrované, umožňuje vývojárom vytvárať nové správanie založené na existujúcom správaní.

Zvyšuje tiež čitateľnosť implementácií. Namiesto vnorených funkcií môžete funkcie jasne reťaziť a vytvárať funkcie vyššieho rádu so zmysluplnými názvami.