pipe 함수는 복잡한 로직을 숨기고 비지니스 로직을 사고의 흐름대로 파악 하기 용이하다.
const str = " 안녕하세요 ";
문자열 str이 주어졌을 때 해당 문자열에 대해
라는 시나리오를 코드로 작성 한다면
const result = str.trim().split("")
console.log(result);
예시는 복잡하지 않은 시나리오이기 때문에 메서드 체이닝으로도 쉽게 구현할 수 있다.
하지만 내부 로직이 복잡해지고 시나리오 구성이 추가되거나 바뀐다면 코드 수정이 어려울 것이다.
이 코드를 pipe 함수를 이용해 리팩토링하면
const pipe = (...functions) => args =>
functions.reduce((arg, nextFn) => nextFn(arg), args);
const strTrim = str => str.trim();
const strSplit = str => str.split("");
const resultPrint = result => console.log(result);
pipe(
strTrim,
strSplit,
resultPrint
)(str);
당장 코드가 길어지고 작은 함수를 여러개 작성해야 해서 비효율적으로 보일 수 있으나, 로직의 변경이나 시나리오 수정에 유연하게 대처할 수 있다.
그리고 다른 기능의 작은 함수를 만들어 레고를 조립하듯 코드를 작성할 수 있는 점이 좋아보이며, 테스트 코드를 작성할 때 이점으로 작용 할 것 같다.
+ 추가
중간에 인자를 추가 전달 하고 싶다면, 커링 기법을 활용한 함수인 bind를 사용한다.
const pipe = (...functions) => args =>
functions.reduce((arg, nextFn) => nextFn(arg), args);
const strTrim = str => str.trim();
const strSplit = (s, str) => str.split(s);
const strSplitBind = strSplit.bind(null, "");
const resultPrint = result => console.log(result);
pipe(
strTrim,
strSplitBind,
resultPrint
)(str);