본문 바로가기
JavaScript│Node js

마틴 파울러 리팩토링 Replace temp with Query

by 자유코딩 2019. 12. 24.

아래 코드를

availableVacation(anEmployee, anEmployee.grade);
function availableVacation(anEmployee, grade) {
    // calculate vacation
}

아래 코드로 바꿉니다.

availableVacation(anEmployee);
function availableVacation(anEmployee) {
    const grade = anEmployee.grade;
    // calculate vacation...
}

함수의 파라미터 목록은 요약 될 필요가 있습니다.

 

모든 코드가 그렇겠지만 내용이 중복되는 것을 피해야 합니다.

 

당연하겠지만 파라미터 목록이 짧으면 이해하기 더 쉽습니다.

 

파라미터를 없애기 가장 좋은 경우는 위의 예제처럼 같은 오브젝트 안에 들어있는 변수가 파라미터로 전달 될 때입니다.

 

Mechanics

1. 필요하다면 extract function을 적용합니다.

2. 함수 내부에서 참조를 파라미터로 교체한다. 모든 변경사항에 대해서 테스트합니다.

3.함수의 파타미터를 제거합니다.

 

Mechanics 2번은 const grade = anEmployye.grade 처럼 참조해서 접근 한 값을 변수로 할당합니다.

 

예제 코드를 살펴봅니다.

class Order {
    get finalPrice() {
        const basePrice = this.quantity * this.itemPrice;
        let discountLevel;
        if (this.quantity > 100) discountLevel = 2;
        else discountLevel = 1;
        return this.discountedPrice(basePrice, discountLevel);
    }

    discountedPrice(basePrice, discountLevel) {
        switch (discountLevel) {
            case 1: return basePrice * 0.95;
            case 2: return basePrice * 0.9;
        }
    }
}

이 코드를 아래 코드로 먼저 바꿉니다.

class Order {
    get finalPrice() {
        const basePrice = this.quantity * this.itemPrice;
        return this.discountedPrice(basePrice, this.discountLevel);
    }

    get discountLevel() {
        return (this.quantity > 100) ? 2 : 1;
    }
    discountedPrice(basePrice, discountLevel) {
        switch (discountLevel) {
            case 1: return basePrice * 0.95;
            case 2: return basePrice * 0.9;
        }
    }
}

그리고 아래 코드로 바꿉니다.

class Order {
    get finalPrice() {
        const basePrice = this.quantity * this.itemPrice;
        return this.discountedPrice(basePrice);
    }
    discountedPrice(basePrice) {
        switch (this.discountLevel) {
            case 1: return basePrice * 0.95;
            case 2: return basePrice * 0.9;
        }
    }
}

discountedPrice의 파라미터를 줄입니다.

switch 에서 this 로 접근해서 사용합니다.

 

댓글