킹의 개발일지
쏙쏙 들어오는 함수형 코딩 30일차 본문
30일차
<함수형 도구 체이닝>
이전 포스팅부터 지금까지 반복문을 함수형 도구 체인으로 리팩터링하는 방법을 알아봤다. 이제 함수형 코딩이 감이오기 시작한다! 이번 포스팅은 예제를 중심으로 다뤄보려한다.
예제1
다음 함수를 함수형 도구 체인으로 바꿔보자.
function shoesAndSocksInventory(products) {
var inventory = 0; // 1.누적
for (var p = 0; p < products.length; p++) { // 2.반복
var product = products[p];
if (product.type === "shoes" || product.type === "socks") { // 3.조건
inventory += product.numberInInventrory;
}
}
return inventory;
}
함수를 보면, 반복문을 돌면서 조건에 맞는 대상의 재고 개수를 모두 더해 반환한다.
주석을 보면서, 앞서 보왔던 함수형 도구들을 어떻게 사용할 수 있을까 코드로 보도록하자.
function shoesAndSocksInventory(products) {
const shoesAndSocks = filter(products, (product) => {
return product.type === "shoes" || product.type === "socks"
});
const inventroties = map(shoesAndSocks, (product) => product.numberInInventory));
return reduce(inventroties, 0, plus);
}
function plus(a, b) {
return a + b;
}
- filter를 통해서 신발과 양말을 골라낸다.
- map을 사용해서 양말과 신발의 재고 수 를 골라낸다.
- 이후 reduce를 통해서 재고수를 전부 더한다.
위 예시가 저자가 내놓은 답변이다. 하지만 왠지 더 제너럴하게 만들수 있을 것 같다. 신발, 양말 뿐만 아니라 다른 상품의 재고 갯수도 구할 수 있도록 말이다.
function sumInventory(products, ...types) {
const filteredProducts = filterProducts(products, (product) => {
return types.includes(product.type);
});
const inventories = map(filteredProducts, getProductInventories);
return reduce(inventories, plus, 0);
}
function filterProducts(products, f) {
return filter(products, f);
}
function getProductInventories(product) {
return product.numberInInventory;
}
function plus(a, b) {
return a + b;
}
- shoesAndSocksInventory 메서드를 sumInventory로 만들어 암묵적인 인자를 가변인자를 사용해서 명시적인 인자로 바꿔주었다.
- filter 메서드를 반환하는 고차함수를 만들어서 가변인자로 넘어온 상품 목록들을 체크하는 filterProducts 메서드로 변경해주었다. 이렇게 해줌으로써 더이상 shoes, socks만 필터링하지 않고 원하는 제품들을 필터링 할 수 있게 됐다.
- map함수에 들어가는 콜백에 이름을 부여해서 가독성을 높혔다.
이렇게 만든 메서드는 shoes, socks, hat, ... 등등 원하는 제품을 필터링 해서 재고수를 구할 수 있게 됐다.
저자가 만든 답에서 더 나아가 내가 원하는대로 바꿔봤는데,
체이닝 디버깅을 위한 팁
저자는 고차 함수를 사용하는 것은 매우 추상적이기에 디버깅하는데 어려움이 있을 수 있다고 했다. 나도 고차 함수에 대해서 알게 됐을 때 디버깅에 대해서 살짝 걱정했었다. 함수들의 향연을 따라가다보면 길을 잃어버릴 수 있다고 생각이 들었기 때문이다.
이에 저자는 팁을 주고 있는데,
- 구체적인 것을 유지하기
- 각 단계에서 어떤 것을 하고 있는지 알기 쉽게 이름을 잘 지어야 한다고 말한다.
- 출력해보기
- 길을 잃지 않게 각 단계사이에 print 구문을 넣어 코드를 돌려보면 이정표 처럼 길을 다시 찾을 수 있다고 한다.
오늘은 저자가 제시한 예제 문제를 저자가 제시한 답변에서 더 나아가 좀더 제너럴하게 만들어 보았다. 결과값은 같을 지어도 가독성, 효율성 등을 고려했을때 이런 리팩토링은 성장하는데 큰 도움을 주는것 같다.
앞으로도 내가 쓴 코드를 다시한번 보면서 리팩토링을 반복하며 함수형 코딩에 더 익숙해지고 싶다!
'독서 > 책너두 챌린지' 카테고리의 다른 글
| 쏙쏙 들어오는 함수형 코딩 32일차 (0) | 2023.09.14 |
|---|---|
| 쏙쏙 들어오는 함수형 코딩 31일차 (0) | 2023.09.13 |
| 쏙쏙 들어오는 함수형 코딩 29일차 (0) | 2023.09.09 |
| 쏙쏙 들어오는 함수형 코딩 28일차 (0) | 2023.09.08 |
| 쏙쏙 들어오는 함수형 코딩 (26 ~ 27일차) (0) | 2023.09.07 |