Dependency inversion principle
OOP의 가장 중요한 특성 중 하나다.
DIP와 순환 의존
디자인의 순환 의존을 풀 수 있는 방법 중 하나이기도 하다. 한 쪽 dependency를 generalization으로 바꿔주기.
DIP를 소프트웨어 설계가 아닌 곳에 적용하기
이 원칙을 XP 프랙티스에도 적용할 수 있겠다. 예를 들어 리팩토링을 하려면 단위 테스트가 꼼꼼하게 붙어있어야 한다. 그래야 코드의 외적 행위가 유지되고 있다는걸 확신할 수 있기 때문. 그런데, 단위 테스트를 꼼꼼하게 붙이려면 기존 코드를 테스트하기 쉽도록 리팩토링 해야한다. 애초부터 TDD로 개발된 코드가 아니라면, 두 실천법 사이에 일종의 순환 의존이 생긴다.
DIP를 적용하여 순환 의존을 끊어줄 수 있다. 리팩토링이라는 프랙티스보다 좀 더 추상적인 뭔가를 만들고, 단위 테스트라는 프랙티스가 리팩토링이 아닌 추상화된 프랙티스에 의존하게 바꾸면 된다. 리팩토링을 일반화한 다른 프랙티스를 통해 단위 테스트를 하기 용이한 코드를 얻어내는 것. 이와 관련된 여러가지 팁들이 Working effectively with legacy code 등에 소개되어 있다.
반대로, 단위 테스트를 추상화하고 리팩토링이 추상화된 단위 테스트에 의존하게 만들 수도 있을 것.
이런 생각을 2006년 자바 컨퍼런스 발표 때 언급했었는데 전달이 잘 됐는지 모르겠다. —AK, 2006