Writing Middleware —Composition and Currying Elegance in JavaScript
Javascript is an elegant and beautiful language which allows the developers to have the flexibility to move between the world of imperative…
medium.com
Function Composition & Pipe
Pipeline ( 컴퓨터 과학에서 파이프라인은 한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조를 가리킨다. )
function composition( 함수 작성? )은 한 함수의 결과를 다른 함수의 인풋으로 파이프라이닝하며 새로운 함수를 만드는 작업이다.
기본적으로 2개의 함수로 구성된다. A의 함수 결과는 B의 파라미터가 된다. 결국 B는 A에 따라 바뀌는 새로운 함수가 된다. 이러한 방식을 수학적으로 o 표시와 같다고 보면된다. f o g 이런거.
function composition을 코드로 보면 이렇다. 아래에는 2개의 함수를 받아 처리한다.
function compose(f, g) {
return function(a) {
return f( g(a) );
}
}
function add1(a){
return a+1;
}
function multiply5(a){
return a*5;
}
var add1Multiply5 = compose( add1,multiply5 );
console.log( add1Multiply5(6) ); //31
compose 함수의 인자 f, g는 둘 다 함수이다. 위의 코드를 보기 쉽게 하면 compose( add1( multiply5( a ) ) ); 이런 함수가 된다.
그러니까 compose 함수의 파라미터 값인 add1, multiply5 함수가 A함수이고 A함수의 리턴값이 곧 B함수인 compose의 파라미터 값이 된다.
그래서 새로운 함수인 add1multiply5 함수가 나왔다.
function composition 보다 더 친숙하게 느껴질 수 있는게 있다. ( 유닉스에 쓰인다고한다. ) Pipe이다.
pipe는 function composition과 개념은 비슷하지만 함수 파라미터로 배열을 받아 새로구성된 함수를 만든다. 코드를 보자.
///////////////////////////////// A ///////////////////////////////////
const pipe = function(fns) {
return function(item) {
return fns.reduce(
function(prev, fn){
return fn(prev);
}, item );
}
}
///////////////////////////////// B ///////////////////////////////////
const pipe = function([add1, multiply5]) {
return function(item) {
return [add1, multiply5].reduce( prev, fn ) {
return fn( prev ); ------> multiply5( add1( a ) );
}, item );
}
}
function add1(a) {
return a + 1;
}
function multiply5(a) {
return a * 5;
}
var add1multiply5 = pipe( [add1, multiply5] );
console.log( add1multiply5(6) ); //35
pipe 변수에 함수배열인 fns를 받는 익명함수를 만들었다.
위의 A라인을 풀어보면 B라인이 된다. 근데 보면 인자 item을 받은 곳이 없고 a를 집어 넣은 곳이 없다는 것을 알게 된다. 여기서 Currying 개념이 들어간다.
Currying
만약 수학적 함수가 하나의 파라미터만 받는다 해도, 만들어진 함수 그 이상의 파라미터를 받을 수는 없을까 ?. 커링의 개념은 이 생각의 자연스러운 확장이다.
커링은 여러개의 인자를 가진 함수를 호출 할 경우, 파라미터의 수보다 적은 수의 파라미터를 인자로 받으면 누락된 파라미터를 인자로 받는 기법을 말한다.
function curriedAdd(a){
return function(b){
return a+b;
}
}
curriedAdd(1)(2); //3
--------------------------------------
var add = curriedAdd(1);
add(2); // 3
위에서 인자 a를 받는 curriedAdd함수는 인자 b를 받고 a와 b를 더하는 익명함수를 리턴한다. curriedAdd는 a를 받고 b를 받는 걸 기다린다.
위에처럼 쓰기도 하고 밑에 처럼 쓰기도 한다. 커링은 함수의 다양한 타입을 만드는 유연성을 갖고 있다.
커링은 인자의 순서가 매우 중요하다. 앞에 있는 인자일 수록 변동가능성이 적지만, 뒤에로 갈 수록 변동 가능성이 높아 인자 순서를 고려해서 설계 해야한다.
'Language > JavaScript' 카테고리의 다른 글
Design Pattern - Prototype Design Pattern (0) | 2019.11.17 |
---|---|
Design Pattern - Module Design (0) | 2019.11.15 |
#31 Design Patterns [33 Concepts Every JavaScript Developer Should Know ] (0) | 2019.11.05 |
JS 알고리즘 참조 사이트 (0) | 2019.11.02 |
#27 Data Structures [33 Concepts Every JavaScript Developer Should Know ] (0) | 2019.11.01 |