Dependency Inversion Principle : 다른 사람에게“높은 수준의 정책”과“낮은 수준의 세부 사항”을 정의하는 방법은 무엇입니까?


13

나는 (주로 후배) 동료들에게 의존성 역전 원리를 설명하려고합니다. 소프트웨어에서 어떤 정책이 "고수준 정책"이고 어떤 정책이 "저수준 세부 사항"인지 어떻게 정의 할 수 있습니까? 예를 들어 소프트웨어가 여러 비즈니스 응용 프로그램의 워크 플로를 자동화하는 경우 워크 플로 자동화가 고급 정책이고 비즈니스 응용 프로그램이 세부 정보라고 말하는 이유는 무엇입니까?

답변:


11

참고 : 이것은 이전 예제에서 완전히 다시 작성되었습니다.

전원 소켓에 대해 생각해보십시오. 어느 국가에서나 높은 수준의 정책은 전원 소켓이 항상 동일하다는 것입니다. 어디에서 전기 (석탄, 가스, 원자력)로부터 전기를 얻는지는 중요하지 않습니다. 벽면의 소켓은 항상 동일한 커넥터 세트를 통해 동일한 양의 전력을 방출해야합니다.

이제 모든 장치에 "플러그"라는 공통 인터페이스가 있으므로 해당 장치를 해당 소켓에 꽂을 수 있습니다. 높은 수준의 정책은 해당 구현 세부 사항을 지시 할 필요가 없습니다. 무언가를 연결하면됩니다.

이제 AC 전원을 원하지 않는 장치 (아마도 7V DC 회로에서 작동 할 수 있음)가있는 경우에도 여전히 높은 수준의 정책을 사용할 수 있으므로 전원 공급 장치와 장치 사이에 일종의 어댑터 만 있으면됩니다. 또한 모든 사람이 동일한 수준의 정책을 가지고 있기 때문에 제조업체는 수준 높은 정책을 변경하지 않고도 구현에 구현할 수 있습니다. 구현을 정책에 연결하는 사람 (노트북 연결)은 실제로 이해할 필요가 없습니다.

또한 제조업체가 다른 국가에서 동일한 장치를 판매하려는 경우 다른 어댑터를 개발하기 만하면됩니다. 따라서 동일한 구현은 여러 정책에서 작동 할 수있는 반면 동일한 정책은 여러 구현을 실행할 수 있습니다.

이것은 의존성 역전의 완벽한 예입니다.

그러나 흥미로운 부분은 다음과 같습니다. 내가 처음 말한 것으로 돌아가십시오. "전기를 어디에서 가져 오는지는 중요하지 않습니다." 이것은 또한 구현 세부 사항입니다. 높은 수준의 정책은 여전히 ​​모든 전원 소켓의 모양이 동일하고 동일한 유형의 전원을 방출하는 것입니다. 낮은 수준의 구현 세부 사항은 전기가 어디에서 나오는지와 전기가 어디에서 나오는지 모두입니다.

프로그래밍 용어로, 상위 수준의 정책은 API가 제공하고 응용 프로그램이 소비하는 인터페이스 (언어가이를 지원하는 곳, DI의 다른 형태는 덕 타이핑)이며 하위 수준의 구현 세부 정보는 모두 응용 프로그램과 API 자체를 소비하므로 서로를 이해할 필요가 없습니다.

동일한 구현을 다른 정책에 맞추기 위해 어댑터를 사용할 수 있습니다.


크리 키 +1 내가 간단한 전원 소켓에서 많은 것을 배울 수 있다는 것을 몰랐다 :)
dreza

7

소프트웨어 재사용의 일반적인 접근 방식은 다른 것에 의존하지 않는 (즉, 저수준으로 만드는) 구성 요소를 구축 한 다음 하위 수준의 구성 요소에 의존하는 더 높은 수준의 구성 요소를 구축하는 것입니다. "높은 수준"과 "낮은 수준"은 구성 요소의 기능에 내재 된 것이 아니라 종종 건축 적 결정에 의존하는 종속성의 방향에 의해 구체적으로 결정됩니다.

따라서 단일 비즈니스 응용 프로그램이 워크 플로 자동화에 의존하지 않고 구축되었지만 워크 플로 컨트롤러가 비즈니스 응용 프로그램에 직접 의존하는 경우 워크 플로 자동화가 "고수준 정책"이고 비즈니스 응용 프로그램이 "낮은 수준"구성 요소. 이 구조는 필수는 아닙니다. 워크 플로 자동화 구성 요소가 특정 비즈니스 응용 프로그램과 연결되지 않고 다른 응용 프로그램을 제공하도록 구성 될 수있는 일반 프레임 워크 인 경우 이미 DIP 적용을 시작했습니다. 이 상황에서 "높은 수준"/ "낮은 수준"분리는이 두 가지 사이에 더 이상 의미가 없을 수 있습니다.

따라서 "종속성 반전 (dependency inversion)"이라는 이름은 다소 오해의 소지가 있습니다. 종속성이 "반전"되지는 않지만 완전히 제거되기 때문입니다 (또는 더 정확하게 말하면 컴파일 시간 종속성에서 런타임 종속성으로 변경됨).


1
좀 빠지는. 낮은 레벨은 인터페이스에 의존하기 때문에 반전이 발생합니다. 인터페이스 분리 원리 (SOLID의 I)를 적용하면 해당 인터페이스가 클라이언트에 "포함"됩니다. 따라서 하위 수준은 은유 적으로 클라이언트에 의존합니다.
Michael Brown

2
@ MikeBrown : 그것은 가능한 한 가지 관점입니다. 인터페이스가 A 나 B가 아니라 A와 B의 인프라 나 환경에 속하는 관점을 선호합니다.
Doc Brown

1

간단한 이미지를 사용하여 DIP를 설명합니다. 소프트웨어 개발에 대한 고전적인 견해는 각 계층이이를 지원하는 하위 계층 위에 배치되는 구성 프로세스입니다. 의존성 역전 원리를 사용하는 것은 모바일을 만드는 것과 비슷합니다.교수형 모바일

하위 계층에있는 상위 계층이 아니라 모바일 인터페이스의 상위 계층이 하위 계층과 연결되는 문자열을 통해 하위 계층과 연결됩니다. 어떤 식 으로든 하위 계층은 지원할 인터페이스에 의존합니다 (문자열없이). 간단히 말해 DIP입니다.


좋은 비교를 위해 +1. 이 그림에서 내 요점을 볼 수 있습니다. 모든 레이어는 인터페이스에 따라 다르지만 더 높은 레이어에서는 하위 레이어가 아니고 그 반대도 아닙니다.
Doc Brown

나는 당신이 말하는 것을 보았습니다. 인터페이스는 더 높거나 낮은 수준에 속하지 않습니다.
Michael Brown

1
그는 DIP를 설명하는 방법을 묻지 않았으며 응용 프로그램의 어느 부분이 높은 수준의 정책이고 어떤 부분이 낮은 수준의 구현인지 설명하는 방법을 묻습니다. 당신의 비유는 그렇게하기 위해 멀리 확장 될 필요가 없습니다. 문자열을 변경하지 않고 장식을 변경할 수 있어야합니다 (높은 수준의 모바일 정책이 장식 구현에 대해 너무 자세한 정보를 가질 수없는 경우).
pdr

1
(실제로 다른 소재로 완전히 새로운 모바일을 제작하고 동일한 장식을 걸 수 있습니다
-Doc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.