Replace Primitive With Object, 기본형을 객체로 바꾸기를 알아보자.
요약

코드
orders.filter(o => "high" === o.priority || "rush" === o.priority)orders.filter(o => o.priority.higherThan(new Priority("normal")))배경
- 개발 초기에는 단순한 정보를 숫자나 문자열 같이 표현할 수 있다.
- 그런데 진행될 수록 이 정보들이 간단하지 않게 변하기 일쑤다.
- 단순히 출력 이상의 기능이 필요해진다면, 전용 클래스로 묶는게 좋다.
- 시작은 별거 없겠지만, 특별한 동작이 필요해 지게 되면 아주 편리해진다.
- 함께 묶을 수 있는 데이터를 모아두는 것은 곧 필요한 동작도 함께 따라간다는 것이다.
절차
- 아직 변수를 캡슐화하지 않았다면 캡슐화한다.
- 단순한 값 클래스를 만든다.
- 정적 검사를 수행한다.
- 변수를 해당 클래스 인스턴스를 사용하도록 변경한다.
예시
class Order {
constructor(data) {
this.priority = data.priority;
}
}
// client 1
highPriorityCount = orders.filter(o => "high" === o.priority || "rush" === o.priority).length;- 우선순위 이 값이 지금 기본형인데, 얘가 커질 가능성이 있다고 생각해보자.
- 캡슐화부터 시작하자.
class Order {
constructor(data) {
this._priority = data.priority;
}
get priority() {return this._priority;}
set priority(aString) {this._priority = aString;}
}- 다음으로 클래스로 만들어야 한다.
class Priority {
constructor(value) {
this._value = value;
}
toString() {return this._value;}
}
class Order {
constructor(data) {
this._priority = data.priority;
}
get priority() {return this._priority;}
set priority(aString) {this._priority = new Priority(aString);}
}
// client 1
highPriorityCount = orders.filter(o => "high" === o.priority || "rush" === o.priority).length;- 클래스 하나 만들어주고, Order에서는 이 클래스 인스턴스를 활용하도록 변경한다.
priority()함수자체의 의미와 다르기 때문에prioirtyString()으로 변경한다.
class Priority {
constructor(value) {
this._value = value;
}
toString() {return this._value;}
}
class Order {
constructor(data) {
this._priority = data.priority;
}
get priorityString() {return this._priority.toString();}
set priority(aString) {this._priority = new Priority(aString);}
}
// client 1
highPriorityCount = orders.filter(o => "high" === o.priorityString || "rush" === o.priorityString).length;