개요
가변 데이터는 소프트웨어 문제를 일으키기 쉽다.
값을 쉽게 계산해낼 수 있는 변수들을 모두 제거한다.
계산 과정을 보여주는 코드 자체가 데이터의 의미를 더 분명히 드러내는 경우도 많다.
예외사항, 피연산자가 불변이라면 계산 결과도 일정하므로 그대로 두는 것도 좋다.
변형연산
데이터 구조를 감싸 그 데이터에 기초하여 계산한 결과를 속성으로 제공하는 객체
데이터 구조를 받아 다른 데이터 구조로 변환해 반환하는 함수
예시
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; } } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
09 - 데이터 조직화 - 참조를 값으로 바꾸기 (0) | 2023.09.01 |
---|---|
09 - 데이터 조직화 - 파생 변수를 질의 함수로 바꾸기 (0) | 2023.08.27 |
09 - 데이터 조직화 - 필드 이름 바꾸기 (0) | 2023.08.19 |
09 - 데이터 조직화 - 변수 쪼개기 (0) | 2023.08.14 |
08 - 기능이동 - 죽은 코드 제거하기 (0) | 2023.08.13 |