13장 컴포넌트 응집도 - ChoDragon9/posts GitHub Wiki

REP: 재사용/릴리즈 등가 원칙(Reuse/Release Equivalence Principle)

재사용 단위는 릴리즈 단위와 같다.

소프트웨어 컴포넌트가 릴리즈 절차를 통해 추적 관리되지 않거나 릴리즈 번호가 부여되지 않는다면 해당 컴포넌트를 재사용하고 싶어도 할 수도 없고 하지도 않을 것이다. 릴리즈 번호가 없다면 재사용 컴포넌트들이 서로 호환되는 지 보증할 방법이 전혀 없다.

이 원칙을 소프트웨어 설계와 아키텍처 관점에서 보면 단일 컴포넌트는 응집성 높은 클래스와 모듈들로 구성되어야 함을 뜻한다. 단순히 뒤죽박죽 임으로 선택된 클래스와 모듈로 구성되서는 안된다. 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 데이터나 목적이 있어야 한다.

CCP: 공통 폐쇄 원칙(Common Closure Principle)

동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라. 서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라.

이 원칙은 단일 책임 원칙(SRP)을 컴포넌트 관점에서 다시 쓴 것이다. SRP에서 단일 클래스는 변경의 이유가 여러개 있어서는 안된다는 말하듯이, 공통 폐쇄 원칙(CCP)에서도 마찬가지로 단일 컴포넌트는 변경이 이유가 여러개 있어서는 안된다는 말이다.

이 원칙은 개방 패쇄 원칙(OCP)과도 밀접하게 관련되어 있다. 실제도 CCP에서 말하는 패쇄 Closure는 OCP에서 말하는 패쇄 Closure와 그 뜻이 같다. CCP에서는 동일한 유형의 변경에 대해 닫혀 있는 클래스들을 하나의 컴포넌트로 묶음으로써 OCP에서 얻은 교훈을 확대 적용한다.

SRP와 CCP 두 원칙은 모두 다음과 같이 교훈으로 요약할 수 있다.

동일한 시점에 동일한 이유로 변경되는 것들은 한데 묶어라. 서로 다른 시점에 다른 이유로 변경되는 것들은 서로 분리하자.

CRP: 공통 재사용 원칙(Common Reuse Principle)

컴포넌트 사용자들은 필요하지 않는 것에 의존하게 강요하지 말라

공통 재사용 원칙도 클래스와 모듈은 어느 컴포넌트에 위치 시킬지 결정할때 도움되는 원칙이다. CRP에서는 같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 한다고 말한다.

CRP는 인터페이스 분리 원칙(ISP)의 포괄적인 버전이다. ISP는 사용하지 않은 메서드가 있는 클래스에 의존하지 말라고 조언한다. CRP에서는 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말라고 조언한다. 이 두 조언은 다음의 한 문장으로 요약할 수 있다.

필요하지 않는 것에 의존하지 말라

컴포넌트 응집도에 대한 균형

REP와 CCP는 포함 원칙이다. 즉, 두 원칙은 컴포넌트를 더욱 크게 만든다. CRP는 배제 원칙이며, 컴포넌트를 더욱 작게 만든다. 뛰어난 아키텍트라면 이 원칙들이 균형을 이루는 방법을 찾아야 한다.

  • REP: 재사용성을 위한 그룹. 고려하지 않으면 재사용이 어려워짐.
  • CCP: 유지보수성을 위한 그룹. 고려하지 않으면 컴포넌트 변경이 너무 빈번함.
  • CRP: 불필요한 릴리즈를 피하기 위해 분리하기. 고려하지 않으면 불필요한 릴리즈가 너무 빈번함.