8-2. 필드 옮기기
적용 시점
잘못된 데이터 구조로 프로그램 파악이 어려운 경우
절차
소스 필드가 캡슐화되어 있지 않다면 캡슐화한다.
테스트한다.
타깃 객체와 필드를 생성한다.
정적 검사를 수행한다.
소스 객체에서 타깃 객체를 참조할 수 있는지 확인한다.
접근자들이 타깃 필드를 사용하도록 수정한다.
테스트한다.
소스 필드를 제거한다.
테스트한다.
예시
❌Before
class Customer {
constructor(name, discountRate) {
this._name = name;
this._discountRate = discountRate;
this._contract = new CustomerContract(dateToday());
}
get discountRate() { return this._discountRate; }
betcomPreferred() {
this.discountRate += 0.03;
...
}
applyDiscount(amount) {
return amount.subtract(amount.multiply(this._discountRate));
}
}
class CustomerContract {
constructor(startDate) {
this._startDate= startDate;
}
}
⭕After
class Customer {
constructor(name, discountRate) {
this._name = name;
this._setDiscountRate(discountRate);
this._contract = new CustomerContract(dateToday());
}
get discountRate() { return this._contract.discountRate; }
_setDiscountRate(aNumber) { this._contarct.discountRate = aNumber; }
betcomPreferred() {
this._setDiscountRate(this._discountRate(this._contract.discountRate + 0.03);
...
}
applyDiscount(amount) {
return amount.subtract(amount.multiply(this._contract.discountRate));
}
}
class CustomerContract {
constructor(startDate, discountRate) {
this._startDate= startDate;
this._discountRate = discountRate;
}
get discountRate() { return this._discountRate; }
set discountRate(arg) { this._discountRate = arg; }
}
Last updated