💡 정책과 수준
<aside>
💡 소프트웨어 시스템 : 정책을 기술 한 것
</aside>
- 대다수의 정책은 이 정책을 서술하는 여러개의 정책들로 쪼갤 수 있음
- 동일한 이유로 동일한 시점에 변경되는 정책은 동일한 수준에 위치하며, 동일한 컴포넌트에 위치해야 함
- 저수준 컴포넌트가 고수준 컴포넌트에 의존하도록 만들어야 함
- 컴포넌트를 연결 할 때, 의존성의 방향이 컴포넌트 수준을 기반으로 연결되도록 만들어야 함
수준
<aside>
💡 입력과 출력까지의 거리
</aside>
- 시스템의 입력과 출력 모두로 부터 멀리 위치할수록 정책의 수준은 높아 짐
- 입력 / 출력을 다루는 정책이라면, 반드시 시스템에서 최하위 수준에 있어야 함
- 입력 / 출력에서 가장 멀리 떨어진 컴포넌트가 최고 수준의 컴포넌트가 됨
- 소스코드 의존성은 그 수준에 따라 결합되어야 하며, 데이터 흐름을 기준으로 결합되어서는 안됨
fun encrypt() {
while(true) {
writeChar(translate(readChar()))
}
}
- 위 함수를 보면, 고수준인 encrypt 함수가 저수준인 readChar / writeChar에 의존되어 있기 때문에 잘못된 아키텍처임
- 따라서, CharWriter / CharReader 인터페이스 등을 두어 Encrypt와 입출력을 분리 시켜야 함
- 입력과 출력에서 부터 멀리 떨어진 정책은, 저수준 정책에 비해 덜 빈번하게 변경되며 보다 더 중요하게 취급되는 경우가 많음
- 소스코드 의존성의 방향이 고수준을 향함으로써 변경의 영향도를 줄일 수 있음
- 저수준 컴포넌트가 고수준 컴포넌트에 플러그인 되어야 한다는 관점으로 볼 수 있음