코드 대리석 깎기 - ISP 원칙

역할과 책임

ViewModel 클래스 ISP로 개선하기

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7f33024c-8185-4db4-8d53-f736782d764c/Untitled.png

  #isUpdated = new Set();
  #listeners = new Set(); 

// Subject 로직
  addListener(listener, _ = type(listener, ViewModelListener)) {
    this.#listeners.add(listener);
  }
  removeListener(listener, _ = type(listener, ViewModelListener)) {
    this.#listeners.delete(listener);
  }
  notify() {
    this.#listeners.forEach(
      (listener) => listener.viewmodelUpdated(this.#isUpdated)
      // true false가 아니라 업데이트 된거 다보낸다
    );
  }
static #subjects = new Set();
static #inited = false;

static notify(vm) {
  this.#subjects.add(vm);
  if (this.#inited) return;
  this.#inited = true;
  const f = () => {
    this.#subjects.forEach((vm) => {
      if (vm.#isUpdated.size) {
        vm.notify();
        vm.#isUpdated.clear();
      }
    });
    requestAnimationFrame(f);
  };
  requestAnimationFrame(f);
}