Funkciju sastāvs JavaScript

Funkciju sastāvs ir punktuāla pielietošana vienas funkcijas rezultātam. Izstrādātāji to dara manuāli katru dienu, kad ligzda darbojas:

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

Bet tas ir grūti lasāms. Ir labāks veids, kā izmantot funkciju sastāvu. Tā vietā, lai lasītu tos no iekšpuses uz āru:

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

Mēs varam izmantot augstākas pakāpes funkciju, lai tos sakārtotu sakārtotā veidā.

add2AndSquare = compose( add2, square)

Rakstīšanas vienkārša ieviešana būtu:

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

Lai iegūtu vēl lielāku elastību, mēs varam izmantot funkciju reducRight:

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

Kompozīcijas lasīšana no kreisās uz labo ļauj skaidri sasaistīt augstākas kārtas funkcijas. Reālās pasaules piemēri ir autentifikāciju, reģistrēšanas un konteksta rekvizītu pievienošana. Tā ir tehnika, kas ļauj atkārtoti izmantot visaugstākajā līmenī. Šeit ir daži piemēri, kā to izmantot:

// 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

Jūs varētu domāt, ka tā ir uzlabota funkcionāla programmēšana, un tā nav būtiska priekšējās programmas programmēšanai. Bet tas ir noderīgi arī vienas lapas lietojumprogrammās. Piemēram, React komponentam varat pievienot uzvedību, izmantojot augstākas kārtas komponentus:

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);

Noslēgumā funkciju sastāvs ļauj funkcionalitāti atkārtoti izmantot ļoti augstā līmenī. Ja funkcijas ir labi strukturētas, tas ļauj izstrādātājiem izveidot jaunu uzvedību, pamatojoties uz esošo uzvedību.

Tas arī palielina ieviešanas lasāmību. Ligzdošanas funkciju vietā jūs varat skaidri savienot funkcijas un izveidot augstākas kārtas funkcijas ar nozīmīgiem nosaukumiem.