67 lines
3.8 KiB
Markdown
67 lines
3.8 KiB
Markdown
|
---
|
|||
|
title: Function Composition
|
|||
|
localeTitle: Состав функции
|
|||
|
---
## Состав функции
|
|||
|
|
|||
|
Состав функции - это поточечное применение одной функции к результату другого. Разработчики делают это в ручном режиме каждый день, когда гнездо функционирует:
|
|||
|
|
|||
|
```javascript
|
|||
|
compose = (fn1, fn2) => value => fn2(fn1(value))
|
|||
|
```
|
|||
|
|
|||
|
Но это трудно читать. Существует лучший способ использования композиции функций. Вместо того, чтобы читать их изнутри:
|
|||
|
|
|||
|
```javascript
|
|||
|
add2AndSquare = (n) => square(add2(n))
|
|||
|
```
|
|||
|
|
|||
|
Мы можем использовать функцию более высокого порядка, чтобы упорядочить их упорядоченно.
|
|||
|
|
|||
|
```javascript
|
|||
|
add2AndSquare = compose( add2, square)
|
|||
|
```
|
|||
|
|
|||
|
Простая реализация компоновки будет заключаться в следующем:
|
|||
|
|
|||
|
```javascript
|
|||
|
compose = (f1, f2) => value => f2( f1(value) );
|
|||
|
```
|
|||
|
|
|||
|
Чтобы получить еще большую гибкость, мы можем использовать функцию reduceRight:
|
|||
|
|
|||
|
```javascript
|
|||
|
compose = (...fns) => (initialVal) => fns.reduceRight((val, fn) => fn(val), initialVal);
|
|||
|
```
|
|||
|
|
|||
|
Чтение композиции слева направо позволяет четко связывать функции более высокого порядка. В реальных примерах мира добавляются аутентификации, журналирование и свойства контекста. Это метод, который позволяет повторно использовать на самом высоком уровне. Вот несколько примеров использования:
|
|||
|
|
|||
|
```javascript
|
|||
|
// 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, используя компоненты более высокого порядка:
|
|||
|
|
|||
|
```javascript
|
|||
|
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);
|
|||
|
```
|
|||
|
|
|||
|
В заключение функциональный состав обеспечивает возможность повторного использования функциональности на очень высоком уровне. Если функции хорошо структурированы, это позволяет разработчикам создавать новое поведение на основе существующего поведения.
|
|||
|
|
|||
|
Это также повышает читаемость реализаций. Вместо функций вложенности вы можете очищать функции цепочки и создавать функции более высокого порядка со значимыми именами.
|