계산 결과를 담아 두던 임시 변수를 그 값을 돌려주는 함수로 바꾸는 리팩터링. 긴 함수를 쪼개기 전 단계로 특히 쓸모 있다.
// before
const basePrice = this.quantity * this.itemPrice
return basePrice > 1000 ? basePrice * 0.95 : basePrice * 0.98
// after
get basePrice() { return this.quantity * this.itemPrice }
// ...
return this.basePrice > 1000 ? this.basePrice * 0.95 : this.basePrice * 0.98- 지역 변수가 줄면 함수 추출 때 넘겨야 할 인자가 줄고, 함수 사이 경계가 분명해진다
- 같은 계산이 필요한 다른 함수도 재사용할 수 있어 중복이 준다
- 클래스 안에서 효과가 가장 크다. 클래스가 추출한 메서드들의 공유 맥락이 되기 때문이다
- 조건: 값을 한 번만 계산하고 이후에는 읽기만 해야 하며, 나중에 다시 계산해도 같은 결과여야 한다. 즉 질의 함수는 부수 효과가 없어야 한다
성능이 걱정될 수 있지만 대부분 무시해도 될 수준이다. 실제로 문제가 되면 측정한 뒤 캐시한다(섣부른 최적화). 구성요소 줄이기의 "재사용되지 않는 지역 변수 줄이기"와 같은 방향이다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Replace Temp with Query · Refactoring.Guru: Replace Temp with Query