의존 관계 역전 원칙 (Dependency Inversion Priciple; DIP)
A. 고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야한다.
B. 추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다.
쉽게 말하자면, '자주 변경되는 구체 클래스(concrete class)에 의존하지 마라'. 만약 어떤 클래스에서 상속받아야 한다면, 기반 클래스를 추상 클래스로 만들어라.
어떤 클래스의 참조(reference)룰 가져야 한다면, 참조 대상이 되는 클래스를 추상 클래스로 만들어라. 만약 어떤 함수를 호출해야 한다면, 호출되는 함수를 추상 함수로 만들어라.
- 추상 클래스와 인텊에ㅣㅅ느느 보통 자신에게서 유도된 구체적인 클래스보다 훨씬 '덜 변한다'
- 그러므로 구체적인 것보다는 이런 추상적인 것에 의존하는 편이 낫다.
- 이 원칙을 지키면 어떤 변경이 생겼을때 시스템에 미치는 영향도를 줄일 수 있다.
우리가 의존하면 안되는 것은 '자주 변경되는' 구체 클래스다. 활발히 개발 중인 구체 클래스나 변경의 여지가 높은 비즈니스 규칙을 담을 클래스가 여기에 속한다.
UML을 사용하면 이 원칙을 지키는지 매우 쉽게 검사할수 있다.
- UML 다이어그램의 화살표마다 따라가서 의존하는 것이 인터페이스나 추상 클래스를 가리키는지 확인하면 된다. 만약 구체 클래스에 의존하는데 그 클래스가 자주 변경된다면, DIP를 위반하는 것은 아닐지 의심해봄직 하다.
만약 그렇다면 그 시스템은 변경에 민감하게 되어버릴 것이다.