pipe 기본

Taek·2020년 6월 14일
2

함수형 프로그래밍 pipe 함수에 대한 기초

pipe 함수는 복잡한 로직을 숨기고 비지니스 로직을 사고의 흐름대로 파악 하기 용이하다.

const str = "      안녕하세요      ";

문자열 str이 주어졌을 때 해당 문자열에 대해

  1. 양옆 공백을 없앤다.
  2. 배열화한다.
  3. 결과를 콘솔창에 프린트 한다.

라는 시나리오를 코드로 작성 한다면

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);

0개의 댓글