복잡한 표현식의 일부에 이름을 붙여 지역 변수로 빼는 리팩터링. 변수를 추출하고 싶다는 건 그 표현식에 이름을 붙이고 싶다는 뜻이다.
// before
return order.qty * order.price - Math.max(0, order.qty - 500) * order.price * 0.05
+ Math.min(order.qty * order.price * 0.1, 100)
// after
const basePrice = order.qty * order.price
const quantityDiscount = Math.max(0, order.qty - 500) * order.price * 0.05
const shipping = Math.min(basePrice * 0.1, 100)
return basePrice - quantityDiscount + shipping- 이름이 함수 밖에서도 의미 있다면 변수 대신 함수로 뽑는다(함수 추출하기, 임시 변수를 질의 함수로 바꾸기)
- 반대로 이름이 원래 표현식과 다를 바 없거나 주변 리팩터링에 방해가 되면 변수를 인라인한다(Inline Variable)
- 켄트 벡은 같은 정리를 Explaining Variables(한국어판 "설명하는 변수")라고 부르고, 숫자 리터럴에 이름을 붙이는 설명 상수와 나란히 둔다
- 설명 변수를 만들고 나면 같은 내용을 말하던 주석은 지울 수 있다
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Extract Variable · Refactoring.Guru: Extract Variable · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)