초기화 로직 분리
2023. 12. 4. 17:17ㆍ객체지향
결제 서비스에서 신규 가입 때, 무료로 포인트를 제공한다.
다음 코드는 그러한 기프트 포인트를 값 객체로 설계한 것이다.
const MIN_POINT = 0;
class GiftPoint {
#value;
constructor(point) {
if (point < MIN_POINT) {
throw new Error('유효하지 않은 값입니다.');
}
this.#value = point;
}
getPoint() {
return this.#value;
}
add(otherGiftPoint) {
return new GiftPoint(this.#value + otherGiftPoint.getPoint());
}
#isEnough(consumptionPoint) {
return consumptionPoint.getPoint() <= this.#value;
}
consume(consumptionPoint) {
if (!this.#isEnough(consumptionPoint)) {
throw new Error('포인트가 부족합니다.');
}
return new GiftPoint(this.#value - consumptionPoint.getPoint());
}
}
표준 회원으로 가입했을 경우와 프리미엄 회원으로 가입했을 경우 부여하는 포인트가 다르다고 하자.
const standardMembershipPoint = new GiftPoint(3000);
const premiumMembershipPoint = new GiftPoint(10_000);
생성자를 통한 초기화 로직이 이곳저곳에서 분산되기 때문에 유지보수에 어려움을 겪을 수 있다.
그리고 클래스를 사용하는 쪽에서 표준 회원으로 가입하는 것인지 프리미엄 회원으로 가입하는 것인지 파악하기 힘들다.
🧹팩토리 메서드를 사용해 목적에 따라 초기화하기
const MIN_POINT = 0;
const STANDARD_MEMBERSHIP_POINT = 3000;
const PREMIUM_MEMBERSHIP_POINT = 10_000;
class GiftPoint {
#value;
constructor(point) {
if (point < MIN_POINT) {
throw new Error('유효하지 않은 값입니다.');
}
this.#value = point;
}
static forStandardMembership() {
return new GiftPoint(STANDARD_MEMBERSHIP_POINT);
}
static forPermiumMembership() {
return new GiftPoint(PREMIUM_MEMBERSHIP_POINT);
}
getPoint() {
return this.#value;
}
add(otherGiftPoint) {
return new GiftPoint(this.#value + otherGiftPoint.getPoint());
}
#isEnough(consumptionPoint) {
return consumptionPoint.getPoint() <= this.#value;
}
consume(consumptionPoint) {
if (!this.#isEnough(consumptionPoint)) {
throw new Error('포인트가 부족합니다.');
}
return new GiftPoint(this.#value - consumptionPoint.getPoint());
}
}
const standardMembershipPoint = GiftPoint.forStandardMembership();
const premiumMembershipPoint = GiftPoint.forPermiumMembership();
초기화 로직의 분산을 막고 목적에 따라 초기화하기 위해서 팩토리 메서드를 만들었다.
이렇게 만들면, 신규 가입 포인트와 관련된 로직이 하나의 클래스에 응집된다.
하지만 JS에서 생성자를 private으로 처리할 수 없기 때문에 외부에서 인스턴스를 생성할 수 있는 단점이 존재한다.
'객체지향' 카테고리의 다른 글
성숙한 클래스로 성장시키는 설계 기법 (2) | 2023.12.03 |
---|