* 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

+ Recent posts