"Inversion of Control", "Dependency inversion"및 "Decoupling"의 차이점


80

나는 의존성 반전디커플링 에 관한 이론을 읽고 있는데 둘 사이의 차이점을 볼 수 없습니다.

종속성 반전 은 더 높은 수준의 구성 요소가 더 낮은 수준의 구성 요소에 의존하지 않도록 기능 구성 요소를 분리하는 것을 말합니다.

디커플링 은 같은 일과 그것을 달성하는 방법에 대해 이야기합니다. 그러나 우리는 일을 더욱 엉망으로 만드는 IoC 컨테이너 가 있습니다 . 독립 구성 요소의 런타임 커플 링을 제공하기 때문에 종속성 반전 컨테이너 또는 더 나은 종속성 주입 컨테이너 라고 부르지 않는 이유는 무엇 입니까?

그런 다음 Inversion of Control이 있습니다. 기본적으로 Dependency Inversion 과 동일 하지 않습니까? 같은 것을 설명하는 세 가지 용어가있는 이유는 무엇입니까? 아니면 장님인가요?

  1. 세 가지의 차이점은 무엇입니까?
  2. IoC는 IoC 컨테이너에서 무엇을해야합니까?

@Anton Gogolev : 디커플링은 여분의 "O"와 철자 : en.wikipedia.org/wiki/Decoupling#Software_Development
로버트 Koritnik을

답변:


79

디커플링 은 많은 분야에 적용 할 수있는 매우 일반적인 원칙입니다. 종속성 반전 은 시스템의 상위 레벨을 라이브러리로 분리하고 인터페이스를 사용하여 하위 레벨에서 분리하는 특정 형태의 분리입니다. 이를 통해 주요 재 작업없이 시스템의 하위 레벨 부품을 교체 할 수 있습니다.

예를 들어 시스템의 상위 레벨 부분이 하위 레벨 클래스의 구체적인 인스턴스를 생성하는 대신 IoC 컨테이너를 사용하여 객체 생성 방법을 분리 할 수 ​​있습니다.

Inversion of control 은 프레임 워크가 응용 프로그램에서 일부 제어 권한을 다시 얻을 수 있도록하는 프레임 워크 라이브러리에서 사용하는 디자인 원칙입니다. 즉, 윈도우 프레임 워크는 특정 사용자 인터페이스 이벤트가 발생할 때 애플리케이션 코드를 다시 호출 할 수 있습니다. Martin Fowler는 Do n't call us, we 'll call you 에서와 같이 Hollywood Principle 이라는 용어를 사용합니다 . 디커플링은 제어 반전의 중요한 부분입니다.

그러나 IoC 컨테이너 는 제어 반전과 어떤 관련이 있습니까? Martin Fowler를 인용하려면 :

Inversion of Control은 너무 일반적인 용어이므로 사람들은 혼란스러워합니다. 다양한 IoC 옹호자들과 많은 논의를 통해 우리는 Dependency Injection이라는 이름을 정했습니다.

(Martin Fowler가 종속성 반전이 아니라 종속성 주입 에 대해 이야기 합니다.)

IoC 컨테이너는 종속성 주입을 구현하는 데 도움이되며 더 나은 용어는 종속성 주입 컨테이너입니다. 그러나 IoC 컨테이너 이름은 고정 된 것 같습니다. 종속성 주입은 종속성 반전에서 중요한 구성 요소이지만 IoC 컨테이너를 종속성 주입에 사용하면 제어 반전이 더 광범위하고 일반적인 원칙이므로 혼란 스러울 수 있습니다.

이름 지정이 매우 일관 적이지는 않지만 이러한 용어가 겹치더라도 독립적으로 발명되고 사용 되었기 때문에 큰 놀라움은 아닙니다.


나는 동의하지만 IoC 컨테이너라는 용어는 당신이 말했듯이 실제로는 정확하지 않기 때문에 사용하지 않을 것입니다. DI 컨테이너의 원리를 이해하는 사람이라면 누구나 올바른 이름을 이해할 수 있어야하기 때문에 여기에서 (잘못된) 인기있는 이름 지정 체계를 따르는 것은 중요하지 않다고 생각합니다.
Andrey Shchekin 2010 년

49

의존성 주입 은 Inversion of Control을 사용하여 Decoupling 을 달성 합니다 .


4
그것이 제어의 반전을 생각 하거나이 종속성 반전 불구하고 ? 나는 그것이 후자라고 말하고 싶습니다.
Robert Koritnik 2010 년

1
실제로 -1이 커플 "제어 반전"이라는 용어 "의존성 주입". 의존성 주입은 그 자체로 분리 기술입니다.
Mauricio Scheffer

2
@Mauricio : 저는 Dependency InjectionDecoupling 또는 Decoupling 기술 이라고 생각하지 않습니다 . DI는 분리 된 구성 요소를 결합하는 수단을 제공합니다. 그 반대는 아닙니다.
Robert Koritnik

4
흠 ... 의존성 주입은 Inversion of Control의 한 형태이지만 반드시 많은 디커플링을 달성하지는 않습니다. Dependency Inversion은 디커플링을 수행하며 Inversion of Control Container와 함께 Dependency Injection을 사용하여 촉진됩니다. 도움이되거나 더 혼란 스럽습니까?
ben

jeez enough는 다음과 같이 말했습니다 :( 보리스의 좋은 글이었습니다. 모든 작업을 수행하는 데는 너무 많은 방법이 있습니다. 중요한 것은 팀 내 신뢰와 존경심이 있다는 것입니다. 가장 순수한 관점에서는 소프트웨어 디자인 원칙을 사용할 수 없습니다. 그들에 관한 책 팀워크가 자신의 작업에 최적과 확신이 있다면이 존재했다.
마이크 SOCHA III에게

26

martinfowler.com 의 Wild 기사 에서 DIP 의 다음 설명 을 쉽게 이해할 수 있습니다 (여기서 DI = Dependency Injection, DIP = Dependency Inversion Principle, IoC = Inversion of Control).

DI는 한 개체가 종속성을 얻는 방법에 관한 것입니다. 종속성이 외부에서 제공되면 시스템은 DI를 사용합니다. IoC는 누가 통화를 시작하는지에 관한 것입니다. 코드가 호출을 시작하면 컨테이너 / 시스템 / 라이브러리가 사용자가 제공 한 코드로 다시 호출하면 IoC가 아닙니다.

반면에 DIP는 코드에서 호출하는 메시지로 전송되는 메시지의 추상화 수준에 관한 것입니다. (...) DI는 배선, IoC는 방향, DIP는 [코드가 의존하는 물체의] 모양에 관한 것입니다.


5
"DI는 배선, IoC는 방향, DIP는 [코드가 의존하는 물체의] 모양에 관한 것입니다." 그것은 좋은 문장이었다)
아미르 Ziarati

1
마지막 문장에서 단어 모양이 혼란 스러워요. 이미 언급 된 것 외에는 아무것도 추가하지 않는 것 같습니다. DIP는 추상화에 관한 것입니다. IoC는 누구 에 관한 것이고 , DIP는 무엇 에 관한 것이고, DI는 방법관한 것 입니다. 누가 종속성을 제어합니까? 종속성에 의해 추상화되는 것은 무엇입니까 ? 종속성은 어떻게 전달됩니까?
jaco0646

2

의존성 반전 : 결론이 아니라 추상화에 의존합니다.

제어 반전 : 메인 대 추상화, 메인이 시스템의 접착제 인 방법.

DIP 및 IoC

다음은 이에 대해 이야기하는 좋은 게시물입니다.

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.