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);  | |||
|  | ``` | |||
|  | 
 | |||
|  | В заключение функциональный состав обеспечивает возможность повторного использования функциональности на очень высоком уровне. Если функции хорошо структурированы, это позволяет разработчикам создавать новое поведение на основе существующего поведения. | |||
|  | 
 | |||
|  | Это также повышает читаемость реализаций. Вместо функций вложенности вы можете очищать функции цепочки и создавать функции более высокого порядка со значимыми именами. |