개방-폐쇄 원칙
컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라
- OCP는 런타임 의존성과 컴파일타임 의존성에 대한 이야기이다.
- 유연하고 재사용 가능한 설계에서는 런타임 의존성과 컴파일타임 의존성이 동일하지 않다.
- 책에서 할인정책은 DiscountPolicy를 상속받는 클래스 하나 추가하면 가능한 것이 예시
- 의존성 관점에서 OCP를 따르는 설계란 컴파일 타임 의존성은 유지하면서 런타임 의존성의 가능성을 확장하고 수정할 수 있는 구조이다.
추상화가 핵심이다
- OCP의 핵심은 추상화에 의존하는 것이다. (추상화 + 의존 두 개념이 중요)
- 추상화 과정을 거치면 문맥이 바뀌더라도 변하지 않는 부분만 남게되고 문맥에 따라 변하는 부분은 생략된다.
- 추상화에 의존한다는 것은 수정이 적은 안정된 것에 의존한다는 의미이지 단순히 추상화만 했다고 공짜로 변경에 용이한 설계가 만들어지는게 아니다.
- 따라서 변하는 것과 변하지 않는 것을 잘 이해하고 신중하게 결정해서 추상화해야 목적을 이룰 수 있다.
- OCP를 가능하게 하는것은 의존성의 방향이다. 모든 요소가 추상화에 의존해야 수정에 대한 영향을 최소화할 수 있다.
생성 사용 분리
의존성을 연결하는 작업(객체 생성 및 연결)과 실행 작업은 나눠져있어야한다. → 그래야 OCP를 지킬 수 있게 됨
FACTORY 추가하기
- 객체 생성의 책임을 Client로 넘긴다는 것은 Client는 특정 컨텍스트(구체 클래스)에 묶여도 상관없다는 전제하에서이다.
- 근데 Client도 묶이기 싫다면 Factory를 만들자. → Factory는 객체 생성에 특화된 객체이다.
순수한 가공물에게 책임 할당하기
- Factory는 도메인 모델은 아니지만 이를 도입함으로써
- 결합도를 낮춘다.
- 재사용성을 높인다.
- 시스템을 객체로 나누는데 두 가지가 있다.
- 표현적 분해 → 시스템을 도메인 모델에 담겨있는 개념과 관계를 따르면서 분해하는 것
- 행위적 분해 → 도메인 개념을 초월하는 기계적인 개념들, 순수한 가공물, 모든 책임을 도메인에 할당하면 낮은 응집도, 높은 결합도, 재사용성 저하 등의 문제가 생겨서 만들어지는 개념