Състав на функциите в JavaScript

Съставът на функциите е точковото прилагане на една функция към резултата на друга. Разработчиците го правят ръчно всеки ден, когато гнездото функционира:

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

Но това е трудно за четене. Има по-добър начин, като се използва функционален състав. Вместо да ги четете отвътре навън:

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

Можем да използваме функция от по-висок ред, за да ги веригираме по подреден начин.

add2AndSquare = compose( add2, square)

Едно просто изпълнение на композирането би било:

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

За да получим още по-голяма гъвкавост, можем да използваме функцията reduceRight:

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

Четенето на композиция отляво надясно позволява ясно свързване на функции от по-висок ред. Примерите от реалния свят са добавяне на свойства за удостоверяване, регистриране и контекст. Това е техника, която позволява повторна употреба на най-високо ниво. Ето няколко примера как да го използвате:

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

Може би си мислите, че това е усъвършенствано функционално програмиране и не е от значение за програмирането отпред. Но това е полезно и в приложения с една страница. Например можете да добавите поведение към React компонент, като използвате компоненти от по-висок ред:

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

В заключение съставът на функциите позволява многократна употреба на функционалността на много високо ниво. Ако функциите са добре структурирани, това позволява на разработчиците да създадат ново поведение въз основа на съществуващото поведение.

Той също така увеличава четливостта на реализациите. Вместо да влагате функции, можете ясно да свързвате функции и да създавате функции от по-висок ред със значими имена.