코드 대리석 깎기 - ISP 원칙
- 큰 덩어리 코드를 만들고 점점 깎으면서 다듬어 낸다
- 객체 지향은 코드를 클래스로 만들면서 깎아 간다 → 역할 책임 모델 기준으로 깎는다 (
ISP 원칙
)
역할과 책임
- 책임을 진다는 것은 책임에 적합한 권한도 갖고 있다는 것이다.
- 권한이 있다는 것은 권한에 적합한 책임도 갖고 있다는 것이다.
- 책임이 없는데 권한이 없거나 권한이 없는데 책임이 있다면 문제가 생긴다.
- 인간의 머리는 복잡성의 한계가 있다. 그래서 객체지향을 통하여 좋은 코드를 만드는 방법은 코드를 잘 쪼개서 인간이 인식할 수 있는 복잡성 만큼 수용하는 것이다. 그런데 쪼개는 것이 어렵기 때문에 일관성 있게 쪼개는 방법이 중요하다. 그래서 역할과 책임에 맡게 코드를 쪼개는 연습을 해야 한다.
ViewModel 클래스 ISP로 개선하기
ViewModel
코드
- 이만큼 큰 코드가
ViewModel
에 다 필요한 것인가
#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가 아니라 업데이트 된거 다보낸다
);
}
ViewModel
의 역할은 View
를 대신해서 인메모리 안에 View
를 표현 해야되는데 이 코드들은 Subject 코드라서 ISP 원칙과 맞지 않다
기능(메소드)
을 분리하기 위해서는 상태
도 같이 분리해야된다
- 처음부터 생각해서 짜야 된다
listeners
와 isUpdated
만 참고 하고 있었던 것도 다 미리 노린 것
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);
}