리팩터링 | 마틴 파울러 | 한빛미디어- 교보ebook

코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기, 20여 년 만에 다시 돌아온 마틴 파울러의 리팩터링 2판 리팩터링 1판은 1999년 출간되었으며, 한국어판은 2002년 한국에 소개되었다

ebook-product.kyobobook.co.kr

개요

표현식이 너무 복잡해서 이해하기 어려울 지역 변수를 활용하면 표현식을 쪼개 관리하기 쉽게 만들 있다.

 

이렇게 추가된 변수는 디버깅에도 도움된다. 디버거 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;
    }
}

이렇게 메서드로 추출해두면 객체를 데이터를 외부에서 쉽게 활용할 있다.

 

사용한 자동 리팩터링

주의 것은 메서드를 추출해주지 게터 메서드로 만들어 주지 않아 주의해야 한다.

 

+ Recent posts