- 패키지내의 Principles
- ADP (Acyclic Dependencies principles)
- SDP (Stable Dependencies Principle)
- SAP (Stable Abstractions Principle)
- 패키지내의 Principles
- ADP : 패키지들 사이에 cycle이 있다면 하나의 패키지 test하기 위해서 모든 패키지가 다 있어야한다.
- SDP : c1이 c2에 디펜던시 있으면 P1이 P2로 디펜던시가 있다고 한다. 따라서 자신보다 stable한 P로만 디펜던시를 갖자 (abstract level이 더 높은 P로만) * Stable = Independent + Responsible (변경될 확률을 측정한게 아니다)
- SAP : stable한 패키지는 abstract class가 많아야한다. Instable한 패키지는 concrete class가 많아야한다.
패키지들 사이에 cycle이 있다면 하나의 패키지 test하기 위해서 모든 패키지가 다 있어야한다.
- ADP (Acyclic Dependencies Principles)
패키지 디펜던시에 cycle이 있으면 안된다. (패키지 내에서 class들끼리 cycle은 상관없다.)
Cycle이 있으면 unit test하기가 어렵다. 따라서 아래 방법들로 Cycle을 없애야 한다.
1. DIP를 적용 (Interface 클래스 생성)
2. 서로 디펜던시있는 클래스들을 새로운 패키지를 생성하고 그 안에 넣어서 유사하게 DIP를 적용 (New package 생성)
- Robert C. Martin Metrics
Ca (Afferent Couplings) : 다른 클래스들이 나를 얼마나 사용하고 있는가?
Ce (Efferent Coupling) : 다른 클래스를 얼마나 사용하고 있는가? (t가 v로 dep있어도 ce=1이다.)
Abstractness (A) : 패키지의 추상화 정도 (1에 가까울수록 패키지내에 Abstract class가 많다)
Instability (I) : 패키지 변화시 타 패키지에 영향력을 안끼치는 정도
A = (abstract class) / (total class)
I = CE / (CA + CE)
- CA가 커지면 I가 0에 가까워진다. (High abstraction level = 영향력을 안끼치는 정도가 작아)
- CA가 작아지면 I가 1에 가까워진다. (Low abstraction level = 영향력을 안끼치는 정도가 커)
Stable Abstraction Principle에 의해 stable할수록 abstract level이 높아야한다.
= I가 낮을수록(Stable할수록) A가 높아야한다. -> Main sequence : A+I = 1 (Main seq에 가까울수록 좋다)
CA가 작으면 I가 1에 가까워지고 이때 A가 0에 가까울수록 좋다. (Bad)
CA가 크면 I가 0에 가까워지고 이때 A가 0에 가까울수록 좋다. (Good)
D (distance) = |A + I - 1| (distance가 0에 가까울수록 좋다)
(1, 1) -> A=1 & I=1 : 열심히 추상화했는데 나를 쓰는놈이 없어서 내가 바뀌어도 영향력 안끼치는 정도가 크다.
(0, 0) -> A=0 & I =0 : Concrete한 클래스인데 내가 바뀔때 바뀔 패키지들이 많다.
- SDP (Stable Dependencies Principle)
Stability : not easily moved (모듈이 바뀌기 어려운 정도를 측정한게 아니다)
SDP에 따르면 디펜던시방향으로 갈수록(High abstraction level쪽으로 갈수록) I가 작아야한다.
-> Stable이 instable에 디펜던시 있으면 나보다 더 stable한 놈만들고 DIP해주자!
- SAP (Stable Abstractions Principle)
Stable할수록(=I가 0에 가까울수록) abstract 해야한다. 그래야 남들한테 쉽게 이용당할 수 있다.
Main Sequence
I가 0에 가까울수록 stable
Zone of Pain -> (0, 0) : Stable인데 Concrete 패키지이다.
Zone of Uselessness ->(1, 1) : Instable한데 abstract 패키지이다. = useless
* A가 감소할수록 (Concrete일수록) I가 증가해야한다(영향력을 끼치면안된다)
패키지에서는 Instable을 위쪽에, Stable을 아래쪽에 위치시킨다.
Stable은 change하기 어렵고, 확장하기 쉬워야한다. abstract class가 많아야한다.
'Design Pattern' 카테고리의 다른 글
[디자인패턴] Bridge Pattern (브릿지 패턴) (0) | 2019.12.16 |
---|---|
[디자인패턴] Core Concepts in SW Design (Design에서의 핵심개념) (0) | 2019.11.25 |
[디자인패턴] Visitor Pattern (방문자 패턴) (0) | 2019.11.14 |
[디자인패턴] Mediator Pattern (중재자 패턴) (0) | 2019.11.11 |
[디자인패턴] State Pattern (스테이트 패턴) (0) | 2019.11.11 |