# Dependency Inversion 제어의 역전

const Worker = class {
  run() {
    console.log('working');
  }

  print() {
    this.run();
  }
};

const HardWorker = class extends Worker {
  run() {
    console.log('hardWorking');
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const Manager = class {
  #workers;

  constructor(...workers) {
    /*
      HardWorker 에 의존하지 않고 더 추상적인 Worker 에 의존하고 있다.
      따라서 여러 Worker 들을 더 확장해도 Manager 의 생성자는 잘 동작하게 된다. 
      Worker 의 하위 타입들은 Worker 로 업캐스팅 되기 때문에 가능하다. 
      * 어떠한 경우에도 다운캐스팅은 금지 → Polymorphism (추상인터페이스) 사용
    */
    if (workers.every(w => w instanceof Worker)) 
      this.#workers = workers; else throw 'invalid workers';
  }

  doWork() {
    this.#workers.forEach(w => w.run());
  }
};
const manager = new Manager(new Worker(), new HardWorker());
manager.doWork();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20