리펙토링 7장

wonderful world·2022년 3월 27일
0

리팩토링 2판

목록 보기
2/9

캡슐화

7.1 레코드 캡슐화하기

7.2 컬렉션 캡슐화하기

7.3 기본형을 객체로 바꾸기

단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의한다.

아래는 기본형을 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;

7.4 임시 변수를 질의 함수로 바꾸기

변수 대신 컨텍스트와 메소르를 제공하면 다른 곳에서 사용할 수 있어 코드 중복이 줄어든다!

// 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;
  }

7.5 클래스 추출하기

7.6 클래스 인라인하기

7.7 위임숨기기

7.8 중개자 제거하기

7.9 알고리즘 교체하기

Reference

profile
hello wirld

0개의 댓글