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이 나왔습니다.
처음에는,
"처음 함수에서 실행된 값이 두번째 함수 인자로 가라!"
라는 마음으로 functions[0](num)
자체를 reduce함수의 초기 initialValue로 줬는데, 저의 바램과는 다르게, 초기 initialValue는 첫번째 함수의 인자로 들어가서, 결국 첫번째 함수를 실행한 결과를 다시 첫번째함수 인자로 주게 되므로, 위 함수와는 맞지 아니하여, initialValue로 num을 주어 해결하였습니다.
함수를 더 짧게 만들 수 있었고, reduce의 정확한 사용법을 알게 되어 좋았습니다.
내친김에 실행속도 테스트도 해봤습니다.
원래방식 : 대략 0.0729ms
reduce를 이용한 방식 : 대략 0.0703ms
미세하게 reduce를 이용한 방식이 빠른데, 과연 이 속도차이가 정말 효용성이 있는 것인지,
함수의 내용이 커지면 과연 for문으로 작성하는 것과, reduce의 차이가 더 날지 아직은 잘모르겠습니다. 하지만 함수를 전역변수가 아닌 로컬 스코프에 가두면 실행속도가 더 빨라진다고 하는데 이런것들도 유의해서 작성해보면 함수실행 속도만 놓고 봤을 때 성능이 더 향상되지 않을까 생각해 봅니다.
감사합니다!