킹의 개발일지

쏙쏙 들어오는 함수형 코딩 30일차 본문

독서/책너두 챌린지

쏙쏙 들어오는 함수형 코딩 30일차

k1ng 2023. 9. 11. 17:55

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;
}
  1. filter를 통해서 신발과 양말을 골라낸다.
  2. map을 사용해서 양말과 신발의 재고 수 를 골라낸다.
  3. 이후 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;
}

 

  1. shoesAndSocksInventory 메서드를 sumInventory로 만들어 암묵적인 인자를 가변인자를 사용해서 명시적인 인자로 바꿔주었다.
  2. filter 메서드를 반환하는 고차함수를 만들어서 가변인자로 넘어온 상품 목록들을 체크하는 filterProducts 메서드로 변경해주었다. 이렇게 해줌으로써 더이상 shoes, socks만 필터링하지 않고 원하는 제품들을 필터링 할 수 있게 됐다.
  3. map함수에 들어가는 콜백에 이름을 부여해서 가독성을 높혔다.

이렇게 만든 메서드는 shoes, socks, hat, ... 등등 원하는 제품을 필터링 해서 재고수를 구할 수 있게 됐다.

저자가 만든 답에서 더 나아가 내가 원하는대로 바꿔봤는데, 


체이닝 디버깅을 위한 팁

저자는 고차 함수를 사용하는 것은 매우 추상적이기에 디버깅하는데 어려움이 있을 수 있다고 했다. 나도 고차 함수에 대해서 알게 됐을 때 디버깅에 대해서 살짝 걱정했었다. 함수들의 향연을 따라가다보면 길을 잃어버릴 수 있다고 생각이 들었기 때문이다.

 

이에 저자는 팁을 주고 있는데,

  1. 구체적인 것을 유지하기
    1. 각 단계에서 어떤 것을 하고 있는지 알기 쉽게 이름을 잘 지어야 한다고 말한다.
  2. 출력해보기
    1. 길을 잃지 않게 각 단계사이에 print 구문을 넣어 코드를 돌려보면 이정표 처럼 길을 다시 찾을 수 있다고 한다.

오늘은 저자가 제시한 예제 문제를 저자가 제시한 답변에서 더 나아가 좀더 제너럴하게 만들어 보았다. 결과값은 같을 지어도 가독성, 효율성 등을 고려했을때 이런 리팩토링은 성장하는데 큰 도움을 주는것 같다. 

 

앞으로도 내가 쓴 코드를 다시한번 보면서 리팩토링을 반복하며 함수형 코딩에 더 익숙해지고 싶다!