* ADP (Acyclic Dependencies Principle; 의존성 비순환 원칙)
> 컴포넌트 의존성 그래프에 순환이 있어서는 안 된다
: 의존성 구조는 순환이 없는 DAG (Direct Acyclic Graph; 비순환 방향 그래프) 이어야 한다
: 순환 구조를 갖는 컴포넌트들은 하나의 거대한 컴포넌트가 되어 버린다
- 단위 테스트를 하고 릴리스 하는 일도 굉장히 어려워지며 에러도 쉽게 발생한다
- 모듈의 개수가 많아짐에 따라 빌드 관련 이슈는 기하급수적으로 증가한다
> 순환을 끊는 방법
: DIP 원칙을 적용한다
: 두 컴포넌트가 모두 의존하는 새로운 컴포넌트를 만든다
> 컴포넌트 의존성 다이어그램은 소프트웨어의 Buildability 와 Maintainability 를 보여준다
- 변덕스러운 이유로 자주 변경되는 컴포넌트로 인해, 안정적인 컴포넌트가 영향받는 일을 원치 않는다
* SDP (Stable Dependencies Principle; 안정된 의존성 법칙)
> 안정성의 방향으로 (더 안정된 쪽에) 의존하라
: 변경이 쉽지 않은 컴포넌트가 변동이 예상되는 컴포넌트에 의존하게 만들어서는 절대로 안 된다
> 안정성 지표
: Fan-in
- 안으로 들어오는 의존성.
- 컴포넌트 내부의 클래스에 의존하는 컴포넌트 외부의 클래스 개수를 나타냄
: Fain-out
- 바깥으로 나가는 의존성.
- 외부의 클래스에 의존하는 컴포넌트 내부의 클래수 개수를 나타냄
: I (불안정성) = Fan-out / (Fan-in + Fan-out)
- 이 지표는 0~1 범위의 값을 갖는다.
- 0이면 최고로 안정된 컴포넌트라는 뜻이
(즉, 해당 컴포넌트는 어떤 컴포넌트도 의존하지 않지만, 해당 컴포넌트를 의존하는 다른 컴포넌트가 있다)
- 1이면 최고로 불안정한 컴포넌트라는 뜻이다
(즉, 어떤 컴포넌트도 해당 컴포넌트에 의존하지 않지만, 해당 컴포넌트는 다른 컴포넌트에 의존한다)
- 의존성 방향으로 갈수록 I 의 값은 감소해야 한다
* SAP (Stable Abstractions Principle)
> 컴포넌트는 안정된 정도만큼만 추상화되어야 한다
: 시스템에서 고수준 정책을 캡슐화하는 소프트웨어는 반드시 안정된 컴포넌트(I=0)에 위치해야 한다.
: 불안정한 컴포넌트(I=1)는 반드시 변동성이 큰 소프트웨어, 즉 쉽고 빠르게 변경할 수 있는 소프트웨어만을 포함해야 한다.
> 안정적인 컴포넌트라면 반드시 인터페이스와 추상 클래스로 구성되어 쉽게 확장할 수 있어야 한다
> 추상화 지표
: Nc
- 컴포넌트의 클래스 개수
: Na
- 컴포넌트의 추상 클래스와 인터페이스 개수
: A (추상화 정도) = Na / Nc
- 이 지표는 0~1 사이의 값을 갖는다.
- 0이면 컴포넌트에는 추상 클래스가 하나도 없다는 뜻이다
- 1이면 컴포넌트는 오로지 추상 클래스만을 포함한다는 뜻이다
* I/A Graph
> 최고로 안정적이며 추상화된 컴포넌트는 좌측 상단인 (0, 1) 에 위치한다
> 최고로 불안정하며 구체화된 컴포넌트는 우측 하단인 (1, 0) 에 위치한다
> Zone of Exclusion (배제 구역)
: Zone Of Pain (0, 0)
- 매우 안정적이며 구체적인 컴포넌트
- 추상적이지 않으므로 확장할 수 없고, 안정적이므로 변경하기도 상당히 어렵다
- e.g.) DB Schema, String class 등
: String 의 경우 변동성이 거의 없기 때문에 이 구역에 위치해있어도 해롭지 않다
: Zone Of Uselessness (1, 1)
- 최고로 추상적이지만, 해당 컴포넌트를 의존하는 컴포넌트가 없다
> Main Sequence
: 가장 바람직한 지점은 (0, 1), (1, 0) 지점이다
: D (거리) = | A + I - 1 |
- 유효 범위는 [0, 1] 이다
- D 가 0 이면 컴포넌트가 Main Sequence 바로 위에 위치한다
- D 가 1 이면 Main Sequence 로 부터 가장 멀리 위치한다
- 분산이나 표준편차 이용해 Control Limit (관리한계) 를 결정하기 위한 목적으로 사용할 수 있다
'SW 공학 > 아키텍처 & 디자인' 카테고리의 다른 글
////////Use Your Singletons Wisely (0) | 2020.10.31 |
---|---|
Policy and Details (0) | 2020.10.12 |
Principles of Component Cohesion (REP, CCP, CRP) (0) | 2020.10.04 |
///Conway's Law (0) | 2020.10.03 |
///SOLID Principle (0) | 2020.10.03 |