Today I Learned

개방폐쇄의 원칙_Open Close Principle(SOLID 5원칙중 O) - TIL

jjjkh 2023. 7. 28. 20:32

! 정의 

버틀란트 메이어 박사가 1998년 객체지향 소프트웨어 설계라는 책에서 정의한 내용으로 소프트웨어의 구성요소(컴포넌트, 클래스,모듈,함수)는 확장에는 열려있고, 변경에는 닫혀있어야한다는 원리이다. 이 말은 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화 해야 한다는 의미로 요구사항의 변경이나 추가 사항이 발생하더라도 기존 구성요소는 수정이 일어나지 말아야하며 기존 구성요소를 쉽게 확장해서 재 사용할 수 있어야 한다는 뜻이다. 로버트는 OCP는 관리가능하고 재사용 가능한 코드를 만드는 기반이며 OCP를 가능케 하는 중요 메커니즘은 추상화와 다형성이라고 설명하고 있습니다. OCP는 객체 지향의 장점을 극대화 하는 아주 중요한 원리라 할 수 있습니다.

 

! 적용 방법

1. 변경(확장)될 것과 변하지 않을 것을 엄격히 구분합니다.

2. 이 두 모듈이 만나는 지점에 인터페이스를 정의합니다.

3. 구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드를 작성합니다.

 

!적용사례

별 문제가 없어 보이지만 SRP원리를 적용하여 Guitar에서 변경이 예상되는 부분을 뽑아 GuitarSpec이라는 새로운 클래스를 만들어 변화요소들을 하나로 모았습니다. 이 방법으로 변화를 최소화 했지만 여기서도 변경이 발생할 수 있다. 예를 들어 아래와 같이 Guitar이 외에 바이올린이나 첼로 같은 다른 악기도 다루어야 한다면 어떤 일이 발생할까요?

 

 

변화를 막을 수 있는 사람은 아무도 없다. 다만 변화에 적절히 대응할 뿐이다. 위오ㅘ 같이 변화에 몸을 맡겨버린다면 엄청난 재앙이 개발자를 괴롭힐 것이다. 이제 대응해보도록 하자

 

먼저 Guitar와 추가될 악기들을 추상화 하는 작업이 필요하다. 여기서는 추가될 악기들의 공통 속성을 모두 담을 수 있는 Stringlnstrument라는 인터페이스를 생성한다. Stringlnstrumenrt가 이들을 대표하게 될 것이다.

 

새로운 악기가 추가 되면서 변경이 발생하는 부분을 추상화 하여 분리하였음을 확인 할 수 있습니다. 이렇게 해서 코드의 수정을 최소화하여 결합도는 줄이고 응집도는 높이는 효과를 볼 수 있다.