제어 반전은 종속성 반전과 어떤 관련이 있습니까?


12

웹 전체의 많은 기사에서 제어 및 종속성 반전 원칙이라는 용어는 혼합되어 동의어로 사용되는 것으로 보입니다 (더 혼란은 "DI 컨테이너"및 "IoC 컨테이너"라고하는 도구에 의해 시행됩니다). Wikipedia 기사 는 IoC가 DI와 동일하지 않다는 것을 설명하려고 노력합니다.

IoC (inversion of control)는 컴퓨터 프로그램의 사용자 지정 작성 부분이 재사용 가능한 일반 라이브러리에서 제어 흐름을받는 디자인을 설명합니다.

따라서 DIP는 모듈이 구체적인 구현이 아닌 추상화에 의존하도록하는 것입니다.

그리고 IoC는 별도의 모듈에 대한 프로그램 흐름을 제어합니다. 이 모듈로 할 수있는 것 중 하나는 런타임시 종속성을 해결하는 것입니다.

이 차이는 공평 해 보이지만 의존성 해결 이외의 IoC 원칙에 대한 다른 응용 프로그램은 언급 한 적이 없습니다. Wikipedia 정의는 상당히 광범위하며 구성 및 일부 내부 논리에 따라 사용자 정의 코드를 호출 할 수있는 모듈을 사용하여 훨씬 더 많은 것을 할 수있는 것처럼 보입니다.

그래서 아직 알 수없는 몇 가지 질문이 있습니다.

  • IoC와 DIP의 실제 관계는 무엇입니까? IoC는 항상 DIP를 구현하는 수단으로 사용됩니까?
  • 종속성 해결 도구가 DI 컨테이너와 IoC 컨테이너라고하는 이유는 무엇입니까? 이것은 DI와 IoC가 같은 것을 의미합니다.

참고 :이 질문은 DI와 IoC의 차이점무엇입니까? 와 중복되지 않습니다. 후자는 의존성 반전이 아니라 의존성 주입에 대해 묻기 때문입니다.



@gnat, 아니, 그렇지 않습니다 내 편집을 참조하십시오
Andre Borges

동의합니다, 죄송합니다
gnat

2
IMO, 간단한 대답은 "동일하다"입니다. IoC는 종속성 반전의 또 다른 이름이며 둘 다 종속성 주입을 달성하는 방법입니다. 나는 "종속성 반전 (dependency inversion)"이 주입과 너무 쉽게 혼동되기 때문에 매우 도움이되지 않는 용어로 본다. DI (주입)가 있고 IoC는 주입을 통해 의존성 / 제어의 반전을 달성하는 방법입니다.
David Arno

답변:


6

Martin Fowler의 사이트에는 DIP, DI 및 IoC의 차이점에 대한 장이 있는 훌륭한 기사가 있습니다 . 그 사이트의 요점은 (그 사이트에서 복사 한)

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

반면에 DIP는 코드에서 호출 한 메시지로 전송 된 메시지의 추상화 수준에 관한 것입니다. 확실히, DIP와 함께 DI 또는 IoC를 사용하는 것은 표현력이 뛰어나고 강력하며 도메인 정렬되는 경향이 있지만 전반적인 문제에서 크기 나 힘이 다릅니다. DI는 배선에 관한 것이고, IoC는 방향에 관한 것이고, DIP는 형상에 관한 것이다.


2
IoC는 누가 통화를 시작하는지에 관한 것입니다. 누가 통화를 시작 합니까? 내가 쓴다면 ISomeInterface object = container.Resolve<ISomeInterface>()그 IoC인가?
Andre Borges

1
작성하는 것은 서비스 로케이터 패턴의 구현입니다. 이것은 또한 IoC입니다. IoC는 ISomeInterface object = new MyClass ()입니다. 따라서 의미하는 호출은 "인스턴스 호출 (call to instantiation)"(또는 '새로운'호출)입니다.
Sjoerd222888

1
"DIP는 다른 한편으로, 코드에서 호출 한 것으로 전송 된 메시지의 추상화 수준에 관한 것입니다." 그건 말도 안되는 것 같습니다. 그 반전은 어디에 있습니까? 그는 반전이 아닌 의존성 추상화를 설명하고 있습니다.
David Arno

@DavidArno, 우리는 Martin Fowler의 웹 사이트를 믿을 수 없다고 말하고 있습니까?
holdenmcgrohen

@holdenmcgrohen, 사물에 대한 그의 의견입니다. 그것이 마틴 파울러이기 때문에 사실이 아닙니다. 그는 예를 들어 "빈혈 데이터 모델"과 관련하여 IMO에 잘못되었습니다. 다른 때는 그의 매우 통찰력이 있습니다. 이 경우에 나는 그가 말이되지 않기 때문에 그가 틀렸다고 생각한다.
David Arno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.