의존성 주입은 어떻게 복잡성을 별도의 클래스로 옮기는 것이 아닙니까?


9

이번 주에 의존성 주입에 Typhoon 프레임 워크를 사용하는 방법을 조사했습니다. 객체 구성을 분리하면 단위 테스트 중에 임의의 구성 요소를 모의 객체로 대체하는 데 도움이되며 지금까지 이것만으로도 이점을 얻었습니다.

그러나 수십 개의 헤더 가져 오기가있는 거대한 뷰 컨트롤러 클래스가 있기 전에 수십 개의 헤더 가져 오기가있는 거대한 팩토리 클래스가 있다고 생각합니다. 대규모 공장 수업을 피해야합니까?


6
10 년 안에 DI가 Singleton의 bashing 목록을 인수 할 것으로 예상하지만 이번에는 좋은 이유가 있습니다. 좋은 사용법이 있지만 영향을 평가하는 데 매우 신중하게 제안합니다.
Balog Pal

5
의존성 주입은 복잡성을 줄이는 방법이 아니라 명시 적 종속성 (명시 적 매개 변수 / 바운드 변수 사용)을 위해 암시 적 종속성 (전역 기호 / 자유 변수 사용)을 피하는 방법이라고 생각합니다. 따라서 복잡성은 여전히 ​​있지만 메서드 / 생성자 서명에서 명시 적으로 만들었으므로 처리해야합니다.
조르지오

7
코드 구성을위한 거의 모든 시스템은 "복잡성을 다른 곳으로 옮기는 것"으로 설명 할 수 있습니다. 가장 논리적이고 유용한 방식으로 복잡성을 정리하는 것만 큼 복잡성을 제거하는 것이 아닙니다.

1
50 개의 헤더를 가져와야 할 경우 어딘가에 가져와야합니다. DI를 사용하면 코드를보다 쉽게 ​​단위 테스트 할 수 있습니다.
BЈовић

2
이제 컨트롤러가 제어에 중점을두고 헤더 가져 오기 팩토리가 헤더 가져 오기에 중점을두고 있다고 말하고 있습니까? DI 프레임 워크를 사용하든 그렇지 않든, 어떻게 나쁜 일이 될 수 있습니까?
pdr

답변:


16

의존성 주입은 단순히 한 개체가 다른 종속 개체에 대해 어떻게 알고 있는지 정의하는 데 도움이됩니다. 시스템의 전체적인 복잡성을 줄이는 데 도움이되지는 않습니다. DI 이전에 수십 개의 수입품이 필요한 경우에도 수십 개의 수입품이 필요합니다. 차이점은 이러한 수입품이 더 의미있는 장소 (공장, 건축업자 등)에 있다는 점입니다.

생성자 또는 메소드를 통해 종속성을 제공함으로써 클래스에 여전히 다르지만 여전히 유효한 종속 오브젝트를 제공하고 우려를 제거하여 해당 클래스의 응집력을 높일 수있는 유연성을 스스로에게 허용합니다.

DI (Dependency Injection), IoC (Inversion of Control) 및 DIP (Dependency Inversion Principle)와 유사하고 종종 함께 사용되는 몇 가지 원칙이 있습니다.

이 기사에서 http://martinfowler.com/articles/dipInTheWild.html

DI는 배선에 관한 것이고, IoC는 방향에 관한 것이고, DIP는 형상에 관한 것이다.


2
마지막 인용의 경우 +1 사람들이 종종 오해하는 것은이 3 가지 개념을 가장 잘 설명하는 것입니다.
haylem

위의 링크 된 기사는 정말 훌륭합니다. 충분히 깊고 매우 명확한 설명.
DemetriKots

10

의존성 주입은 복잡성을 줄이지 않지만 문제를 분리하고 결합을 줄임으로써 관리 가능성을 높입니다.

그러나 수십 개의 헤더 가져 오기가있는 거대한 뷰 컨트롤러 클래스가 있기 전에 수십 개의 헤더 가져 오기가있는 거대한 팩토리 클래스가 있다고 생각합니다. 대규모 공장 수업을 피해야합니까?

당신은 "엄청난"수업, 기간을 피해야합니다. 뷰 컨트롤러를 더 작고 유지 관리가 쉬운 클래스로 분할한다고 가정 해 봅시다. 이제 그들 모두는 그들의 의존성을 붙잡을 책임이 있습니다. DI는 이러한 종속성 관리를 모든 해당 클래스 에서 종속성 관리 만을 담당 하는 팩토리 / 구성 클래스로 옮길 수 있도록 도와줍니다 ( 단일 책임 원칙 참조). 그리고 원래 뷰 컨트롤러보다 훨씬 덜 "풍선 적"이지만 너무 커지면 항상 응용 프로그램의 다른 부분을 담당하는 더 작은 종속성 관리 클래스로 분할 할 수 있습니다.


2

평신도의 말로 :

의존성 주입은 복잡성을 덜 해치는 곳으로 복잡성을 이동시킵니다.

@gnat에 대한 편집 : DI는 복잡성을 별도의 클래스로 옮기는 것이 아니라 덜 해를 끼치는 곳으로 옮깁니다.


이것은 질문에 어떻게 대답합니까?
gnat

@gnat은 편집을 추가했으며 내 대답은 DI가 어떻게 복잡성을 별도의 클래스로 옮기는 것이 아니라고 설명합니다.
Tulains Córdova
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.