- 여러 actor가 동일하게 접근해야하는 method 경우 책임을 분할하여야한다.
- actor별로 data에 접근해야하는 목적이 다를 수 있는다.
- 특정 actor가 목적에 맞게 객체를 변경하면 다른 actor에게 문제가 생길 수 있다.
- 높은수준의 추상 정보를 낮은 수준의 추상으로부터 지키기 위한 원칙
- 낮은 수준의 추상의 변경으로 부터 자유로워야한다. ( 저수준 변경시 고 수준 영향 x)
- 어떻게, 왜, 언제 발생 하는지에 따라서 기능을 분리하고, 분리한 기능을 컴포넌트의 계층구조로 조직화한다.
- A (객체 a)와 B (객체 b) 두 개의 타입이 있을때 b에서 a로 치환해도 행위가 변경이 없다면 a는 b의 하위 타입이다.
- 리스코프 치환원칙은 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스를 바꿀 수 있어야한다.
- LSP는 아키텍처 수준까지 확장 가능하며, 확장 되어야한다. 규칙이 깨지면 상당한 문제를 발생시킬 수 있다..
- 필요 이상으로 많은 걸 포함하는 모듈을 줄이기 위함
- 쓸모없는 구현을 막기위해 interface를 좀 더 잘게 쪼개는 원칙이다.
- 유연성이 극대화된 시스템 추구 코드 의존성이 추상(interface)에 의존해야한다.
- 재사용 단위는 릴리스 단위와 같다.
- Release에 따라 기존 버전을 유지할지 선택할 수 있어야한다.
- 단일 컴포넌트는 응집성 서로 공유하는 태마가 있는 높은 클래스와 모듈로 구성되어야한다.
- 하나의 컴포넌트로 묶인 클래스와 모듈은 하나의 버전으로 관리되어야한다.
- 과하면 불필요한 릴리스가 빈번해질 수 있음.
- 유지보수성을 위한 그룹
- 컴포넌트 시점의 SRP다.
- 동일한 시점, 유형에 변경되는 컴포넌트로 묶어라
- 다른 시점, 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라
- 변경이 여러 컴포넌트에 분산되기보다 단일 컴포넌트로 제한할 필요가 있다.
- 과하면 컴포넌트 변경이 빈번해질 수 있음.
- 불필요한 릴리스를 피하기 위한 그룹
- ISP의 포괄적인 버전
- 컴포넌트 사용자들을 필요하지 않는 것에 의존하게 강요하지 말라.
- 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안된다.
- 재사용이 어려워질 수 있음.
Fan-In : 자신을 사용하는 모듈의 수
Fan-Out: 자신이 호출하는 모듈의 수
FanOut
FanOut + FanIn 가 0이 되면 가장 안정된 상태