루비로 배우는 객체지향 디자인 - 1~2장
// 지난 시간의 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;
Gear
가 Wheel
에게 말을 걸려면 일단 Wheel
클래스의 인스턴스를 만들어야 한다. 변경 사항이 발생하면 Wheel
을 다른 것으로 바꾸기만 하면 될까?
Gear
가 Wheel
외의 다른 객체와 협업하기를 거부하고 있는 것이다.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;
Gear
는 diameter
를 구현하고 있는 어떤 객체와도 협업할 수 있게 되었다.constructor
안에서 의존성 있는 클래스의 인스턴스를 생성하거나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)
}
// ...
}
gearInches
메서드가 더 복잡해지면?get gearInches() {
// 무시무시한 수학 공식 몇 줄
const foo = someIntermediateResult * this.wheel.diameter;
// 무시무시한 수학 공식 추가
}
this.wheel.diameter
는 복잡한 다른 연산에 의해 묻혀버렸는데, 결국 this.wheel
은 외부에 대한 의존을 표현하고 있기 때문에 gearInches
를 변화에 취약하게 만들고 있다. 그 와중에 내부가 복잡하다.get gearInches() {
// 무시무시한 수학 공식 몇 줄
const foo = someIntermediateResult * this._getDiameter();
// 무시무시한 수학 공식 추가
}
_getDiameter() {
return this.wheel.diameter;
}