[dependency-injection] “Inversion of Control”, “Dependency inversion”및 “Decoupling”의 차이점

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

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

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

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

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



답변

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

예를 들어 시스템의 상위 레벨 부분이 하위 레벨 클래스의 구체적인 인스턴스를 생성하는 대신 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 컨테이너를 종속성 주입에 사용하면 제어 반전이 더 광범위하고 일반적인 원칙이므로 혼란 스러울 수 있습니다.

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


답변

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


답변

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

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

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


답변

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

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

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/


답변