이전글:
https://daunje0.tistory.com/175
마지막으로 조건만 다르고 중복된 함수들을 공통적으로 뽑아서 리팩토링 하는 방법으로 총정리를 하겠습니다
const products = [
{name: '반팔티', price: 15000},
{name: '긴팔티', price: 20000},
{name: '핸드폰케이스', price: 15000},
{name: '후드티', price: 30000},
{name: '바지', price: 25000}
];
const log = console.log
const add = (a, b) => a + b;
const go = (...args) => args.reduce((a, f) => f(a));
const pipe = (...fs) => (a) => go(a, ...fs);
const curry = f =>
(a, ..._) =>_.length ? f(a, ..._) : (..._) => f(a, ..._)
const filter = curry((f, iter) => iter.filter(f));
const map = curry((f, iter) => iter.map(f));
const reduce = curry((f, iter) => iter.reduce(f));
go(
products,
filter(p => p.price < 20000),
map(p => p.price),
reduce(add),
log
); // 30000
go(
products,
filter(p => p.price >= 20000),
map(p => p.price),
reduce(add),
log
); // 75000
위 처럼 가격이 1. 20000 미만 2. 20000 이상으로 조건만 다르고
map(p => p.price), reduce(add), log 세 함수의 중복을 리팩토링하려면 pipe 함수를 사용하면 됩니다
const totalPrice = pipe(
map(p => p.price),
reduce(add),
log
)
go(
products,
filter(p => p.price < 20000),
totalPrice
);
go(
products,
filter(p => p.price >= 20000),
totalPrice
);
그리고 고차함수의 특성을 다시 이용하면 더욱 간략하게 함수를 리팩토링할 수 있습니다.
const totalPrice = pipe(
map(p => p.price),
reduce(add),
log
)
const baseTotalPrice = (condition) => pipe(
filter(condition),
totalPrice
)
go(
products,
baseTotalPrice(p => p.price < 20000),
);
go(
products,
baseTotalPrice(p => p.price >= 20000),
);
참고 : 함수형 프로그래밍과 JavaScript ES6+ 유인동 님
https://www.inflearn.com/course/functional-es6