단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의한다.
아래는 기본형을 Priority
클래스를 바꾼 모습!
// before
class Order {
constructor(data) {
this.priority = data.priority;
// ...
}
}
// 클라이언트
const highPriorityCount = orders.filter(o => "high" === o.priority || "rush" === o.priority).length;
// after
class Order {
get priority() {
return this._priority;
}
set priority(aString) {
this._priority = new Priority(aString);
}
// ...
}
class Priority {
constructor(value) {
this._value = value;
}
toString() {
return this._value;
}
}
const highPriorityCount = orders.filter(o => "high" === o.priority.toString() || "rush" === o.priority.toString()).length;
변수 대신 컨텍스트와 메소르를 제공하면 다른 곳에서 사용할 수 있어 코드 중복이 줄어든다!
// before
class Order {
constructor(quantity, item) {
this._quantity = quantity;
this._item = item;
}
get price() {
var basePrice = this._quantity * this._item.price;
var discountFactor = 0.98;
if (basePrice > 1000) discountFactor -= 0.03;
return basePrice * discountFactor;
}
// after
class Order {
constructor(quantity, item) {
this._quantity = quantity;
this._item = item;
}
get price() {
return this.basePrice * this.discountFactor;
}
get basePrice() {
return this._quantity * this._item.price;
}
get discountFactor() {
var discountFactor = 0.98;
if (basePrice > 1000) discountFactor -= 0.03;
return discountFactor;
}