: 의존성 역전 원칙에서 추구하는 유연성이 극대화된 시스템이란 소스 코드 의존성이 추상에 의존하며 구체에는 의존하지 않는 시스템이다.
: 자바와 같은 정적 타입 언어에서 이 말은 use, import, include와 같은 구문은 오직 인터페이스나 추상 클래스와 같은 추상적인 선언만 참조해야한다는 것
: 물론 말도 안되는 얘기, String 클래스는 구체 클래스이지만 이를 추상 클래스로 전환하려고 하지는 않는다. 또한 변경이 잘 발생하지 않는 매우 안정적인 클래스다
: 이로 인해 DIP를 논할 때, 운영체제나 플랫폼 같이 안정성이 보장된 환경에 대해서는 무시하는 편이다.
: 우리가 의존하지 않도록 피하고자 하는 것은 항상 변동 가능성이 높은 구체적인 요소
안정된 추상화
: 추상 인터페이스에 변경사항 → 해당 인터페이스 구현체에 수정사항 발생 O
: 추상 인터페이스 구현체에 변경사항 → 해당 인터페이스에 수정사항 발생 X
⇒ 즉 추상 인터페이스는 추상 인터페이스 구현체에 비해 변동성이 더 낮다.
: 안정된 소프트웨어 아키텍트란 변동성이 큰 구현체에 의존하는 일은 지양하고 안정된 추상 인터페이스를 선호하는 아키텍처란 뜻이다.
1.
변동성이 큰 구체 클래스를 참조하지 말라, 대신 추상 인터페이스를 참조하라
2.
변동성이 큰 구체 클래스로부터 상속받지 말라, 상속은 신중하게 사용하라
3.
구체 함수를 오버라이드 하지 말라, 추상 함수로 선언하고 구현체에서 각자의 용도에 맞게 구현
4.
구체적이며 변동성이 크다면 절대로 그 이름을 언급하지 말라
팩토리
: 바람직하지 못한 의존성을 처리할 때 사용하는 방버
: 제어흐름은 소스 코드 의존성과는 반대 방향으로 흐른다. 이런 이유로 해당 원칙을 의존성 역전이라고 부른다.
구체 컴포넌트
: 구체 컴포넌트 내에서 발생하는 구체적인 의존성은 존재할 수 있다.
: 모든 DIP 위배를 없앨 수는 없다. DIP를 위배하는 클래스들을 적은 수의 구체 컴포넌트 내로 모을 수 있고 이를 통해 시스템의 다른 부분들과 격리시킬 수 있다.
결론
: 고수준의 아키텍처를 다루게되면서 DIP는 아키텍처 다이어그램에서 가장 눈에 띄는 원칙이 될 것이다.
: 잘 알아두자