yeoseon / tip-archive

트러블 슈팅 및 팁을 모아두는 레포 (Today I Learned)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[객체지향 개발 5대 원리: SOLID] 2. OCP (개방폐쇄의 원칙: Open Close Principle)

yeoseon opened this issue · comments

OCP (개방폐쇄의 원칙: Open Close Principle)

소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다.
변경을 위한 비용은 가능한 줄이고, 확장을 위한 비용은 가능한 극대화 해야한다.
요구사항의 변경이나 추가사항이 발생하더라도 기존 구성요소는 수정이 일어나지 않아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
추상화와 다형성이 중요 메커니즘으로 사용된다.

적용 방법

  1. 변경(확장)될 것과 변하지 않을 것을 엄격히 구분한다.
  2. 이 두 모듈이 만나는 지점에 인터페이스를 정의한다.
  3. 구현에 의존하기보다 정의한 인터페이스에 의존하도록 작성한다.

적용 사례

image

  • SRP 원리를 적용하여 Guitar에서 변경이 예상되는 부분을 뽑아 GuitarSpec 이라는 새로운 클래스를 만들었다.
  • 하지만 여기서도 변경이 발생할 수 있다.
  • 바이올린, 첼로, 비올라 등의 다른 악기들도 다뤄야 한다면 아래처럼 일일이 새로운 악기들과 요소들을 만들어야 할 것이다.

image

  • 이를 해결하기 위해 Guitar와 추가될 다른 악기들을 추상화하는 작업이 필요하다.
  • 악기들의 공통 속성을 모두 담을 수 있는 StringInstrument 라는 인터페이스를 생성한다.

image

  • 새로운 악기가 추가되며넛 변경이 발생하는 부분을 추상화하여 분리했다.
  • 결합도는 줄이고 응집도는 높힌다.

적용 이슈

  1. 크기 조절에 실패하면 오히려 관계가 더 복잡해질 수 있다. 이런 크기 조절과 같은 갈등 상황을 잘 포착해서 비장한 결단을 내릴 줄 아는 능력이 필요하다.
  2. 인터페이스는 가능한 변경되어서는 안된다.
  3. 적당한 추상화 레벨을 선택해야 한다.

Reference