개요
표현식이 너무 복잡해서 이해하기 어려울 때 지역 변수를 활용하면 표현식을 쪼개 관리하기 더 쉽게 만들 수 있다.
이렇게 추가된 변수는 디버깅에도 도움된다. 디버거 breakpoint로 활용할 수 있기 때문이다.
추출된 변수에 이름을 붙일 때 그 변수의 문맥을 고려해야한다. 함수 내에서만 의미있다면, 변수로 추출한다. 함수 외부까지 의미가 있다면, 함수로 추출해야 한다.
예시
//기본형 function price(order){ 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; //가격 = 기본 가격 = 수량 할인 + 배송비 return basePrice - 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; //똑같은 표현식 부분 치환 return basePrice - Math.max(0, order.quantity - 500) * order.itemPrice * 0.05 + Math.min(basePrice * 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(basePrice * 0.1, 100); return basePrice - quantityDiscount + shipping; } |
사용한 자동 리팩터링
예시: 클래스 안에서
추출하는 대상이 price()메서드 범위를 넘어 Order 클래스 전체에 영향을 미친다. 이럴 때 변수가 아닌 메서드로 추출한다.
//기본형 class Order { constructor(aRecord){ this._data = aRecord; } get quantity() {return this._data.quantity;} get itemPrice() {return this._data.itemPrice;} get price(){ return this.quantity * this.itemPrice - Math.max(0, this.quantity - 500) * this.itemPrice * 0.05 + Math.min(this.quantity * this.itemPrice * 0.1, 100); } } |
//리팩터링 class Order { constructor(aRecord){ this._data = aRecord; } get quantity() {return this._data.quantity;} get itemPrice() {return this._data.itemPrice;} get price(){ return this.basePrice - this.quantityDiscount + this.shipping; } get shipping() { return Math.min(this.basePrice * 0.1, 100); } get quantityDiscount() { return Math.max(0, this.quantity - 500) * this.itemPrice * 0.05; } get basePrice() { return this.quantity * this.itemPrice; } } |
이렇게 메서드로 추출해두면 이 객체를 데이터를 외부에서 쉽게 활용할 수 있다.
사용한 자동 리팩터링
주의 할 것은 메서드를 추출해주지 게터 메서드로 만들어 주지 않아 주의해야 한다.
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
06 - 기본적인 리펙터링 - 함수 선언 바꾸기 (0) | 2023.07.18 |
---|---|
06 - 기본적인 리펙터링 - 변수 인라인하기 (0) | 2023.07.17 |
06 - 기본적인 리펙터링 - 함수 인라인하기 (0) | 2023.07.15 |
06 - 기본적인 리팩터링 - 함수 추출하기 (0) | 2023.07.14 |
04 - 테스트 구축하기 (1) | 2023.07.12 |