소프트웨어 시스템이란 정책을 기술한 것
대다수의 주요 시스템에서 하나의 정책은 이 정책을 서술하는 여러 개의 조그만 정책들로 쪼갤 수 있다
소프트웨어 아키텍처를 개발하는 기술에는 이러한 정책을 신중하게 분리하고, 변경 양상에 따라 재편성하는 일도 포함
재편성된 컴포넌트들을 비순환 방향 그래프로 구성하는 기술을 포함
정점은 동일한 수준의 정책을 포함하는 컴포넌트에 해당하고, 간선은 컴포넌트 사이의 의존성을 나타낸다
좋은 아키텍처라면 각 컴포넌트를 연결할 때 의존성의 방향이 컴포넌트의 수준을 기반으로 연결되도록 만들어야 한다
→ 저수준 컴포넌트가 고수준 컴포넌트에 의존하도록 설계되어야 한다
입력과 출력까지의 거리를 의미
시스템의 입력과 출력 모두로부터 멀리 위치할수록 정책의 수준은 높아진다
그림 19.1 간단한 암호화 프로그램
암호화 프로그램을 다음처럼 작성한다면 그렇게 된다
function encrypt() {
while(true) {
writeChar(translate(readChar()));
}
}
고수준인 encrypt 함수가 저수준인 readChar와 wrtieChar 함수에 의존하기 때문
그림 19.2 시스템의 더 나은 아키텍처를 보여주는 클래스 다이어그램
단일 책임 원칙과 공통 폐쇄 원칙에 따르면 동일한 이유로 동일한 시점에 변경되는 정책을 함께 묶인다
고수준 정책, 즉 입력과 출력에서부터 멀리 떨어진 정책은 저수준 정책에 비해 덜 빈번하게 변경되고, 보다 중요한 이유로 변경되는 경향이 있다
모든 소스 코드 의존성의 방향이 고수준 정책을 향할 수 있도록 정책을 분리했다면 변경의 영향도를 줄일 수 있다
이 논의는 저수준 컴포넌트가 고수준 컴포넌트에 플러그인되어야 한다는 관점으로 바라볼 수도 있다
그림 19.3 저수준 컴포넌트는 고수준 컴포넌트에 플러그인 되어야 한다