루비로 배우는 객체지향 디자인 - 1~2장

3장 - 의존성 관리하기

// 지난 시간의 Gear 클래스
class Gear {
  constructor(chainring, cog, rim, tire) {
    this.chainring = chainring;
    this.cog = cog;
    this.rim = rim;
    this.tire = tire;
  }

  get gearInches() {
    return this.ratio * new Wheel(rim, tire).diameter;
  }

  // ...
}

new Gear(52, 11, 26, 1.5).gearInches;
class Gear {
  constructor(chainring, cog, wheel) {
    this.chainring = chainring;
    this.cog = cog;
    this.wheel = wheel // 어느 클래스의 인스턴스인지는 Gear가 알바 아니다.
  }

  get gearInches() {
    return this.ratio * this.wheel.diameter
  }

  // ...
}

new Gear(52, 11, new Wheel(26, 1.5)).gearInches;
class Gear {
  constructor(chainring, cog, rim, tire) {
    this.chainring = chainring;
    this.cog = cog;
    this.wheel = Wheel.new(rim,tire)
  }

  get gearInches() {
    return this.ratio * this.wheel.diameter
  }

  // ...
}

class Gear {
  constructor(chainring, cog, rim, tire) {
    this.chainring = chainring;
    this.cog = cog;
    this.rim = rim
    this.tire = tire
  }

  get gearInches() {
    return this.ratio * this.getWheel().diameter
  }

  getWheel() {
    return this.wheel || new Wheel(this.rim, this.tire)
  }

  // ...
}
get gearInches() {
  // 무시무시한 수학 공식 몇 줄
  const foo = someIntermediateResult * this.wheel.diameter;
  // 무시무시한 수학 공식 추가
}
get gearInches() {
  // 무시무시한 수학 공식 몇 줄
  const foo = someIntermediateResult * this._getDiameter();
  // 무시무시한 수학 공식 추가
}

_getDiameter() {
  return this.wheel.diameter;
}