개요

가변 데이터는 소프트웨어 문제를 일으키기 쉽다.

 

값을 쉽게 계산해낼 있는 변수들을 모두 제거한다.

계산 과정을 보여주는 코드 자체가 데이터의 의미를 분명히 드러내는 경우도 많다.

 

예외사항, 피연산자가 불변이라면 계산 결과도 일정하므로 그대로 두는 것도 좋다.

 

변형연산

데이터 구조를 감싸 데이터에 기초하여 계산한 결과를 속성으로 제공하는 객체

데이터 구조를 받아 다른 데이터 구조로 변환해 반환하는 함수

 

예시

class ProductionPlan{
    get production() {return this._production;}
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amount;
    }
}


class ProductionPlan{
    get production() {
        assert(this._production === this.calculatedProduction);
        return this._production;
    }
    get calculatedProduction(){
        return this._adjustments
            .reduce((sum, a)=>sum+a.amount,0);
    }
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amount;
    }
}


class ProductionPlan{
    get production() {
        //어셔선 실패하지 않으면 변경
        return this.calculatedProduction;
    }
    get calculatedProduction(){
        return this._adjustments
            .reduce((sum, a)=>sum+a.amount,0);
    }
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amount;
    }
}


class ProductionPlan{
    get production() {
        //인라인
        return this._adjustments
            .reduce((sum, a)=>sum+a.amount,0);
    }
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amount;
    }
}


class ProductionPlan{
    get production() {
        return this._adjustments
            .reduce((sum, a)=>sum+a.amount,0);
    }
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
    }
}

예시: 소스가 이상일

예시는 변경하려는 값에 영향을 주는 요소가 하나뿐이였다.

예시는 이상일



class ProductionPlan {
    constructor(production){
        this._production = production;
        this._adjustments = [];
    }
    get production(){return this._production;}
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amout;
    }
}


class ProductionPlan {
    constructor(production){
        this._initialProduction = production;
        this._productionAccumulator = 0;
        this._adjustments = [];
    }
    get production(){return this._initialProduction + this._productionAccumulator;}
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amout;
    }
}


class ProductionPlan {
    constructor(production){
        this._initialProduction = production;
        this._productionAccumulator = 0;
        this._adjustments = [];
    }
    get production(){
        assert(this._productionAccumulator === this.calculatedProductionAccumulator);
        return this._initialProduction + this._productionAccumulator;
    }
    get calculatedProductionAccumulator(){
        return this._adjustments
        .reduce((sum, a)=>sum+a.amount,0);
    }
    applyAdjustment(anAdjustment){
        this._adjustments.push(anAdjustment);
        this._production += anAdjustment.amout;
    }
}

 

+ Recent posts