JCS - 유연한 함수를 만들어라

본 글은 자바스크립트 코딩의 기술을 보고 필요한 부분만 정리되어있으며 제 생각이 적혀있어 정확하지 않을 수도 있습니다.(피드백 주세요:-)) 초기 20년 6월 4일에 작성되었으며 블로그를 이전하면서 제 생각을 추가하여 재작성하고 있습니다.

유연한 함수를 만들어라

테스트하기 쉬운 함수를 작성하라

  • 코드에 테스트를 작성하느라 골치를 썩이기보다는 테스트할 수 있는 코드를 작성하는 것에 집중해야한다.
  • 외부 함수를 불러올 때, 복잡도가 올라갈 수 있음

    • 외부 함수가 네트워크 접근이라던지, 외부 서비스에 접근 가능하기 때문
    • 그래서 모의 객체(mock)을 생성해서 함수를 가로채고 명시적인 반환값을 설정하게 만들어야함
  • 스텁을 사용할 때의 장점

    • 어떤 종류든 외부 의존성을 걱정할 필요가 없어짐
  • 테스트 코드에 스파이, 모의 객체, 스텁이 많아지면 코드가 복잡하고 강하게 결합되어있다는 증거임

    • 그래서 이걸 보고 코드를 뭐같이 만들었구나라고 생각할 수 있음
  • 함수 안에 다른 함수를 호출 한다고 할 때, 내부 함수에 인자를 넘겨줘서 코드의 결합을 제거할 수 있음

    • 완벽하게 해결하진 못하지만, 그 내부 함수에 대한 테스트 코드를 작성하면 될 듯(문제를 다른 함수에게 옮기는 효과)

스텁

외부 코드를 덮어 써서 명시적인 결과를 반환함

내부 논리를 모두 제거하고 결과만 선언함

모의 객체

원본 객체를 대체해 호출, 원본 객체가 수신할 메시지와 호출할 메서드를 바탕으로 단언문을 작성함

스텁과 모의 객체 차이

스텁은 결과값만 반환하는 것을 보면 될 것 같고, 모의 객체를 사용할 때는 코드를 호출하기 전에 기댓값을 설정 할 수 있다는 점과 입력 값을 또 따로 받아서 그걸 가지고 모의 객체를 만들어서 사용할 수도 있음

화살표 함수로 복잡도를 낮춰라

  • 해체 할당으로 화살표 함수에 파라미터로 넘길 때 소괄호 주의할 것
  • 리턴할 때도 객체를 반환하는지 함수를 여는 것인지 주의해야함

고차함수

  • 고차함수는 그저 다른 함수를 반환하는 함수일 뿐!
  • 매개변수를 가두는데 사용 할 수 있음

고차함수는 언제 사용할까요?

부분 적용 함수로 단일 책임 매개변수를 관리하라

고차함수와 관련있음

만약 매개변수가 3개인 함수가 있고, 2개는 동일하게 쓰는 상황이라면, 고차함수로 빼볼 생각도 좋음

부분 적용 함수를 이용하면, 한 번에 전달해야 할 함수 인수의 수가 줄어듬

다음과 같은 경우 - item이 동일하다고 보일 때

  fn(item, item2);
  fn(item, item3);

  const base = fn(item);
  const first = base(item2);
  const second = base(item3);

나머지 매개변수를 활용하기

  const fn = (...arg1) => (...arg2) => {
    return [...arg1, ...arg2];
  }
  fb('a','b')('c','d');

커링과 배열 메서드를 조합한 부분 적용 함수를 사용하라

한 번에 인수를 하나만 받는 함수를 커링이라고 한다.

커링과 부분적용함수와 차이점은 인수를 몇개 받느냐 차이, 그래서 차이점이 뭔데?

부분 적용 함수는 매개변수를 여러 번 받을 수 있음

함수를 단순하게 만들어줌(예제를 보니 책임을 분리하는 부분이 좋음)

화살표 함수로 문맥 혼동을 피하라

화살표 함수를 이용하여 this 바인딩을 새로 만들지 않도록 하기

화살표 함수는 이미 문맥이 있고 다른 함수 내부에서 이 함수를 사용하려고 할 때 유용함

this를 객체 안의 메서드에서 사용한다면 주의할 필요가 있음

객체 안의 프로퍼티로 화살표 함수로 작성한 경우에는 this가 전역을 바라보니 주의해야함


@kwonmory
성장을 위해 노력하고 있는 모리입니다.

깃허브