특정 조건이 참일 때만 제대로 동작하는 코드 영역이 있을 수 있음. 어서션을 이용하면, 코드 자체에 필요한 가정을 항상 명시적으로 기술할 수 있음
어서션은 항상 참이라고 가정하는 조건부 문장으로, 어서션이 실패했다는 건 프로그래머가 잘못했다는 뜻. 어서션은 오류 찾기에 활용될 뿐 아니라, 프로그램이 어떤 상태임을 가정한 채 실행되는지를 다른 개발자에게 알려주는 훌륭한 소통 도구
절차
참이라고 가정하는 조건이 보이면 그 조건을 명시하는 어서션을 추가
예시
// 이 코드에는 할인율이 항상 양수라는 가정이 깔려 있음classCustomer{applyDiscount(aNumber){returnthis.discountRate ? aNumber -this.discountRate * aNumber : aNumber;}}
// 이런 어서션은 오류의 출처를 특정하기 어려울 때 도움이 됨classCustomer{applyDiscount(aNumber){if(!this.discountRate)return aNumber;else{assert(this.discountRate >=0);return aNumber -this.discountRate * aNumber;}}setdiscountRate(aNumber){assert(null=== aNumber || aNumber >=0);this._discountRate = aNumber;}}
10.7 제어 플래그를 탈출문으로 바꾸기
제어 플래그란 코드의 동작을 변경하는 데 사용되는 변수를 말하며, 어딘가에서 값을 계산해 제어 플래그에 설정한 후 다른 어딘가의 조건문에서 검사하는 형태로 쓰임
제어 플래그는 리팩터링으로 충분히 간소화할 수 있음. 제어 플래그의 주 서식지는 반복문 안으로, 주로 return, break, continue와 함께 사용
절차
제어 플래그를 사용하는 코드를 함수로 추출할지 고려 함
제어 플래그를 갱신하는 코드 각각을 적절한 제어문으로 바꿈. 하나 바꿀 때마다 테스트함
모두 수정했다면 제어 플래그를 제거
예시
// beforelet found =false;for(const p of people){if(!found){if(p ==='해적'){sendAlert();
found =true;}if(p ==='해병'){sendAlert();
found =true;}}}
// aftercheckForMiscreants(people);functioncheckForMiscreants(people){for(const p of people){if(p ==='해적'){sendAlert();return;}if(p ==='해병'){sendAlert();return;}}}