Склад функцій у 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);

На закінчення склад функцій дозволяє повторно використовувати функціонал на дуже високому рівні. Якщо функції добре структуровані, це дозволяє розробникам створювати нову поведінку на основі існуючої поведінки.

Це також підвищує читабельність реалізацій. Замість вкладених функцій ви можете чітко зв'язати функції та створити функції вищого порядку зі значущими іменами.