표현식이 너무 복잡해서 이해하기 어려울 때가 있다. 이럴 때 지역 변수를 활용하면 표현식을 쪼개 관리하기 더 쉽게 만들 수 있다. 그러면 복잡한 로직을 구성하는 단계마다 이름을 붙일 수 있어서코드의 목적을 훨씬 명확하게 드러낼 수 있다.
이 과정에서 추가한 변수는 디버깅에도 도움된다. 디버거에 중단점을 지정하거나 상태를 출력하는 문장을 추가할 수 있기 때문이다.
변수추출을 고려한다고 함은 표현식에 이름을 붙이고 싶다는 뜻이다. 이름을 붙이기로 했다면 그 이름이 들어갈 문맥도 살펴야 한다. 현재 함수 안에서만 의미가 있다면 변수로 추출하는 것이 좋다. 그러나 함수를 벗어난 넓은 문맥에서까지 의미가 된다면 그 넓은 범위에서 통용되는 이름을 생각해야 한다. 다시 말해 변수가 아닌 (주로) 함수로 추출해야 한다. 이름이 통용되는 문맥을 넓히면 다른 코드에서 사용할 수 있기 때문에 같은 표현식을 중복해서 작성하지 않아도 된다. 그래서 중복이 적으면서 의도가 잘 드러나는 코드를 작성할 수 있다.
이름이 통용되는 문맥을 넓힐 때 생기는 단점은 할 일이 늘어난다는 것이다. 많이 늘어날 것 같다면 임시 변수를 질의 함수로 바꾸기를 적용할 수 있을 때까지 일단 놔둔다. 간단히 처리할 수 있다면 즉시 넓혀서 다른 코드에서도 사용할 수 있게 한다. 가령 클래스 안의 코드를 다룰 때는 함수 추출하기를 아주 쉽게 적용할 수 있다.
function price(order) {
//price = 기본가격 - 수량할인 + 배송비
return order.quantity
* order.itemPrice -
Math.max(0, order.quantity - 500) * order.itemPrice * 0.05 +
Math.min(order.quantity * order. itemPrice * 0.1, 100);
function price(order) {
const basePrice = order.quantity * order.itemPrice;
const quantityDiscount = Math.max(0, order.quantity - 500) * order.itemPrice * 0.05;
const shipping = Math.min(order.quantity * order. itemPrice * 0.1, 100);
return basePrice - quantityDiscount + shipping;
}
마틴 파울러 저 리팩터링 2판