4 가지 집단에 의존성 주입 패턴이 포함되지 않은 이유는 무엇입니까?


37

왜 의존성 주입 패턴 이 4 명의 갱에 포함 되지 않았 습니까? GOF는 광범위한 자동 테스트를 시작 했습니까? 의존성 주입은 이제 핵심 패턴으로 간주됩니까?


18
.. "종속성 주입"은 패턴
Dipan Mehta


14
반복되는 모든 것은 반복의 패턴을 형성합니다. 독창적이고 미친 아이디어가 아닌 모든 디자인 요소는 "패턴"입니다.
S.Lott

3
이러한 긴 응답은 아마도 질문의 유효성을 검사하기 때문에 오해의 소지가 있습니다. 언급 된 바와 같이, 의존성 주입은 디자인 패턴이 아니다. 일반적으로 프레임 워크에서 처리하는 객체 인스턴스화의 "메커니즘"입니다.
Nazar Merza

1
의존성 주입 은 패턴 입니다. 그것은 반대 서비스 로케이터 패턴을. 용어를 만든 파울러 를 읽으십시오 . 나는 얼마나 많은 사람들이 그런 말도 안했는지를 전혀 모른다.
제임스

답변:


100

저는 Gang of Four 책이 나왔을 때 Software Development 잡지의 편집자였으며 , 1994 년에 Design Patterns 가 처음 출판 되었을 때 단위 테스팅이 널리 퍼져 있지 않다는 확신을 가질 수 있습니다 .

1994 년에 C ++은 가장 일반적으로 사용되는 객체 지향 언어였으며 대부분의 사람들은 C 배경에서 프로그래밍했습니다. 사람들이 가지고 있지 않은 "사물에 대한 생각"중 하나는 프로그램에 수백 또는 수천 개의 진입 점이 있다는 것입니다. 에 대해 생각했습니다 main(). 대규모 프로젝트에서 작업 한 경우 모듈 기반 프로그램을 작성하는 (보통 상당히 정교한) make 파일이있을 수 있습니다. 그러나 "단위 테스트"? , 프로세스 시작을 실행하여 필요한 메모리 컨텍스트를 구축하고, 상, 아래로 찢어 있어서 당 기준? 그것은 매우 급진적이었습니다.

Java는 다중 입력 포인트 프로그래밍을보다 명확하게 만들었습니다. 최초의 Dot-Com 붐 시대에 단위 테스트는 잘 알려진 기술 이었지만 실제로는 JUnit (2001 년경?)으로 인해 화재가 발생하여 보편적 인 관행이되었습니다.

하지만 전략 및 인터페이스에 프로그래밍의 일반적인 개념의 GoF의 일부와 90 년대 중반은 시대 정신의 아이디어 주입 파티에 아주 늦게 온 ('03 -'05 년경?). 솔직히, 내 회색 머리카락은 여전히 ​​DI의 그 측면에 대해 매우 모호합니다 ( "잔디를 벗으십시오, 구성 파일을 감히하십시오!").


17
그런 통찰력있는 답변을하기 위해 한 번만 투표 한 것이 유감입니다.

@Larry OBrien : 컨벤션 기반 등록을 검색하면 구성 코드가 크게 단순화되고 ioc 컨테이너에서 XML 구성이 실질적으로 제거됩니다.
quentin-starin

4
핵심에 의존성 주입이 구성 파일에 전혀 의존하지 않는다는 것을 추가하고 싶습니다. 손으로 직접 할 수 있으므로 사용하기가 매우 쉽고 여전히 유연한 접근 방식입니다.
marco-fiset

31

그들은 그것을 전략 이라고 불렀습니다 .

그들의 전략에는 복잡한 이름이없는 의존성 주입의 모든 기능이있는 것 같습니다.


16
-1. 죄송합니다! 전략 패턴은 Dependency Injection과 관련이 없습니다.
Dipan Mehta


14
@ Dipan : 이것을 하향 조정하기 전에 5 분 대답에 대해 더 잘 생각하십시오.
Doc Brown

6
의존성 주입은 전략 패턴과 매우 유사하다고 생각할 수 있지만 사람들이 의존성 주입을 말할 때 일반적으로 제어의 반전을 의미합니다.
MattDavey 2013

8
DI는 더 창조적 인 패턴입니다. 전략을 만들고 주입합니다. 그것이 전략이라고 말하는 것은 진실의 절반에 지나지 않습니다. DI는 더 마이크로 커널 패턴입니다! 나는 사람들이 이것을지지한다고 믿을 수 없다. 전략은 필수 DI가 아니라 좋은 DI의 특성과 비슷합니다.
팔콘

0

계층에서 구현을 분리 할 때 Dependency Injection이 더 관련이 있다고 생각합니다. 의존성 주입에 대해 생각하는 또 다른 영역은 단위 테스트입니다. 그리고 당신의 이전 제안은 올바른 것 같습니다. 갱단이 2012 년에 패턴을 수집하고 분리하는 경우, 의존성 주입이 분명히있을 것입니다.

전략은 토론에서 나올 수 있지만 전략은 의존성 주입에 대해 이야기하지 않습니다. 그러나 단일 프로젝트 또는 dll (모든 클래스와 인터페이스가 하나의 프로젝트에 남아 있음)에서 전략 패턴을 사용할 때 종속성 주입을 수행하는 것으로 보입니다. 사실 우리는 그렇지 않습니다.

이제 전략 패턴에서 언급 된 클래스와 인터페이스가 다른 프로젝트 또는 계층으로 분리 된 경우 의존성 주입 기술을 사용해야합니다. 단일 구성 파일을 사용할 수 있습니다 (런타임 변경은 불가능합니다). 그러나 전략 패턴은 의존성을 주입하는 방법을 말하지 않습니다.

의존성 주입과 매우 유사한 패턴이 있으면 추상 팩토리 메소드 패턴입니다. 이 패턴은 전략 패턴 내부에서 사용되어 종속성을 주입 할 수 있습니다.


2
이것은 질문에 대답하지 않습니다. 다른 답변에 답하는 대신 원래 질문을 읽으십시오. :)
Andres F.

-4

답변 전략은 100 % 정확합니다. 나는 그것을 투표했지만 의견을 말할 수 있습니다.

"전략은 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변화시킬 수 있습니다. [1] 전략은 Gamma 등의 영향력있는 책 Design Patterns에 포함 된 패턴 중 하나로서, 소프트웨어 디자인을 설명하기 위해 패턴을 사용하는 개념을 대중화했습니다."

디자인 패턴은 그 사용에 의존하지 않습니다. 종속성 주입은 전략 패턴을 사용하여 구현됩니다. 유스 케이스를 기준으로 각 패턴의 이름을 지정하면 많은 패턴의 이름을 바꿔야합니다.

리포지토리 패턴은 새로운 패턴이 아니라 템플릿 패턴입니다.

"이 디자인 패턴의 템플릿 방법에서 하나 이상의 알고리즘 단계를 서브 클래스로 대체하여 다른 동작을 허용하면서도 중요한 알고리즘을 계속 준수 할 수 있습니다."

종종 패턴은 MVC 패턴과 같이 여러 패턴이 결합되어 명명됩니다.

GOF에는 사용 된 Pure Abstract 클래스 인터페이스가 없었으며 C ++의 여러 클래스에서 상속 할 수있는 기능도 활용했습니다.


1
패턴의 목적은 구별하는 데 절대적으로 중요합니다. GoF 패턴 중에서 Adapter와 Proxy는 좋은 예입니다. 형식은 동일하지만 목적이 다릅니다. 또한 DI가 전략을 사용하여 구현되었다는 귀하의 주장에 동의하지 않습니다. 전략의 목적과 구성된 개체의 사용 방식이보다 구체적이므로 전략은 DI로 구현된다고 말하는 것이 더 합리적입니다.
Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.