SAP(안정된 추상화 원칙)이란?
컴포넌트는 안정된 정도만큼만 추상화되어야 한다.
고수준 정책은 어디에 위치시켜야하는가?
- 고수준 아키텍처나 정책 결정과 관련된 소프트웨어는 자주 변경해서는 절대로 안 되는 소프트웨어
- 고수준 정책을 캡슐화하는 소프트웨어는 반드시 안정된 컴포넌트(I=0)에 위치해야 한다.
- 하지만 안정된 컴포넌트에 위치 시킨다면 변경이 어려운 단점이 있음. (유연성이 떨어짐)
- 추상 클래스를 통해 컴포넌트가 최고로 안정된 상태(I=0)이면서도 동시에 유연하게 만들 수 있다.
안정된 추상화 원칙 (Stable Abstractions Principle)
- 안정성과 추상화 정도 사이의 관계를 정의.
- 안정된 컴포넌트는 추상 컴포넌트여야 함(인터페이스와 추상 클래스로 구성).
이를 통해 안정성이 컴포넌트를 확장하는 일을 방해해서는 안됨을 이야기함. - SAP와 SDP를 결합하면 컴포넌트에 대한 DIP와 같은 의미를 가지게 됨. => 의존성은 추상화의 방향으로 향한다.
추상화 정도 측정
추상화 정도는 A지표를 통해서 측정가능하다.
이는 컴포넌트의 클래스 총 수 대비 인터페이스와 추상 클래스의 개수를 단순히 계산한 값이다.
Nc: 컴포넌트의 클래스 개수
Na: 컴포넌트의 추상 클래스와 인터페이스의 개수
A: 추상화 정도. A=Na/Nc
- A는 0과 1사이값.
- A가 0이면 추상 클래스가 하나도 없다는 뜻.
- A가 1이면 컴포넌트는 오직 추상 클래스만을 포함한다는 뜻.
주계열
- 최고로 안정적(I=0) 이며 추상화된(A=1) 컴포넌트는 (0,1)에 위치.
- 최고로 불안정(I=1) 이며 구체화된(A=0) 컴포넌트는 (1,0)에 위치.
- 모든 컴포넌트가 (0,1), (1,0)에 위치해야한다고 강요할 수 없으므로, 합리적인 지점의 궤적에 위치하도록한다.
- 고통의 구역
- (0,0) 주변의 친구들.
- 추상적이지 않아 확장할 수 없고, 안정적이라 변경하기도 힘듦.
- 일부 소프트웨어의 엔티티가 이 구역에 위치. DB스키마가 변경되면 고통스러움.
- 구체적인 유틸리티 라이브러리도 이 구역에 위치. 예를 들면 String 컴포넌트로 변동성이 거의 없음.
하지만 변경이 일어나면 혼란초래.
- 변동성이 없는 컴포넌트는 (0,0) 구역에 위치하더라도 해롭지 않다.
- 문제가 되는 컴포넌트는 변동성이 있는 컴포넌트이다.
- 따라서 고통의 구역에서 세번째 축으로 변동성을 고려해 볼 수 있음. - 쓸모없는 구역
- (1,1) 주변의 친구들.
- 최고로 추상적이지만, 누구도 그 컴포넌트에 의존하지 않음. 따라서 쓸모가 없다. - 배제 구역 벗어나기
- 변동성이 큰 컴포넌트는 고통의 구역과 쓸모없는 구역(배제 구역)을 벗어나야 한다.
- 이는 (1,0)과 (0,1)을 잇는 선분이다.(주계열)
- 주계열에 위치한 컴포넌트는 자신의 안정성에 비해 '너무 추상적'이지도 추상화 정도에 비해 '너무 불안정'하지도 않다.
- 추상화된 수준에 어울릴 정도로만 다른 컴포넌트에 의존, 구체화된 수준에 어울릴 정도로만 다른 컴포넌트에 의존.
- 가장 바람직한 지점은 주계열의 두 종점 (0,1), (1,0)
- 뛰어난 아키텍트라면 대다수의 컴포넌트가 두 종점에 위치하도록 만들기 위해 매진.
주계열과의 거리(D)
주계열 위 또는 가까이 위치한 컴포넌트가 바람직하다면, 얼마나 이 상태로 부터 멀리 떨어져 있는지 측정하는 지표.
D = |A + I - 1|
- D가 0에 가까울수록 이상적
- D가 0에서 가깝지 않다면 해당 컴포넌트는 재검토한 후 재구성할 수 있다.
- D지표의 평균과 분산을 통해 다른 컴포넌트에 비해 예외적인 컴포넌트 추출 가능
결론
의존성 관리 지표를 통해, 설계의 의존성과 추상화 정도가 내가 생각하는 훌륭한 수준에 얼만큼 부합하는지 측정할 수 있다.
다만 지표는 하나의 참고용일 뿐 항상 맞는 것은 아니라는 것을 염두해 두도록 하자!
'Design > Architecture' 카테고리의 다른 글
[Clean Architecture] 아키텍처란? (0) | 2021.12.05 |
---|---|
[Architecture 공부] CQRS에 대해서 알아보자. (0) | 2021.11.28 |
[Clean Architecture] 컴포넌트 사이의 관계와 원칙(2) : SDP (0) | 2021.11.23 |
[Clean Architecture] 컴포넌트 사이의 관계와 원칙(1) : ADP (0) | 2021.11.16 |
[Clean Architecture] 컴포넌트 응집도 (0) | 2021.11.01 |