8-2. 필드 옮기기

적용 시점

  • 잘못된 데이터 구조로 프로그램 파악이 어려운 경우

절차

  1. 소스 필드가 캡슐화되어 있지 않다면 캡슐화한다.

  2. 테스트한다.

  3. 타깃 객체와 필드를 생성한다.

  4. 정적 검사를 수행한다.

  5. 소스 객체에서 타깃 객체를 참조할 수 있는지 확인한다.

  6. 접근자들이 타깃 필드를 사용하도록 수정한다.

  7. 테스트한다.

  8. 소스 필드를 제거한다.

  9. 테스트한다.

예시

❌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