정의
- 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 함
예시
Q. 도서관 대여 명부와 같은 새로운 매체에 학생의 대여 기록을 출력하는 경우라면 어떻게 처리할까?
A. 도서관 대여 명부 클래스를 만들어 SomeClient 클래스가 이 기능을 이용하도록 함 (X)
-> 새로운 기능을 추가하려고 SomeClient 클래스를 수정해야 함(OCP 위반!!)**
※ TIP
OCP를 위반하지 않은 설계를 할 때 가장 중요한 것은 무엇이 변하는 것인지, 무엇이 변하지 않는 것인지를 구분해야 하고 변하는 것은 쉽게 변하고, 변하지 않아야 할 것은 변하는 것에 영향을 받지 않아야함
- 변경이 있더라도 기존의 클래스(SomeClient 클래스)가 영향을 받지 않게 하려면 인터페이스에서 구체적인 출력 매체를 캡슐화해 처리해야 함
OCP의 다른 관점
- 클래스를 변경하지 않고도closed 대상 클래스의 환경을 변경할 수 있는open 설계가 되어야 함
단위 테스트에서의 OCP
- 단위테스트는 빠른 시간에 자주 테스트해야하므로 테스트 대상 기능이 사용하는 실제 외부의 서비스를 흉내내는 가짜 객체를 만들어 테스트의 효율성을 높여야 함
- 실제 서비스에 사용할 객체를 그대로 테스트를 하면 변경이 생길 위험이 있으므로 실제 데이터베이스 기능을 대체하는 가짜 객체를 만들어야 함
Reference
- 정인상, 채흥석, 『JAVA 객체 지향 디자인 패턴』, 한빛미디어(2019.3.8), 111~115p