문제

(Inversion of Control 또는 IoC)매우 혼동 될 수 있습니다면 그것은 첫째 발생했습니다.

  1. 그것이 무엇입니까?
  2. 는 문제를 해결 하는가?
  3. 할 때 그것은 적합하지 않을 때 사용하는?
도움이 되었습니까?

해결책

의 반전 제어(IoC)및 종속 사출(DI)패턴에 대한 모든 종속성 제거에서 당신의 코드입니다.

예를 들어,응용 프로그램에 텍스트 편집기로 구성요소를 제공하려 맞춤법 검사합니다.귀하의 표준 코드는 다음과 같이 보일 것이다:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

우리가 여기서 무엇을 했는지를 만들 간의 종속성 TextEditorSpellChecker.에 IoC 시나리오를 우리는 것이 대신 다음과 같은 것이 가능합니다.

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

에서 첫 번째 코드를 들어 우리는 인스턴스화 SpellChecker (this.checker = new SpellChecker();),는 것을 의미하는 TextEditor 클래스에 따라 달라집 SpellChecker 클래스입니다.

에서 두 번째 코드를 들어 우리는 우리를 만드는 추상화함으로써 SpellChecker 종속성을 클래스 TextEditor 생성자 서명(초기화하지 않은 속국에서 클래스).이것은 우리에게 전화를 종속성한 다음 전달 TextEditor 클래스는 다음과 같이

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

이제 클라이언트를 만들기 TextEditor 클래스를 통해 제어하는 SpellChecker 구현을 사용하기 때문에 우리가 주입에 의존하 TextEditor 서명이 있습니다.

이것은 단순한를 들어,거기에 좋은 기사의 시리즈 Simone Busoli 설명하는 그것은 더 세부 사항입니다.

다른 팁

Inversion of Control 은 당신이 무엇을 얻을 때 당신의 프로그램을 콜백을,예를 들어,다음과 같 gui 프로그램입니다.

예를 들어,에서 메뉴에서,당신은 수도:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

함으로써의 흐름을 제어하는 사용자가 상호 작용입니다.

에서는 GUI 프로그램이나 같은걸 대신 우리는 말:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

그래서 지금 제어를 역...대신 컴퓨터가 받아들이고 사용자 입력 고정된 순서로,사용자 정의 컨트롤하는 순서는 데이터 입력과 데이터가 데이터베이스에 저장됩니다.

기본적으로, 아무것도 이벤트 루프 콜백 또는 실행 트리거 이 범주에 속합니다.

는 무엇입 Inversion of Control?

을 따르는 경우 이러한 두 가지 간단한 단계를 수행해야 합니 반전의 제어:

  1. 별도의 what할 부분에서 할 부분입니다.
  2. 는지 확인 부분적으로 으로 가능한 대 what 부;고 그 반대입니다.

거기에 몇 가지 기술이 가능한 이러한 각각의 단계에 따라 기술/언어를 사용에 대한 귀하의 구현합니다.

--

반전 의 부분의 반전 제어(IoC)은 혼란스러운 일;기 반전 상대 기간이다.을 이해하는 가장 좋은 방법은 IoC 에 대해 잊지하는 단어입니다!

--

  • 이벤트 처리가 있습니다.이벤트 처리기(무슨 할 일부)--이벤트 발생(면 할 일)
  • 인터페이스가 있습니다.클라이언트 구성 요소(할 때 할 부분)--구성요소 인터페이스 구현(무슨 할 일)
  • 버전 전등 설비입니다.설치 및 해체(무슨 할 일부)--버전 프레임워크를 호출하여 설정 시작 부분에서 및 분해 끝에(면 할 일)
  • 템플릿 방법을 디자인 패턴입니다.템플릿 방법을 때-할 부분은 원래 구현 무엇을 할 부분
  • DLL 컨테이너 방법이다.DllMain,DllCanUnload,etc(무슨 할 일부)--COM/OS(면 할 일)

반전의 제어에 대해 분리하는 문제입니다.

없이 IoC:당신이 노트북 컴퓨터리고 당신은 실수로 끊는 화면입니다.그리고,당신이 찾아 같은 모델 노트북의 화면은 아무것도 없는 곳에서 시장.그래서 당신은 문제가 발생하였습니다.

IoC:당신이 데스크톱 컴퓨터리고 당신은 실수로 끊는 화면입니다.당신은 당신을 찾을 수 있습을 잡고는 거의 모든 데스크톱 모니터링 시장에서,그리고 잘 작동합니다.

데스크톱 성공적으로 구현하에서 열린 이 경우입니다.그것을 허용한 다양한 유형의 모니터,노트북하지 않는,필요한 특정을 수정했습니다.

Inversion of Control,(또는 IoC),대 자유를 얻기 (당신이 결혼을 얻을,당신은 잃어버린 자유와 당신은 제어되고 있다.당신이 이혼을 구현한 반전의 제어합니다.는 우리가 무엇이라고,"분리".좋은 컴퓨터 시스템이 낙담한 몇 가지 아주 가까운 관계이다.) 더 많은 유연성 (부엌에서 당신의 사무실에만 제공 청소 탭 물,그것은 당신 만의 선택을 위해 마시고 싶을 때.당신의 보스를 구현한 반전의 통제를 설정하여 새로운 커피 머신이 있습니다.지금 당신은 당신을 얻을 선택할 수 있는 유연성을 중 탭 물이나 커피입니다.) 고 덜 의존성 (의 파트너에는 작업에,당신은 일이 있지 않는다,당신은 더 쉽게 따라 달라집에서 당신의 협동자,그래서 당신이 통제된다.당신이 직업을 찾을,구현한 반전의 제어합니다.좋은 컴퓨터 시스템을 장려하에서 의미할 수 있습니다.)

를 사용할 경우 데스크탑 컴퓨터,당신은 종속(또는 말한 제어).당신이 앉아 있고 전에 스크린과 그것을 보십시오.를 사용하여 종류의 키보드와 마우스를 사용하여 탐색 할 수 있습니다.와 심하게 작성된 소프트웨어할 수 있는 노예를 공유할 수 있습니다.할 경우를 대체 데스크탑 노트북,당신은 약간 거꾸로 제어합니다.당신은 쉽게 그것을 가지고 주위에 이동합니다.그래서 지금 제어할 수 있습니다 당신은 당신의 컴퓨터는 대신,컴퓨터를 제어하다.

을 구현하여 반전의 제어,소프트웨어/소비자체 얻어/옵션 소프트웨어/체,대신 통제되거나 적은 옵션이 있습니다.

위의 아이디어에서 마음입니다.우리는 여전히 미스의 핵심 부분 IoC.시나리오에서의 IoC,소프트웨어/소비자체입니다 정교한 프레임 워크입니다.수단을 만든 코드를 호출하지 않습니다.지금 왜 이 방법은 더 나은 작품에 대한 웹 응용 프로그램입니다.

가정 코드 노동자의 그룹입니다.을 구축하는 데 필요한 차량입니다.이러한 노동자들이 필요한 장소 및 도구(소프트웨어 프레임워크)자동차를 만들.A 전통적인 소프트웨어 프레임워크처럼 될 것입니다 그리고 많은 도구입니다.그래서 노동자가 필요한 계획을 만들기 위해 자신과 도구를 사용하여 자동차를 만들.건물의 차이는 쉽지 않은 비즈니스,그것은 정말 열심히 노동자는 계획하고 협력합니다.A 현대 소프트웨어 프레임워크 것처럼 현대적인 자동차 공장으로 모든 시설 관리자니다.노동자가 있지 않을 계획,관리자(부분의 프레임워크,그들은 똑똑한 사람들하고 가장 정교한 계획)데 도움이 될 것입 좌표하도록 노동자가 알고있을 때 그들의 일을 하는(프레임워크를 호출하는 코드).이동해야 사용할 수 있을 만큼 유연 어떤 도구 매니저는 그들에게 줄(를 사용하여 종속성을 주입).

하지만 이주 노동자의 통제를 관리하는 프로젝트에서 최고 수준을 관리자(프레임워크).그러나 그것은 좋은 일부 전문가 돕고 있습니다.이것은 개념의 IoC 실에서 왔습니다.

현대적인 웹 응용 프로그램 MVC 아키텍처에 의존한 프레임워크를 할 URL 라우팅 및 넣어 컨트롤러에 위치한 프레임워크를 호출합니다.

성 주입하고 반전의 통제와 관련이 있습니다.성 주입에 마이크로 레벨과 반전의 제어 매크로 수준입니다.당신이 먹는 모든 물(을 구현 DI)기 위해서 식사를 마무리하는(을 구현 IoC).

사용하기 전에 반전의 제어에 대해 잘 알고 있다는 사실은 그 장단점과 당신이 알고 있어야 왜 당신은 그것을 사용하는 경우 그렇게 할 수 있습니다.

장점:

  • 귀하의 코드가 분리된 그래서 당신은 쉽게 교환할 수 있습의 구현과 인터페이스 구현 대체
  • 그것은 강한 동기를 위한 코딩에 대하여는 대신 인터페이스 구현
  • 그것은 매우 쉽게 쓰기에 대한 단위 테스트 코드에 의존하기 때문에 아무것도 다른 객체보다 그것을 받아에서 그것의 생성자/세터와 당신은 쉽게 초기화할 수 있습으로 그들을 권체에서 격리됩니다.

단점:

  • IoC 뿐만 아니라 반전의 흐름 제어 프로그램에서,그것은 또한 그것은 상당히 구름.이할 수 있음을 의미는 더 이상 단지 코드를 읽고 이동이 한 장소에서 다른 장소이기 때문에 연결하는 일반적으로 코드의하지 않은 코드에서는 더 이상.그 대신 XML 파일 구성하거나 주석과의 코드에 당신의 IoC container 해석하는 이러한 메타데이터가 포함되어 있습니다.
  • 가 발생한의 새로운 클래스 버그는 당신이 당신의 XML 구성하거나 주석을 잘못하고 있는 많은 시간을 보내는 이유를 알아내는 당신의 IoC 컨테이너를 주입 null 참조로 하나의 객체를 특정 조건에서.

개인적으로 나오는 강한 포인트의 IoC 및 정말 그들처럼 나만을 방지하는 경향이 있 IoC 가능하기 때문에 그것은 당신의 소프트웨어의 컬렉션에는 클래스가 더 이상을 구성하"진짜"프로그램이지만 뭔가가 될 필요가에 의해 함께 넣어 XML 구성하거나 주석을 메타데이터와 빠질 것(폭포)외에도 없습니다.

  1. 위키 문서.나의 반전 제어이 돌을 순차적으로 작성된 코드 및으로 전환하는 것은 위임 구조입니다.대신 프로그램이 명시적으로 제어하든,당신의 프로그램을 설정 클래스 라이브러리 또는 특정 기능이라고 할 때 어떤 일이 일어난다.

  2. 를 해결 코드를 제공합니다.예를 들어,옛날에 당신 수동으로 자신의 이벤트 루,폴링 시스템 라이브러리에 대한 새로운 이벤트입니다.요즘 가장 현대적인 Api 당신은 단순히 말해 시스템 라이브러리 이벤트에 관심이 있고 그것은 당신이 알고있을 때 그들은 일어난다.

  3. Inversion of control 은 실제적인 방법으로 코드를 줄이기 위해 중복,그리고 자신을 발견하면 전체를 복사하는 방법에만 변화하는 작은 조각의 코드를 고려할 수 있습 태클과 반전의 제어합니다.Inversion of control 을 쉽게 많은 언어로 개념을 통해의 대리자,인터페이스,또는 원 함수 포인터입니다.

    그것은 적절하지 않은 모든 경우에 사용하기 때문에,프로그램의 흐름 어려울 수 있는 때에 따라 이 방식을 사용하여 작성됩니다.그것은 유용한 방법을 디자인하는 방법을 작성할 때 도서관는 재사용 될 것이다,하지만 그것은 사용하지 않는 것이 핵심 자신의 프로그램지 않는 한 그것은 정말 해결 코드를 복제 문제입니다.

그러나 내가 생각하는 당신은 매우 조심해야합니다.는 경우 용이 패턴,당신은 매우 복잡한 디자인을 더욱 더 복잡한 코드입니다.

다음과 같이 예 TextEditor:하나만 있을 경우 맞춤법 검사기 어쩌면 그것은 정말을 사용할 필요가 IoC?지 않는 한 당신은 필요한 단위 테스트를 작성하거나 무언가를...

어쨌든:야 합리적이다.디자인 패턴 좋은 사례 하지만 성경을 설교합니다.충실하지 않다.

당신이 당신의 개체.그리고 당신은 레스토랑:

없이 IoC:당신이 요청"apple",그리고 당신은 항상 제공되는 애플 요청할 때 더 있습니다.

IoC:요청할 수 있습니다"fruit".당신이 얻을 수 있는 다른 과일 당신은 각 시간을 제공합니다.예를 들어,사과,오렌지,또는 물 멜론입니다.

그렇게 분명히,IoC 이 선호하는 경우 다음과 같은 종류가 있습니다.

IoC/디을 밖으로 밀어내는 종속성을 부르다.매우 간단합니다.

비 잘내는 대답이 있을 교환하는 엔진에서 자동차를 켭니다.는 경우 모든 후크 바로(인터페이스),당신은 좋습니다.

  1. 반전의 제어를 위해 사용되는 패턴을 분리 부품 및 층 시스템입니다.패턴을 구현을 통해 주사를 종속성으로 구성요소를 구성합니다.이러한 의존성은 일반적으로 제공으로 인터페이스에 대한 추가 분리 및 지원하 테스트 편의성도 높아집니다.IoC/디 컨테이너와 같은 성 윈저,통일 도구(라이브러리)사용할 수 있는 제공을 위한 IoC.이러한 도구는 확장된 기능을 위한 간단한 종속성 관리를 포함하여 평생 AOP/차단,정책,etc.

  2. 니다.을 완화하고 구성 요소에서 책임 관리하기 위한 그것의 종속성입니다.
    b.하는 기능을 제공합 스왑 종속성을 구현에서는 다양한 환경에 적합합니다.
    c.할 수 있는 구성 요소 테스트를 통해 조롱의 종속성입니다.
    d.제공하는 메커니즘을 공유하는 리소스를 통해 응용 프로그램입니다.

  3. 니다.중요한 때 일을 테스트 기반의 개발이다.없이 IoC 어려울 수 있을 테스트하기 때문에,구성 요소 테스트에서는 고도로 결합하는 나머 시스템입니다.
    b.중요한 개발할 경우 모듈형 시스템입니다.모듈형 시스템은 시스템의 구성 요소로 대체될 수 있 다시 컴파일하지 않고.
    c.중요가 있는 경우 많은 크로스 커팅 문제는 해결 partilarly 엔터프라이즈니다.

나는 아래 간단한 내의 이해 이 두 가지 용어

For quick understanding just read examples*

성 주입(DI):
성 주입 일반적으로 의미 지나가는 개체는 방법에 따라 달라집으로서,메서드에 매개 변수,오히려 이상을 가지는 방법을 만들이 종속체.
에서 무엇을 의미하는 연습은 방법이 적용되지 않습을 직접 따라 특정 구현모든 구현에 요구 사항을 충족하는 전달될 수 있을 매개 변수로 사용할 수 있습니다.

이 객체를 말해 자신의 종속성입니다.봄게 됩니다.
이 끈을 느슨하게 결합된 응용 프로그램 개발.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inversion of Control(IoC)컨테이너:
이것은 일반적인 특징의 프레임워크 IOC java 오브젝트 관리
–에서 인스턴스화를 파괴를 통해 그것의 생성.
-Java 구성 요소는 인스턴스화 IoC 에 의해 컨테이너라고 합 콩고 IoC container 를 관리하는 빈의 범위를 수명 주기 이벤트,그리고 어떤 기능 AOP 는 그것이 구성되었으며 코드입니다.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

을 구현하여 반전의 제어,소프트웨어/소비자체 얻어/옵션 소프트웨어/체되는 대신 통제하거나 이 옵션이 있습니다.

Inversion of control 디자인 가이드라인으로 다음과 같은 목적을 제공한다:

거기 디커플링의 실행 특정 작업에서 구현됩니다.
모든 모듈에 집중할 수 있습니다 그것이 무엇을 위해 설계되었습니다 것입니다.
모듈 가정하지 않는 것에 대해 다른 시스템에 의존하지만 자신의 계약입니다.
대체하는 모듈은 다른 모듈
나는 일을 계속 추상적인,여기에 당신이 방문 할 수 있습 다음과 같은 링크에 대한 세부사항을 이해의 주제입니다.
좋은 읽기와 예제

에 대한 자세한 설명

응답만의 첫 번째 부분입니다.그것이 무엇입니까?

Inversion of Control(IoC)단 인스턴스를 만들의 종속성을 처음과 후자의 클래스의 인스턴스(선택적으로 주입을 통해 생성자),인스턴스를 만드는 대신의 클래스고 그 다음에 첫 번째 클래스의 인스턴스 인스턴스를 만들의 종속성입니다.따라서,반전의 제어 반전의 흐름을 제어 의 프로그램입니다. 수신자가 제어의 흐름을 제어 (을 만드는 동안 종속성)에 발신자의 흐름을 제어하 제어 프로그램.

예를 들어,작업#1 개체를 만들.없이 IOC 개념,작업#1 를 수행하여 프로그래머입니다.하지만 IOC 개념,작업#1 에 의해 행해질 것입니다 컨테이너입니다.

에서 짧은 제어져오는 반전 프로그래머에서 컨테이너입니다.그래서,그것은으로 불리는 반전의 제어합니다.

내가 발견 중 하나는 좋은 예 .

게 말을 우리가 만드는 일부 회의에서 몇 가지 호텔입니다.

많은 사람들이,많은 주병의 물,많은 플라스틱 컵입니다.

누군가가고 싶은 마시고,그녀는 채운 컵을 마시고 던져 컵의 바닥에 있습니다.

운영 시간 이후에는 우리가 무언가 바닥 덮여의 플라스틱 컵 및 물.

자전 제어합니다.

동 회의에서 같은 장소,하지만 그 대신 플라스틱 컵 우리는 웨이터가 가진 하나의 유리컵(싱글)

그녀는 모든 시간을 제공하실다.

을 때 누군가를 마시고 싶은 그녀에서 얻을 웨이터는 유리,마시고,반드시습니다.

를 떠나 이외의 질문은 위생적이,마지막의 형태를 마시는 프로세스 제어 훨씬 더 효과적이고 경제적입니다.

그리고 이것은 정확히 무엇을 봄(다른 IoC 컨테이너,예를 들어:쥬스와)는 않습니다.대신에게 응용 프로그램을 만들 그것이 무엇을 사용하여 필요한 새로운 키워드(복용 플라스틱 컵),봄 IoC 컨테이너의 모든 시간 제공하는 응용 프로그램은 동일한 인스턴스(단일)필요한 물체(유리의 물).

에 대해 생각으로 자신을 주최자의 모임입니다.하는 방법을 필요로하는 메시지의 호텔 관리

회의 회원들이 필요는 유리의 물러하지 않습니다.

예제:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

유용한 링크:-

동의 NilObject, 지만,나 이에 추가하려면:

자신을 발견하면 전체를 복사하는 방법에만 변화하는 작은 조각의 코드를 고려할 수 있습 태클과 반전의 제어

는 경우에 당신은 자신을 찾을 복사 및 붙여넣기 코드의 주위에,당신은 거의 항상 잘못입니다.성문화된 디자인으로 원리 한 번만.

그것은 보인다는 가장 복잡한 것에 대해"IoC"의 약자와의 이름을 그대는 너무 매력적인 의 이름이 거의 소음을 이름입니다.

우리가 정말 필요는 이름의 차이를 설명하기 위해 절차 및 이벤트 기반 프로그래밍이 가능한가요?고 확인,우리가 필요하지만,우리가 선택해야 새로운 브랜드를"보다 더 큰 인생"이름을 혼동하는보다 더 많은 해결?

IoC 에 대한 반전 사이의 관계 코드고 타사 코드(라이브러리/프레임워크):

  • 에서 정상적인 s/w 개발,당신이 쓰 main() 방법 및 전화"라이브러리"방법이 있습니다. 당신 어:)
  • 에 IoC"기구"컨트롤 main() 및 통화의 방법이 있습니다.이 Framework 제어:(

DI(성 주입)이는 방법에 대해 컨트롤에 흐르고 있다.기존의 데스크톱 응용 프로그램 제어 흐름에서의 응용 프로그램(main()메소드)다른 라이브러리 메소드를 호출하지만,DI 제어 흐름이 거꾸로 하는 프레임워크 관리의 시작용,초기화하고 호출하는 방법을 때마다 필요합니다.

결국 당신은 항상 승:)

Inversion of control 이에 갈 때 당신은 식료품점과 당신의 아내를 제공합 제품의 목록입니다.

프로그래밍 측면에서,그녀는 콜백 함수 getProductList() 하는 함수를 실행하는- doShopping().

그것은 사용자의 기능을 정의하는 그것의 일부를 만드는 더 유연합니다.

매우 간단한 서면 설명을 여기에서 찾을 수 있습니다

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

그것은 말한다-

"어떤 사소 응용 프로그램의 구성하는 둘 이상의 클래스 서로 협력하여 수행됩니다.전통적으로,각각의 개체에 대한 책임을 얻는 자신의 하는 개체에 대한 참조를 협력으로(그 종속성).적용할 경우 디 오브젝트가 주어진 자신의 종속에서 생성 시간에 의해 외부 엔터티를 조정하는 각 개체에 시스템입니다.다시 말해서,종속성으로 주입된다."

반전의 관점은 일반적인 원리는 동안,종속 사출 실현은 이 원리로 디자인 패턴에 대한 개체 그래프 건설(i.e구성하는 방법을 제어하는 개체들이 참조하는 각각 기타,보다는 개체를 제어하는 방법에 대한 참조를 가져오려면 다른 객체).

보고의 반전트로 디자인 패턴에,우리는 우리에서 볼 필요가 무엇을 우리는 반전.성 주입 반전의 통제를 구성하는 개체의 그래프.게 말한 경우에서 평신도의 기간이,반전의 제어를 의미한 변화의 흐름을 제어 프로그램입니다.예를 들어.에서는 전통적인 독립 응용 프로그램,우리는 주된 방법에서는 제어된 다른 타사 라이브러리(케이스에서,우리가 사용하고 타사 라이브러리의 기능)지만,반전을 통해 제어 컨트롤 전송 되 면에서는 타사 라이브러리 코드를 우리의 코드,우리가 복용하는 서비스의 타사 라이브러리입니다.하지만 다른 측면이 있어야 하는 역 내에서 프로그램-예를 들어,호출의 방법과 스레드를 실행하는 코드입니다.

에 관심있는 사람들을 위해 더 깊이에 반전의 통제 종이 출판되었 개요 더 완전한 그림의 반전의 제어로는 디자인 패턴(OfficeFloor:사무실을 사용하여 패턴을 개선하는 소프트웨어를 디자인 http://doi.acm.org/10.1145/2739011.2739013 복사본을 무료로 사용할 수 있에서 다운로드 http://www.officefloor.net/about.html).

무엇을 식별되는 다음의 관계:

(Inversion of Control 에 대한 방법)=종속성(상태)Injection+연속 Injection+Thread 주입

요약의 관계에 대한 반전의 정의 컨트롤을 사용할 수 있습니다- http://dzone.com/articles/inversion-of-coupling-control

내가 찾은 매우 분명한 예제 는 방법을 설명합니다'제어이 거꾸로'.

클래식 코드(없는 종속성을 주입)

여기에는 코드를 사용하지 않는 디 약동:

  • 응용 프로그램이 필요 Foo(예:컨트롤러),그래서:
  • 응용 프로그램을 만들 Foo
  • 응용 프로그램 호출 Foo
    • Foo 필요가 막대기(예:서비스),그래서:
    • Foo 만듭 바
    • Foo 통화를 바
      • 바이 필요 Bim(서비,저장소,...),그래서:
      • 바 만듭 Bim
      • 바가

를 사용하여 종속성을 주입

여기에는 방법을 사용하여 코드 디 약동:

  • 응용 프로그램이 필요 Foo,필요로 하는 바를 필요 Bim,그래서:
  • 응용 프로그램을 만들 Bim
  • 응용 프로그램을 만들과 바를 제공 그것은 Bim
  • 응용 프로그램을 만들 Foo 을 제공합니 Bar
  • 응용 프로그램 호출 Foo
    • Foo 통화를 바
      • 바가

제어의 종속성는 거꾸로 하나에서 호출되는 것을 하나의 부름입니다.

무엇이 문제를 해결 하는가?

성 주입은 쉽게 교환하는 다른 구현의 주입됩니다.안 장치 테스트에 삽입할 수 있는 거짓을 구현하게하는,많은 테스트하고 쉽습니다.

Ex:다고 가정 응용 프로그램을 저장 사용자는 업로드한 파일에서는 Google 드라이브,DI 컨트롤러 코드는 다음과 같이 보일 수 있습니다:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

을 때 당신의 요구 사항에 변경이 말하는 대신,탐색을 사용하여 보관합니다.당신만을 작성해야 dropbox 구현 StorageServiceInterface.당신 없게 만들에 어떤 변화를 컨트롤러로 Dropbox 구현을 준수하 StorageServiceInterface.

을 테스트하는 동안 당신을 만들 수 있는 모의 대 StorageServiceInterface 으로 이미 구현는 모든 메소드는 null 을 반환(또는 미리 정의된 값으로 당신의 테스트 요구 사항).

대신한 경우 컨트롤러 클래스를 구성하는 개체 스토리지 new 키워드 이:

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

을 변경할 때와 Dropbox 구현을 바꾸어야 합니다 모든 라인 new GoogleDriveService 객체 생성 및 사용 DropboxService.외 테스트할 때 SomeController 클래스 생성자를 항상 기대 GoogleDriveService 등과 실제적인 방법의 이 클래스는 실행됩니다.

할 때 그것은 적합하지 않을 때? 내 생각에 사용할 디 있다고 생각하면(또는이 될 수 있습니다)대체의 구현 클래스입니다.

프로그래밍 말

IoC 에서 쉬운 측면:그것의 사용은 인터페이스는 방법으로의 특정 뭔가(이러한 분야 또는 매개 변수)와일드카드로 사용할 수 있는 몇 가지는 클래스입니다.그것은 다시 사용성의 코드입니다.

예를 들어,말하자는 우리는 두 개의 클래스: 고양이.모두 주식 같은 자질/국:연령,크기,무게.그래서 대신의 클래스를 만들의 서비스 DogServiceCatService, 를 만들 수 있습니다 하라 AnimalService 사용할 수 있도록 개와 고양이만 사용하면 인터페이스 IAnimal.

그러나 실제적으로 말하자면,그것은 거꾸로입니다.

a) 개발자의 대부분은 알고 있지 않은 그것을 사용하는 방법.예를 들어,나를 만들 수 있습니라는 클래스 고객나를 만들 수 있습을 자동으로 (의 도구를 사용하 IDE)인터페이스는 불 ICustomer.그래서,그것은 희소를 찾아 폴더로 가득 클래스와 인터페이스가 있는 경우에 상관없이 인터페이스가 될 것입니다 다시 사용하거나지 않습니다.그것은이라고 부풀어.어떤 사람들은 주장할 수는 있을 것"미래에 있을 수 있습니다 우리는 우리가 그것을 사용할 수 있습니".:-|

b)그것은 몇 가지 limitings.예를 들어,말하자의 경우에 대 고양이 추가하고 싶은 새로운 서비스(기능)만을 위해 개입니다.말하자는 내가 원하는 수를 계산하는 일이 필요하(trainDays()),고양이의 쓸모 없는,고양이를 훈련을 할 수없는 것은 아니다(난 농담).

b.1)추가하는 경우 trainDays() 서비스 AnimalService 그것은 또한 고양이와 그것에 유효하지 않습니다.

b.2)나도 추가할 수 있는 상태에서 trainDays() 어디 그것을 평가하는 클래스가 사용됩니다.하지만 그것은 완전히 중단 IoC.

b.3)내가 만들 수 있습의 새로운 클래스 서비스 DogService 그냥에 대한 새로운 기능을 제공합니다.하지만,그것은 것이 늘리기 때문에 우리는 것이 두 개의 클래스의 서비스(와 유사한 기능을 위해) 그것은 나쁜.

나는 다음과 같이 설명: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

그것은 간단하게 시작하고 코드를 보여 줍니다 예입니다.

enter image description here

소비자,X,필요의 소비스,Y,무언가를 달성하기 위하여.는 모든 서비스는 높은 수준을 자랑하며 자연적인,하지만 엑 정말 알 필요가 사용하는 Y?

만으로는 충분하지 않은 것 X 을 알고 사용하는 뭔가가 있는 행동,방법,특성 등,Y 없이 사람을 아는 것이 실제로 구현하는가?

을 추출하여 추상적인 정의의 행동에 의해 사용되 X Y,그림으로 나는 아래시키는 소비자 X 의 인스턴스를 사용하는 대신 Y 그것은 계속할 수 있는지 그것이 무엇을 하지 않고 세부 사항을 알아에 대한 Y.

enter image description here

위의 그림에서 Y 를 구현하는 내가 및 X 의 인스턴스를 사용하여 I.는 동안 그것은 확실히 가능하 X 여전히 사용하는 Y 흥미로운 것은 X 지 않는 것을 알고.그것은 단지 알고 사용하는 무언가를 구현하는 I.

문서 읽기에 대한 자세한 정보를 원하시면의 설명과 같은 혜택을 제공합니다.:

  • X 에 의존하지 않는 더 이상 Y
  • 더 많은 유연성,구현할 수 있기로 결정했에서 런타임
  • 의 격리 코드 단위,쉽게 테스트

...

내가 이해하는 대답이 이미 주어진 여기에.하지만 나는 아직도 생각하는,일부에 대한 기초적인 반전의 제어야에서 여기에서 논의 길이 미래에 대한 독자.

Inversion of Control(IoC)으로 구축되었다 아주 간단한 원리라 헐리우드 원리.고 그것을 말한 것,

하지 않는 저희에게 문의하십시오,우리는 당신을 부를 것

그것은 무엇을 의미하지 않는 이동 할리우드를 꿈을 성취하고 오히려 당신이 가치가있는 경우에 당신이 그리 찾을 것입니다 당신과 당신의 꿈이 실현된다.꽤 많이 거꾸로,huh?

지금 할 때 우리는 토론에 대한 원칙의 IoC,우리가 사용하는 것을 잊지에 대해 헐리우드.에 대한 IoC,거기에있을 세 가지 요소,헐리우드에,당신과 같은 작업을 당신의 꿈을 실현합니다.

에서 우리의 프로그래밍 세계 할리우드 을 나타내는 일반 프레임워크(기록될 수 있습니다 의 당신은 또 다른 사람), 당신 대표 사용자가 코드에 당신이 쓴 작업 나타내는 것은 당신을 달성하고 싶은 당신의 코드입니다.지금 당신은 이제까지 가을 트리거하여 작업을 자신에 IoC!오히려 당신은 모든 것을 설계에 있는 귀하의 프레임워크에서 트리거를 당신의 작업에 대한 당신.따라서 당신은 내장하고 있는 재사용할 수 있는 프레임 워크를 만들 수 있는 사람이 영웅이나 또 다른 하나는 악당이다.그러나 해당 프레임워크에서 항상 청구,그것이 알고 때를 선택하는 사람과 사람만 그것이 무엇인지 알고 싶어 합니다.

실제 예제에 주어질 것입니다 여기에.가정하고,당신을 개발하려는 웹 응용 프로그램입니다.그래서,당신은 프레임 워크를 만들이 처리하는 모든 일반적인 웹 응용 프로그램이 처리해야 합 처리와 같은 http 요청을 만들고,응용 프로그램 메뉴 제공,페이지,관리하는 쿠키를 유발,이벤트 등등.

그리고 당신은 일부를 떠난 후크에서 당신의 틀을 넣을 수 있습니다 추가 코드를 생성하는 사용자 설정 메뉴,페이지,쿠키를 로깅 또는 일부 사용자 이벤트 등등.모든 브라우저는 요청의 프레임워크에서 실행하고 실행하는 사용자 지정 코드를 경우 중독 봉사한 다음에 그것을 다시 브라우저입니다.

그래서 아이디어가 꽤 많은 간단합니다.을 만들기보다는 사용자가 응용 프로그램을 제어하는 모든 것을 먼저 너를 만들고 재사용할 수 있는 프레임 워크는 모든 것을 제어 다음 쓰기 사용자 지정 코드와 연결하는 프레임워크를 실행하는 그 시간에.

Laravel 및 EJB 의 예는 같은 프레임워크.

참고:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

반전의 제어에 대해 제어를 전송하는 라이브러리에서 클라이언트.더 많은 의미가에 대해 이야기 할 때 우리는 클라이언트는 삽입(전달)함수 값(lambda expression)으로 높이기 위해 기능(라이브러리 함수)컨트롤(변화)동작의 라이브러리 함수입니다.클라이언트나 프레임 워크는 주사 라이브러리 의존성(수행하는 행동)으로 라이브러리로 간주될 수도 있습 IoC

  1. 그래서 번호 1 . 는 무엇입 Inversion of Control?

  2. 유지 보수가 가장 중요한 점은 이를 해결합니다.그것은 나를 사용하여 인터페이스는 두 개의 클래스는 친밀하지요.

에서 사용하여 컨테이너 같은 성 윈저를 해결,유지 관리 문제를 더 나은입니다.할 수 있는 교환하는 구성 요소를 위한 데이터베이스는 사용한 파일 기반의 지속성을 변경하지 않고 코드의 라인은 멋진(구성 변경을 할 수행할 수 있습니다).

그리고 일단 당신을 얻으로 제네릭,더 나은 가져옵니다.상상해보십시오 메시지 발행인을 받는 기록하고 간행한 메시지입니다.그것은 걱정하지 않는 그것이 무엇을 게시,하지만 그것을 필요로 mapper 을에서 뭔가를 기록하는 메시지입니다.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

나는 그것을 썼다면,하지만 지금은 내가 주사할 수 있습니다 많은 형식으로 이 설정 코드의 경우 게시 다른 형태의 메시지입니다.수도 쓰기 매퍼는 기록하는 동일한 유형의 지도들을 서로 다른 메시지입니다.를 사용하여 디으로 제네릭이 있는 능력을 쓰는 아주 작은 코드는 많은 작업을 수행.

Oh yeah,가능성 문제이지만,그들은 보조하는 혜택의 IoC/DI.

나는 확실히 사랑하는 IoC/DI.

3.그것이 더 적절하는 분이 있는 중소 규모의 프로젝트를 좀 더 복잡합니다.말 것은 그것이 된 적절한 분을 시작합니다.

생체 내의 클래스가 호출로 꽉 커플링,봄 이 종속성 제거하여 다음과 같은 디자인 패턴(DI/IOC).에 있는 객체의 클래스에서는 전달에서 생성자를 만드는 대신에서 클래스입니다.더 이상 우리는 수퍼 클래스를 참조하여 변수에서 생성자를 정의하는 좀 더 일반적인 구조입니다.

사용 IoC 당신은 새로운 삶의 개체입니다.귀하의 IoC 컨테이너지 관리의 일생이다.

그것이 문제를 해결하는 수동으로 변경 모든 인스턴스의 한 유형의 객체를니다.

그것은이가 있을 때 적합한 기능을 수 있는 미래의 변화에 또는 그에 따라 다를 수 있습니다 환경 또는 구성됩니다.

개념을 이해하는 데,반전의 통제(IoC)또는 종속성 반전 원리(DIP)를 포함하는 두 개의 활동:추출,및 반전.성 주입(DI)이 단지 하나의 몇 가지의 반전 방법이 있습니다.

에 대한 자세한 이것을 읽을 수 있는 나 블로그

  1. 그것이 무엇입니까?

그것은 당신이자 실제 동작에서 오는 외부의 경계(클래스에서 객체 지향 프로그래밍).경계 엔티티만 알고 있는 추상화(e.인터페이스 g,추상 클래스,대리인에서 객체 지향 프로그래밍)습니다.

  1. 무엇이 문제를 해결 하는가?

에서 용어의 프로그래밍,IoC 을 해결하려고 모놀리식에 의해 코드 그것을 만드는 모듈형,고성능,그리고 각종 부품의로 만들고,그것은 장치-테스트.

  1. 할 때 그것은 적합하지 않을 때?

그것은 적절한 대부분의 시간이 없는 경우 상황은 당신이 원하는 모놀리식 code(e.g 매우 간단한 프로그램)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top