OCP란?
OCP의 특징
- 소프트웨어 요소는 확장에 열려 있으나 변경에는 닫혀있어야한다.
- 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있어야한다.
- 열려있다는 것은 기능 추가나 변경이 가능하다는 것이고 닫혀있다는 것은 기능추가를 할 때 그 모듈을 쓰고 있는 코드들을 줄지어 수정하지 않아야한다는 것
- 다형성을 활용하자
- 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야한다.
- 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현
OCP 위반 예제
- 어떤 타입에 대한 반복적인 분기문
- 하나의 enum에 대해 여러군데에서 반복적으로 if/switch문을 쓰고있다면 다시 생각해보아야한다.
- 기능추가는 case를 한줄 추가하는것 만큼이나 쉬울 수 있지만 그러면 enum을 사용하는 모든 코드를 찾아가서 수정해주어야한다.
- OCP는 if/switch를 최대한 안쓰는 것으로 연습할 수 있습니다.
- 아예 사용하지 말라는 것은 아니고 enum 같은 타입을 분기하는 지점에 대해서
- 분기문을 없애는 것만으로도 함수와 클래스의 길이를 줄여서 SRP도 준수할 수 있습니다.
OCP를 지키는 방법
- Protocol 사용해서 상속 받기
- 딕셔너리 사용하기 // OCP를 지키는 원칙은 아님
OCP의 단점
- 구현 객체를 변경하려면 클라이언트 코드 변경을 해야한다.
- 분 명 다형성을 사용하고 있지만 OCP 원칙일 지킬 수 없다.
OCP의 단점 해결 방법
- 객체를 생성하고, 연관 관계를 맺어주는 별도의 조립, 설정자가 필요하다.