답변:
참고 : 이것은 이전 예제에서 완전히 다시 작성되었습니다.
전원 소켓에 대해 생각해보십시오. 어느 국가에서나 높은 수준의 정책은 전원 소켓이 항상 동일하다는 것입니다. 어디에서 전기 (석탄, 가스, 원자력)로부터 전기를 얻는지는 중요하지 않습니다. 벽면의 소켓은 항상 동일한 커넥터 세트를 통해 동일한 양의 전력을 방출해야합니다.
이제 모든 장치에 "플러그"라는 공통 인터페이스가 있으므로 해당 장치를 해당 소켓에 꽂을 수 있습니다. 높은 수준의 정책은 해당 구현 세부 사항을 지시 할 필요가 없습니다. 무언가를 연결하면됩니다.
이제 AC 전원을 원하지 않는 장치 (아마도 7V DC 회로에서 작동 할 수 있음)가있는 경우에도 여전히 높은 수준의 정책을 사용할 수 있으므로 전원 공급 장치와 장치 사이에 일종의 어댑터 만 있으면됩니다. 또한 모든 사람이 동일한 수준의 정책을 가지고 있기 때문에 제조업체는 수준 높은 정책을 변경하지 않고도 구현에 구현할 수 있습니다. 구현을 정책에 연결하는 사람 (노트북 연결)은 실제로 이해할 필요가 없습니다.
또한 제조업체가 다른 국가에서 동일한 장치를 판매하려는 경우 다른 어댑터를 개발하기 만하면됩니다. 따라서 동일한 구현은 여러 정책에서 작동 할 수있는 반면 동일한 정책은 여러 구현을 실행할 수 있습니다.
이것은 의존성 역전의 완벽한 예입니다.
그러나 흥미로운 부분은 다음과 같습니다. 내가 처음 말한 것으로 돌아가십시오. "전기를 어디에서 가져 오는지는 중요하지 않습니다." 이것은 또한 구현 세부 사항입니다. 높은 수준의 정책은 여전히 모든 전원 소켓의 모양이 동일하고 동일한 유형의 전원을 방출하는 것입니다. 낮은 수준의 구현 세부 사항은 전기가 어디에서 나오는지와 전기가 어디에서 나오는지 모두입니다.
프로그래밍 용어로, 상위 수준의 정책은 API가 제공하고 응용 프로그램이 소비하는 인터페이스 (언어가이를 지원하는 곳, DI의 다른 형태는 덕 타이핑)이며 하위 수준의 구현 세부 정보는 모두 응용 프로그램과 API 자체를 소비하므로 서로를 이해할 필요가 없습니다.
동일한 구현을 다른 정책에 맞추기 위해 어댑터를 사용할 수 있습니다.
소프트웨어 재사용의 일반적인 접근 방식은 다른 것에 의존하지 않는 (즉, 저수준으로 만드는) 구성 요소를 구축 한 다음 하위 수준의 구성 요소에 의존하는 더 높은 수준의 구성 요소를 구축하는 것입니다. "높은 수준"과 "낮은 수준"은 구성 요소의 기능에 내재 된 것이 아니라 종종 건축 적 결정에 의존하는 종속성의 방향에 의해 구체적으로 결정됩니다.
따라서 단일 비즈니스 응용 프로그램이 워크 플로 자동화에 의존하지 않고 구축되었지만 워크 플로 컨트롤러가 비즈니스 응용 프로그램에 직접 의존하는 경우 워크 플로 자동화가 "고수준 정책"이고 비즈니스 응용 프로그램이 "낮은 수준"구성 요소. 이 구조는 필수는 아닙니다. 워크 플로 자동화 구성 요소가 특정 비즈니스 응용 프로그램과 연결되지 않고 다른 응용 프로그램을 제공하도록 구성 될 수있는 일반 프레임 워크 인 경우 이미 DIP 적용을 시작했습니다. 이 상황에서 "높은 수준"/ "낮은 수준"분리는이 두 가지 사이에 더 이상 의미가 없을 수 있습니다.
따라서 "종속성 반전 (dependency inversion)"이라는 이름은 다소 오해의 소지가 있습니다. 종속성이 "반전"되지는 않지만 완전히 제거되기 때문입니다 (또는 더 정확하게 말하면 컴파일 시간 종속성에서 런타임 종속성으로 변경됨).
간단한 이미지를 사용하여 DIP를 설명합니다. 소프트웨어 개발에 대한 고전적인 견해는 각 계층이이를 지원하는 하위 계층 위에 배치되는 구성 프로세스입니다. 의존성 역전 원리를 사용하는 것은 모바일을 만드는 것과 비슷합니다.
하위 계층에있는 상위 계층이 아니라 모바일 인터페이스의 상위 계층이 하위 계층과 연결되는 문자열을 통해 하위 계층과 연결됩니다. 어떤 식 으로든 하위 계층은 지원할 인터페이스에 의존합니다 (문자열없이). 간단히 말해 DIP입니다.