리팩터링 2판 10장 정리

Study리팩터링 2판스터디javascript

들어가며

본 게시글은 사내 스터디로 공부한 리팩터링 2판 (마틴 파울러) 10장을 정리 & 요약하는 글입니다.

매 챕터마다 돌아가며 설명을 했기 때문에, 본인이 정리한 일부 주제들만 정리했습니다. (나머지 내용은 추후 업데이트 예정)


Chapter 10. 조건부 로직 간소화


10.6 어서션 추가하기

Before

if (this.discountRate)
  base = base - (this.discountRate * base);

After

assert(this.discountRate >= 0)
if (this.discountRate) base = base - this.discountRate * base

배경

  • 특정 조건이 참일 때만 제대로 동작하는 가정이 코드에 항상 명시적으로 기술되어 있지는 않음
    • ex) 제곱근 계산은 입력이 양수일 때만 정상 동작
  • 이를 해결하기 위해, 어서션(assertion: 단언, 확언)을 이용해 코드 자체에 삽입하는 방법이 있음
    • console.assert() 메서드는 주어진 가정이 거짓인 경우 콘솔에 오류 메시지를 출력합니다. 참인 경우, 아무것도 하지 않습니다. 출처: MDN Web Docs
  • 어서션은 항상 참이라고 가정하는 조건부 문장으로 어서션이 실패했다는 건 프로그래머가 잘못했다는 뜻
  • 어서션이 있고 없고가 프로그램 기능의 정상 동작에 아무런 영향을 주지 않도록 작성되어야 함
  • 어서션은 오류 찾기 뿐만 아니라, 프로그램이 어떤 상태임을 가정한 채 실행되는지 다른 개발자에게 알려주는 좋은 소통 도구.
    • 단, 테스트 코드가 있다면 어서션의 디버깅 용도로서의 효용은 줄어든다

절차

  1. 참이라고 가정하는 조건이 보이면 그 조건을 명시하는 어서션을 추가

예시

// 고객이 상품 구입 시 할인율을 적용받는 코드

applyDiscount(aNumber) {
  return (this.discountRate)
    ? aNumber - (this.discountRate * aNumber)
    : aNumber;
}

  • 할인율은 항상 양수라는 가정이 깔려있다.
  • 3항 표현식에는 어서션을 넣을 장소가 적당치 않으니, if-then 문장으로 재구성
applyDiscount(aNumber) {
  if (!this.discountRate) return aNumber;
  else return aNumber - (this.discountRate * aNumber);
}

  • 그 다음, 간단히 어서션 추가
applyDiscount(aNumber) {
  if (!this.discountRate) return aNumber;
  else {
    assert(this.discountRate >= 0);
    return aNumber - (this.discountRate * aNumber);
  }
}

참고




Profile picture
@김하연
4년차 프론트엔드 개발자 입니다. 사용자 경험 개선, 코드의 재사용성, 읽기 쉬운 코드에 집중하여 개발합니다.
AboutGithub LinkedinResume
Loading script...