개요

명령 객체는 복잡한 연산을 다룰 있는 강력한 메커니즘을 제공한다.

연산을 하나를 여러 작은 메서드로 쪼갠다. 로컬 변수를 인스턴스 변수로 만들어 메서드 끼리 정보 공유할 수도 있다. 쪼게진 보조 메서드들은 좋은 디버깅 포인트가 된다.

 

다만, 복잡하지 않은 함수에 굳이 명령 사용하면 득보다 실이 크다.

 

예시



class ChargeCalculator{
    constructor(customer, usage, provider){
        this._customer = customer;
        this._usage = usage;
        this._provider = provider;
    }
    get baseCharge(){
        return this._customer.baseRate * this._usage;
    }
    get charge(){
        return this.baseCharge + this._provider.connectionCharge;
    }
}
//호출자...
const monthCharge = new ChargeCalculator(customer, usage, provider).charge;


//클래스를 생성하고 호출하는 함수 만들기
function charge(customer, usage, provider){
    return new ChargeCalculator(customer, usage, provider).charge;
}


class ChargeCalculator{
    constructor(customer, usage, provider){
        this._customer = customer;
        this._usage = usage;
        this._provider = provider;
    }
    get baseCharge(){
        return this._customer.baseRate * this._usage;
    }
    //보조함수 제거하기,먼저 로컬 변수로 추출
    get charge(){
        const baseCharge = this.baseCharge;
        return baseCharge + this._provider.connectionCharge;
    }
}


class ChargeCalculator{
    constructor(customer, usage, provider){
        this._customer = customer;
        this._usage = usage;
        this._provider = provider;
    }
    //보조함수 제거하기, 보조 함수 인라인 하기
    get charge(){
        const baseCharge = this._customer.baseRate * this._usage;
        return baseCharge + this._provider.connectionCharge;
    }
}


function charge(customer, usage, provider){
    return new ChargeCalculator(customer, usage, provider)
        .charge(customer, usage, provider);
}
class ChargeCalculator{
    constructor(customer, usage, provider){
        this._customer = customer;
        this._usage = usage;
        this._provider = provider;
    }
    //함수로 변경하기 위에 함수 포맷에 맞게 함수 선언 바꾸기 적용
    charge(customer, usage, provider){
        const baseCharge = this._customer.baseRate * this._usage;
        return baseCharge + this._provider.connectionCharge;
    }
}


function charge(customer, usage, provider){
    return new ChargeCalculator(usage, provider)
        .charge(customer, usage, provider);
}
class ChargeCalculator{
    constructor(usage, provider){
        this._usage = usage;
        this._provider = provider;
    }
    //인스턴스 변수를 하나씩 점진적으로 제거하면서 매개변수를 사용하도록 수정
    charge(customer, usage, provider){
        const baseCharge = customer.baseRate * this._usage;
        return baseCharge + this._provider.connectionCharge;
    }
}


function charge(customer, usage, provider){
    return new ChargeCalculator()
        .charge(customer, usage, provider);
}
class ChargeCalculator{
    //나머지도 하나씩 적용하면서 테스트
    charge(customer, usage, provider){
        const baseCharge = customer.baseRate * usage;
        return baseCharge + provider.connectionCharge;
    }
}
function charge(customer, usage, provider){
    const baseCharge = customer.baseRate * usage;
    return baseCharge + provider.connectionCharge;
}
//호출자...
const monthCharge = new ChargeCalculator(customer, usage, provider).charge;

 

 

 

+ Recent posts