cleanUrl: "/object/8"
1. 개방-폐쇄 원칙
- 소프트웨어 개체는 확장에 열려 있어야 하고, 수정에는 닫혀 있어야 한다.
- 확장과 수정은 애플리케이션의 동작과 코드 관전에 반영할 수 있다.
- 확장에 열려 있다 : 애플리케이션 요구 사항이 변경에 맞게 새로운 동작을 추가해 기능을 확장할 수 있다.
- 수정에 닫혀 있다 : 기존의 코드를 수정하지 않고도 애플리케이션의 동작을 추가/변경할 수 있다.
1.1. 추상화가 핵심이다
- 개방-폐쇄 원칙(이하 OCP)의 핵심은 추상화에 의존하는 것이다.
- 추상화 = 핵심만 남기고 불필요한 부분은 생략해 복잡성을 극복하는 방법
- 이를 사용하면 문맥이 바뀌어도 변하지 않는 부분만 남게되어 변하는 부분은 생략됨
- OCP의 관점에서 남겨지는 부분은 다양한 상황에서 공통점을 반영한 추상화의 결과물이라 말할 수 있음
- 다시말해 수정할 필요가 없어야 한다.
- 생략된 부분은 확장의 여지를 남긴다.
- 주의점으로 추상화 했다고 모든 수정에 대해 설계가 폐쇄되는 것은 아니기 때문에 파급효과를 줄이기 위해 변하는것/변하지 않는 것을 신중하게 결정해야 한다.
2. 생성 사용 분리
- 결합도가 높아질수록 OCP를 따르는 구조를 설계하기가 어려워진다.
- 객체 생성에 대한 지식은 과도한 결합도를 초래하는 경향이 있다.
- 컨텍스트를 바꾸기 위한 유일한 방법은 코드 안에 명시돼 있는 컨텍스트에 대한 정보를 직접 수정하는 것뿐이다.
- 물론 객체 생성은 피할 수 없고 어디선가 반드시 생성해야 한다.
- 문제는 생성이 아니라 위치의 문제다.
- 즉, 객체의 생성과 사용의 분리를 해야한다.
2.1. Factory 추가하기
- 팩토리 객체 = 객체 생성과 관련된 책임만 전담하는 별도의 객체
2.2. 순수한 가공물에게 책임 할당하기
- 팩토리 객체는 순수하게 기술적인 결정으로 도메인 모델에 속하지 않는다.
- 객체를 분해하는 두 가지 방법
- 표현적 분해 = 도메인에 존재하는 사물/개념을 표현하는 객체들을 이용해 시스템을 분해
- 행위적 분해
- 모든 책임을 도메인 객체에게 할당하면 낮은 응집도/높은 결합도/재사용성 저하와 같은 심각한 문제점에 봉착할 가능성이 높아짐
- 이 경우 도메인 개념을 표현하는 객체가 아닌 설계자가 편의를 위해 임의로 만들어낸 가공의 객체에게 책임을 할당한다.
- 책임을 할당하기 위해 창조되는 도메인과 무관한 인공적 객체를 PURE FABRICATION(순수한 가공물)이라 부른다.
- 어떤 행동이 도메인에 책임질 마땅한 객체가 없다면 순수한 가공물에게 할당하자
- 이는 표면적 분해보다는 행동적 분해에 의해 생성되는게 일반적이다.