노트

임시 변수를 질의 함수로 바꾸기

Replace Temp with Query

설계#refactoring · 연결된 개념 6개

쉽게 말하면

임시 변수를 질의 함수로 바꾸기는 계산 결과를 포스트잇에 적어 들고 다니는 대신, 물어보면 언제든 답해 주는 계산기를 두는 거예요. 포스트잇을 넘겨줄 필요가 없으니 긴 함수를 쪼개기도 쉬워져요.

비유가 깨지는 곳 계산기가 물을 때마다 다른 답을 주면 안 돼요. 다시 계산해도 같은 결과여야 하고 부수 효과가 없어야 해요. 매번 계산하는 비용은 대부분 무시해도 되고, 문제가 되면 측정 뒤 캐시해요.

계산 결과를 담아 두던 임시 변수를 그 값을 돌려주는 함수로 바꾸는 리팩터링. 긴 함수를 쪼개기 전 단계로 특히 쓸모 있다.

// 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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 함수 선언 바꾸기

    함수의 이름이나 매개변수 목록을 바꾸는 리팩터링. 가장 자주 쓰는 리팩터링이 이름 바꾸기인 것은, 이름이 코드를 명료하게 하는 가장 큰 도구이기 때문이다.

  • 반복문을 파이프라인으로 바꾸기

    for 반복문을 filter·map·reduce 같은 컬렉션 연산의 연쇄, 즉 컬렉션 파이프라인(Collection Pipeline)으로 바꾸는 리팩터링. 각 원소가 어떤 단계를 거치는지가 위에서 아래로 읽힌다.

  • 플래그 인수

    호출하는 쪽이 함수 안에서 실행할 로직을 고르려고 넘기는 인수. 호출문만 봐서는 무슨 뜻인지 알기 어렵고, 함수가 어떤 기능들을 제공하는지도 숨긴다.

  • 매개변수 객체 만들기

    여러 함수에 늘 함께 넘겨지는 값 묶음(데이터 뭉치, Data Clumps)을 하나의 객체로 묶어 넘기는 리팩터링.

  • 함수·필드 옮기기

    함수나 필드를 더 자연스러운 맥락(모듈·클래스)으로 옮기는 리팩터링. 좋은 설계의 핵심인 모듈성(Modularity), 즉 어딘가를 고칠 때 관련된 작은 부분만 이해하면 되게 하는 능력을 키운다.

보기 옵션