function pipeLine() {
  // 함수를 같이 작성 해 보아요. 
}

pipeLine 함수의 인자로, 아래의 함수들이(정수를 인자로 받는 함수) 임의로 들어올 때,
인자로 받은 함수들을 순서대로 실행하여 리턴된 값을 다음 함수로 전달, 또 거기서 리턴된 값을 다음 함수로 전달해서 최종 리턴값을 리턴하는 함수를 리턴해야 할 때,

즉,

function (func1, func2, func3) {
  return func3(func2(func1(num)))
}

을 해야 할때, 다만 인자로 함수가 몇개가 들어올지 모를 때.

인자로 받을 함수들...

function squareIt(num) {
  return num * num;
}

function add3(num) {
  return num + 5;
}

function multiple3(num) {
  return num * 3;
}

function isEven(num) {
  return num % 2 === 0;
}

나의 첫번째 코드는 이랬습니다.

function pipeLine(...functions) {
 return function (num) {
    let result = num;
    for (let i = 0; i < functions.length; i++) {
      result = functions[i](result);
    }
    return result;
  }
}

먼저, 함수가 몇개가 들어올지 모르니 Rest Parameter를 써서 작성했고, 리턴되는 함수안에 result라는 변수에 처음에는 입력받은 num을 할당, 반복문이 실행될 때 부터는 처음 num을 가지고 함수를 실행한 리턴값이 result변수에 담기게 하여 작성하였습니다..

실행 장면

먼저 (3 * 3) => 9, 9 x 3 => 27, 27 + 3 => 30

해서 30이 나왔습니다.

나의 reduce를 이용한 방법

처음에는,

"처음 함수에서 실행된 값이 두번째 함수 인자로 가라!"

라는 마음으로 functions[0](num)자체를 reduce함수의 초기 initialValue로 줬는데, 저의 바램과는 다르게, 초기 initialValue는 첫번째 함수의 인자로 들어가서, 결국 첫번째 함수를 실행한 결과를 다시 첫번째함수 인자로 주게 되므로, 위 함수와는 맞지 아니하여, initialValue로 num을 주어 해결하였습니다.

함수를 더 짧게 만들 수 있었고, reduce의 정확한 사용법을 알게 되어 좋았습니다.

내친김에 실행속도 테스트도 해봤습니다.

원래방식 : 대략 0.0729ms

reduce를 이용한 방식 : 대략 0.0703ms

미세하게 reduce를 이용한 방식이 빠른데, 과연 이 속도차이가 정말 효용성이 있는 것인지,
함수의 내용이 커지면 과연 for문으로 작성하는 것과, reduce의 차이가 더 날지 아직은 잘모르겠습니다. 하지만 함수를 전역변수가 아닌 로컬 스코프에 가두면 실행속도가 더 빨라진다고 하는데 이런것들도 유의해서 작성해보면 함수실행 속도만 놓고 봤을 때 성능이 더 향상되지 않을까 생각해 봅니다.

감사합니다!

profile
한 줌의 소금과 같이 되고 싶은 개발자

0개의 댓글