패키지 설계 원칙
20 Jan 2025패키지 설계의 원칙에 대해서 정리해보자.
패키지 응집도의 원칙
패키지 응집도의 원칙은 개발자가 어떻게 클래스를 패키지에 분류해 넣을지 결정할 때 도움이 된다.
재사용 릴리즈 등가 원칙(REP)
재사용 릴리즈 등가 원칙은 말 그대로 재사용 단위와 릴리즈 단위가 같다는 원칙이다.
어떤 프로그램을 사용하는 사용자 입장에서는 프로그램을 작성한 사람에게 재사용할 수 있도록 유지보수해주길 바란다.
재사용자들이 요구하는 것을 충족시키려면 작성자는 반드시 자신의 소프트웨어를 재사용 가능한 패키지로 조직한 다음 릴리즈 번호를 붙이고 계속 추적해야 한다.
패키지의 모든 클래스가 재사용 가능하든지, 모두 그렇지 않든지 해야 한다.
또한 재사용자가 누구인지도 고려해야 한다.
패키지 안의 모든 클래스는 동일한 재사용자를 대상으로 해야 한다.
공통 재사용 원칙(CRP)
공통 재사용 원칙은 패키지 안의 클래스들은 함께 재사용 되어야 한다는 원칙이다.
공통 재사용 원칙은 어떤 클래스들이 패키지에 포함되어야 하는지 결정할 때 도움이 된다.
단독으로 재사용되는 클래스는 거의 없다.
대부분의 경우, 재사용 가능한 클래스들은 재사용 가능에 대해 같은 추상적 범주에 속해 있는 다른 클래스들과 협력한다.
공통 폐쇄 원칙(CCP)
공통 폐쇄 원칙은 같은 패키지 안의 클래스들은 동일한 종류의 변화에는 모두 폐쇄적이어야 한다는 원칙이다.
패키지에 어떤 변화가 영향을 미친다면, 그 변화는 그 패키지의 모든 클래스에 영향을 미쳐야 하고 다른 패키지에는 영향을 미치지 않아야 한다.
패키지 결합도의 원칙
의존 관계 비순환 원칙(ADP)
의존 관계 비순환 원칙은 패키지 의존성 그래프에서 순환을 허용하지 말라는 규칙이다.
누군가가 의존하는 것을 변경 했을 때 되던 것이 안 되는 경우 의존 관계 순환을 없애면 이 문제를 해결 가능하다.
개발 환경을 릴리즈로 만들 수 있는 패키지로 분할하는 것이다.
안정된 의존 관계 원칙(SDP)
안정된 의존 관계 원칙이란 의존은 안정적인 쪽으로 향해야 한다는 원칙이다.
안정성이란 변화와는 크게 관련이 없고 쉽게 움직이지 않는다면 안정성이 있다고 한다.
안정된 의존 관계 원칙을 사용해서 특정 변화에 쉽게 반응할 수 있는 패키지를 만든다.
쉽게 바뀔 것이라고 예상되는 패키지들이 바뀌기 어려운 패키지들의 의존 대상이 되어서는 안 된다.
안정성 측정 방법
패키지에 들어오거나 나가는 의존 관계 화살표의 수를 세는 것으로 패키지의 안정성을 측정할 수 있다.
들어오는 결합 Ca, 나가는 결합 Ce, 불안정성 I
\[I = Ce / (Ca + Ce)\]I의 측정값이 1이면, 그 패키지에 의존하는 다른 패키지가 없다는 뜻이며, 동시에 이 패키지가 의존하는 패키지가 있다는 뜻이다. 이 패키지는 최고로 불안정한데, 책임을 지지 않으며 동시에 의존적이다.
I의 측정감이 0이면, 다른 패키지들은 그 패키지에 의존하지만 자기 자신은 다른 패키지에 의존하지 않는다는 뜻이다. 이 패키지는 책임을 지며 또 독립적이다.
SDP에 따르면 어떤 패키지의 I 측정값은 그 패키지가 의존하는 다른 패키지들의 I 값들보다 반드시 커야 한다.
즉, 의존 관계의 방향으로 I 측정값이 줄어들어야 한다.
모든 패키지가 안정적일 필요는 없다. 어떤 패키지는 불안정하고 또 어떤 패키지는 안정적인 설계가 좋은 설계다.
안정된 추상화의 원칙
안정된 추상화의 원칙은 패키지가 자신이 안정적인 만큼 추상적이기도 해야 한다는 원칙이다.
안정된 추상화 원칙에 따르면 안정적인 패키지는 그 안정성 때문에 확장이 불가능하지 않도록 추상적이기도 해야 한다.
거꾸로, 이 원칙에 따르면 불안정한 패키지는 구체적이어야 하는데, 그 불안정성이 그 패키지 안의 구체적인 코드가 쉽게 변경될 수 있도록 허용하기 때문이다.
따라서 어떤 패키지가 안정적이라면 확장할 수 있도록 추상 클래스들로 구성되어야 한다.
추상성 측정법
- Nc : 패키지 안에 들어 있는 클래스 수
- Na : 패키지 안에 들어 있는 추상 클래스 수.
- A: 추상성(0~1)
0은 패키지에 추상 클래스가 하나도 없다는 뜻이고, 1은 이 패키지에 추상 클래스밖에 들어 있지 않다는 뜻이다.
(0,0) 주변 영역은 고통의 지역이라고 불리는 배제할 지역이고, (1,1) 주변 영영은 쓸모없는 지역이라고 불린다.
(1,0)과 (0,1)을 잇는 직선을 주계열이라고 한다.
주계열 위에 있는 패키지는 안정성에 비해 너무 추상적이지도 않고, 추상성에 비해 너무 불안정하지도 않다.