문제

나는 의존성 주입에 관한 많은 기사를 읽었고 많은 비디오를 보았지만 여전히 머리를 감을 수가 없습니다.누구든지 그것을 설명할 수 있는 좋은 비유가 있습니까?

저는 Autumn of Agile 스크린캐스트의 첫 번째 부분을 보았지만 여전히 약간 혼란스러웠습니다.

도움이 되었습니까?

해결책

유추? 나는 그것을 줄 것이다 ... 당신의 CD 플레이어 스테레오는 음악이있는 CD없이 쓸모가 없다 ... (CD에 의존한다). 그들이 이미 CD로 CD 플레이어를 만들었다면, 그것은 매우 빨리 지루해 질 것입니다 ...

그래서 그들은 당신이 CD를 "주입"할 수 있도록 그것들을 만들어 플레이어에 의존적입니다. 이렇게하면 매번 다른 것을 주입하고 어떤 주사를 주입하는지에 따라 "다른"행동 (음악)을 얻을 수 있습니다.

유일한 요구 사항은 CD가 있어야한다는 것입니다 호환 가능 이랑 상호 작용 플레이어가 정의합니다. (1992 년 CD 플레이어에서는 블루 레이 디스크를 재생할 수 없습니다.)

다른 팁

내가 생각할 수있는 가장 좋은 비유는 기계공을 고용하는 것입니다.

없이 의존성 주입, 당신은 기계공을 고용하고 기계공은 자신의 도구를 가져옵니다. 그는 도구가 풍부하고 훌륭한 도구를 가지고있을 수 있으며 소켓을 사용해야 할 때 파이프 렌치를 사용하고있을 수 있습니다. 그가 일을 끝내는 한 당신은 알지 못하고 신경 쓰지 않을 수도 있습니다.

와 함께 의존성 주입, 당신은 정비공을 고용하고 당신이 그에게 그의 일을하기를 원하는 도구를 제공합니다. 당신은 당신이 그를 고용하는 일에 가장 적합하거나 가장 적절한 도구라고 생각하는 것을 선택할 수 있습니다.

그것을 "제어의 역전"패턴의 실현으로 생각하십시오. 나는 당신의 문제는 당신이 너무 익숙하다고 생각합니다. 당신은 그것이 그렇게 간단하다는 것을 깨닫지 못합니다.

처음부터 시작합시다.

초기에는 프로그램이 코드를 통해 주어진 경로를 따랐습니다. 호출 된 기능의 순서는 프로그래머가 제공했습니다.

대화식 프로그램과 같은 대부분의 프로그램에서는 어떤 기능이 호출되는지 말할 수 없습니다. GUI 또는 웹 사이트 만보십시오. 어떤 버튼이나 링크가 클릭되었는지는 말할 수 없습니다. 따라서 무슨 일이 일어나고 있는지에 대한 "제어"는 더 이상 프로그램에 있지 않으며 외부 소스에 있습니다. "제어"가 반전되었습니다. 함수는 더 이상 "행동"대신 "듣기"입니다. 할리우드 원칙을 생각해보십시오. "우리에게 전화하지 마십시오. 우리는 당신을 부릅니다." 청취자는이 패턴을 실현하기위한 좋은 예입니다.

IOC는 오늘날의 "대상 지향 세계"에서 함수 또는 "방법"으로 실현됩니다.

"의존성 주입"은 이제 동일하지만 "방법"은 아닙니다. 뭔가를하십시오, 그러나 "개체"를 위해 데이터를 보유하십시오.

데이터는 더 이상 객체를 잡고있는 객체의 일부가 아닙니다. 런타임에 객체에 "주입"됩니다. 할리우드에 머무르기 위해 영화 배우를 생각하고, 비즈니스에 대해 이야기하기 위해 골프를 연주하지만, 몸매를 유지하기 위해, 그녀는 자신을 헐거인을 내려 놓고 근육 체중을 최소화하여 한 번에 하나의 클럽 만 가지고 다닐 수 있습니다.

그래서 골프 코스에서 그녀의 게임은 하나의 클럽에 크게 의존 할 것입니다.

그녀에게 운이 좋으면 캐디들이 있으며, 한 번에 많은 클럽을 들고 다니며, 몇시에 어떤 클럽을 사용할 것인지 지식이 있습니다. 이제 그녀는 골프 클럽을 운반 할 가능성이 제한되어 있습니다. "콘크리트 클럽에 대해 생각하지 말고, 우리는 그들 모두를 알고 적시에 올바른 시간을 제공합니다."

영화 스타는 대상이고 골프 클럽은 대상의 멤버입니다. 그것은 의존성 주입입니다.

"주입"부분에 집중할 수 있습니까? 그 용어를 볼 때, 나는 주사기를 생각합니다. 구성 요소의 종속성을 구성 요소에 푸시하는 프로세스는 구성 요소에 주입되는 것으로 생각할 수 있습니다.

신체와 마찬가지로 의학 방식 (필요한 구성 요소)에 필요한 것이 있으면 몸에 주입 할 수 있습니다.

2003 년 Javapolis 프레젠테이션에서 (슬라이드), Jon Tirsén & Aslak Hellesøy는 Girl a Boy 키스. 나는 그것을 기억하는 것 같습니다 BoyFactory 때때로 '나이트 클럽'으로 알려져 있지만 슬라이드에는 없습니다.

또 다른 비유:당신이 개발자이고 원할 때마다 시장에서 직접 컴퓨터 공학 서적을 주문한다고 가정해 보겠습니다. 판매자와 가격을 알 수 있습니다.실제로 귀하의 회사에 선호하는 판매자가 있을 수 있으며 귀하는 해당 판매자에게 직접 연락할 수 있습니다.이 모든 것이 잘 작동하지만 새로운 판매자가 이제 더 나은 가격을 제공하고 회사에서 '선호' 판매자를 변경하려고 할 수 있습니다.

이 시점에서 다음과 같이 변경해야 합니다. 새 판매자를 사용할 수 있도록 연락처 세부 정보(및 기타 항목)를 업데이트하세요.여전히 직접 주문을 합니다.

이제 그 사이에 새로운 단계를 도입한다고 생각해보세요. 회사에 '도서관' 담당자가 있고 책을 얻으려면 그를 거쳐야 합니다.새로운 종속성이 있는 동안 이제 판매자에 대한 변경 사항이 적용되지 않습니다.판매자가 지불 방식을 변경하거나 판매자 자신이 변경된 경우 이제 사서에게 주문하기만 하면 사서가 책을 가져옵니다.

에서 첫 번째 디자인 패턴을 헤드하십시오:

코드는 저녁에 연꽃처럼 닫아야하지만 아침에는 연꽃처럼 열려 있습니다 (확장)

다른 클래스에 정의 된 동작을 주입하여 디자 리형 개체를 구성 할 수 있습니다. 원래 객체 구조는 많은 변형을 만들기 위해 변경되지 않습니다. 수업이 생성자에 다른 작업자 클래스를 요청하여 주입을 명시하거나 Python과 같은 동적 언어에서 원숭이를 사용할 때 덜 분명 할 수 있습니다.

개인 수업의 비유를 사용하여 기본적인 인간 프레임 워크를 취하고 장기 세트를 전달하고 진화하는 것을 볼 수 있습니다. 그 사람은 장기의 작동 방식을 직접 알지 못하지만 그들의 행동은 예상되는 인터페이스로 확인하고 소유자의 신체적, 정신적 표현에 영향을 미칩니다.

마술사의 손의 속임수! 당신이 생각할 수있는 것은 비밀리에 조작되거나 교체 될 수 있습니다.

삶은 의존성 주입 유사로 가득합니다.

  • 프린터 카트리지
  • 디지털 장치 - 배터리
  • 편지 - 스탬프
  • 음악가 - 악기
  • 버스 기사 님
  • 질병 - 알약

제어의 역전의 본질 (의존성 주입이 구현 된)은 그 관리로부터 물체의 사용을 분리하는 것입니다.

내가 사용하는 비유/예는 엔진입니다. 엔진은 연료를 가동해야합니다. 즉, 연료 중위입니다. 그러나 엔진은 필요한 연료에 대한 책임이 없습니다. 그것은 단지 연료를 '요청'하며 (일반적으로 자동차의 연료 펌프에 의해) 제공됩니다.

엔진이 연료를 요구하지 않는다는 점에서 너무 깊어 보일 때 비유가 무너지기 시작합니다. ECU와 같은 일종의 관리 요소에 의해 주어집니다. ECU를 컨테이너와 비교할 수는 있지만 이것이 얼마나 유효한 지 확실하지 않습니다.

프로젝트 관리자가 앱을 작성하도록 요청합니다.

지금까지 경력 경험을 바탕으로 코드를 작성할 수는 있지만 PM이 원하는 것이 아닐 것입니다.

PM 의존성이 주입 된 경우 더 좋습니다 앱에 대한 사양이 있습니다. 이제 귀하의 코드는 그가 제공하는 사양과 관련이 있습니다.

소스 저장소가 어디에 있는지 들었다면 더 좋습니다.

기술 플랫폼이 무엇인지 알면 더 좋습니다.

이것이 언제 해야하는지 들었다면 더 좋습니다.

등..

나는 큰 비유가 레고 세트를 가진 6 살짜리라고 생각합니다.

당신은 당신의 물건이 레고 벽돌처럼되기를 원합니다. 각각은 다른 모든 것과 독립적이지만 다른 사람과 연결하기위한 명확한 인터페이스를 제공합니다. 그것들을 함께 연결할 때, 두 개의 벽돌이 일치하는 인터페이스를 가지고있는 한 서로 연결하는 두 벽돌은 실제로 중요하지 않습니다.

의존성 주입 프레임 워크는 6 살짜리와 같습니다. 그는 특정 모델을 만들기 위해 특정 벽돌을 하나로 연결하기 위해 지침 (예 : 구성 파일, 주석 등)을 따릅니다.

물론 벽돌의 인터페이스는 매우 일반화되었으므로 여러 가지 방법으로 함께 갈 수 있으므로 6 살짜리가 완전히 다른 모델을 만들기 위해 사용할 수있는 새로운 지침 세트를 쉽게 만들 수 있습니다. 같은 벽돌.

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