의존성 주입은 어떻게 커플 링을 증가 시키는가?


32

의존성 주입 에 대한 Wikipedia 페이지 의 단점 섹션에서이를 알려줍니다.

종속성 주입은 서브 시스템 사용자가 해당 서브 시스템의 요구를 제공하도록 요구함으로써 커플 링을 증가시킵니다.

의존성 주입대한 기사 링크 .

의존성 주입은 클래스가 구체적인 구현 대신 인터페이스를 사용하도록합니다. 그 결과 커플 링 이 줄어 듭니다 .

내가 무엇을 놓치고 있습니까? 의존성 주입은 클래스 간 결합을 어떻게 증가시키고 있습니까?


2
누가 그 단점 목록을 썼는지 잘 모르겠지만 소금 한 덩어리로 가져갈 것입니다. 예를 들어, DI가 수많은 중복 설정 코드를 제거하여 코드베이스의 크기를 2/3 줄인 것을 보았습니다.
Rob

@RobY 나는 주로 의존성을 주입하기 위해 팩토리를 사용했으며 내 경험에 따르면 코드 크기는 증가하지만 테스트는 단순화된다는 것입니다.
BЈовић

Registry 또는 Context Passing;)과 같은 대안을 사용해보십시오. 또는 객체를 인스턴스화 한 다음 구성에서 속성을 가져 오는 코드입니다. 주로 지금과 15 년 전의 차이점에 대해 이야기하고 있습니다.
Rob

관련 : stackoverflow.com/a/9503612/264697 . Mark Seemann의 답변은 Dependency Injection을 사용하여 전체 커플 링을 줄이는 방법을 설명합니다.
Steven

답변:


42

그래서, 내가 무엇을 놓치고 있습니까?

종속성 주입은 클래스와 해당 종속성 간의 연결을 줄입니다. 그러나 클래스와 소비자 (소비자가 정보를 작성하기 위해 더 많은 정보가 필요하기 때문에)와 종속성과 소비자 (소비자가 사용할 종속성을 알아야하기 때문에) 사이의 연결을 증가시킵니다.

종종 이것은 좋은 트레이드 오프입니다. 클래스는 인터페이스를 넘어 의존성에 대한 세부 사항을 알지 않아야 하며, 특정 코드 비트를 함께 묶는 것은 애플리케이션의 책임 이어야 합니다.


맞습니다. 커플 링은 한 방향으로 줄어들고 다른 한 방향으로 늘어납니다.
Paul Draper

그러나 소비자는 그것을 만들지 않습니다. 오히려 요점입니다.
케이시

@emodendroket-응? 제어 반전은 소비자가 제어를 만들지 못하게합니다. 의존성 주입은 그것과 직교합니다.
Telastyn

글쎄, 당신은 일반적으로 용어가 상호 교환 가능하기 때문에 익숙하지 않은 구별을하고 있습니다.
케이시

22

S데이터베이스 연결에 의존 하는 서브 시스템 이 있다고 가정하십시오 D. 의존성 주입이 없으면 사용 방법과 작성 방법을 모두 알아야 하기 때문에 S와 사이에 비교적 밀접한 결합 이 있습니다. 시스템의 나머지 부분은, 그러나, 사이의 의존성 행복하게 인식 될 수 및 .DSDSD

의존성 주입과 함께 사이의 커플 링 SD당신이에서 제거하기 때문에, 패자가된다 S를 만드는 방법에 대한 지식 D. S사용 방법을 알아야합니다. 전체 커플 링의 증가는 이제 시스템의 다른 부분에 대해 알고 있어야 D하는 방법과 가능한 방법에 대한 것입니다. 이 커플 링의 증가 정도는 의존성이 어떻게 D주입 되는지에 달려 있습니다 S.

  • 으로 생성자 주입 의 창조자 S요구에 대한 종속성 D가능성이 지식을 어떻게 하나를 만들 수 있습니다.
  • 메소드 레벨 인젝션을 사용하면 메소드 가 주입 S되는 메소드의 각 호출자는 메소드를 작성하는 방법에 D대한 종속성 D및 가능한 지식이 필요합니다 .

두 경우 모두 시스템에 어딘가에 스틸 D을 생성하는 방법과 지식 D이 필요합니다. 이로 인해 커플 링이 전반적으로 증가합니다.


좋아, 생성자와 setter 주입에 적합합니다. 그러나 팩토리 또는 전략 패턴을 사용하는 경우 생성이 이동되고 클래스는 주입 된 개체 만 사용합니다. 아니면 의존성 주입이 아닌가 (제어의 역전)입니까?
BЈовић

팩토리 인젝션을 사용하더라도, 제작자는 S의 팩토리를 공급해야합니다. D즉, 그 S용도 D(또는 적어도 일부 인터페이스) 를 알아야합니다 .
Idan Arye

7

나는 그것이 커플 링을 증가 시킨다는 것에 동의하지 않는다.

종속성 주입이 없으면 하위 시스템과 종속성의 구체적인 구현간에 긴밀한 연결이 있습니다.

종속성 주입을 사용하면 하위 시스템을 종속성 구현에서 분리했습니다.

소비자는 이러한 서브 시스템 사이의 결합 증가 시킨다는 주장 만들기이다 VERY 은 소비자가 현재 단단히 서브 시스템에 의해 요구 된 종속성에 결합되어 있듯이 의심. 그것은 소비자를 종속성에 연결하는 밀접하게 결합 된 코드를 작성한다는 것을 의미합니다. 이상적으로는 모든 코드가 분리되어 있습니다.

생성자 주입 :

의존성 해결은 의존성 주입 컨테이너 또는 팩토리에 의해 처리됩니다. 소비자는 의존성 주입 컨테이너 또는 팩토리에서 서브 시스템의 구체적인 구현을 얻을 수 있습니다.

소비자는 서브 시스템의 생성자가 어떤 모습인지 알 필요가 없습니다. 서브 시스템 종속성에 대한 커플 링이 없습니다.

방법 주입 :

이제 소비자가 컨테이너 또는 팩토리에서 종속성의 구체적인 인스턴스를 가져 와서 메소드 / 생성자를 주입해야한다는 점을 제외하고 생성자 주입과 동일합니다. 다시, 소비자는 의존성의 구체적인 구현과 관련이 없다.

TL; DR 서브 시스템에서 의존성 주입에 대한 최악의 경우는 커플 링이 소비자 코드로 이동한다는 것입니다. 커플 링의 전반적인 증가는 없습니다.

가장 좋은 경우는 모든 시스템이 느슨하게 결합되고 종속성 주입 컨테이너 또는 팩토리를 통해 종속성 주입이 제어되는 것입니다.

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