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

요약

코드

orders.filter(o => "high" === o.priority || "rush" === o.priority)
orders.filter(o => o.priority.higherThan(new Priority("normal")))

배경

  • 개발 초기에는 단순한 정보를 숫자나 문자열 같이 표현할 수 있다.
  • 그런데 진행될 수록 이 정보들이 간단하지 않게 변하기 일쑤다.
  • 단순히 출력 이상의 기능이 필요해진다면, 전용 클래스로 묶는게 좋다.
  • 시작은 별거 없겠지만, 특별한 동작이 필요해 지게 되면 아주 편리해진다.
  • 함께 묶을 수 있는 데이터를 모아두는 것은 곧 필요한 동작도 함께 따라간다는 것이다.

절차

  1. 아직 변수를 캡슐화하지 않았다면 캡슐화한다.
  2. 단순한 값 클래스를 만든다.
  3. 정적 검사를 수행한다.
  4. 변수를 해당 클래스 인스턴스를 사용하도록 변경한다.

예시

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;

Reference