2017-09-03 4 views
1

DI의 기본 개념은 종속성 개체를 종속 개체에서 만드는 대신 전달해야한다는 것입니다. 나는이에 대한 찾을 수Dependency Injection에서 객체를 생성하는 대신 객체를 전달해야하는 이유는 무엇입니까?

만 이유는 this answer에 있습니다

  1. 코드 덜 추한하게 의존에서 의존성의 건축 세부 사항을 숨기려면.
  2. 단위 테스트에서 조롱하는 것을 용이하게하기.

다른 이유가 있습니까?

그렇지 않은 경우 DI를 정당화하기 위해 이러한 이유를 설명해 주실 수 있습니까?

답변

4

실생활의 예를 살펴 보겠습니다. 차를 가지고 있다고 가정 해 봅시다. 자동차에는 엔진이 필요합니다.

class Car 
{ 
    private $engine; 

    public function __construct() 
    { 
     $this->engine = new V6Engine(); 
    } 
} 

자동차는 엔진에 종속되어 있습니다. 이 경우, 자동차 자체가 새로운 엔진을 구성해야합니다! 의미가 있습니까? 음 .. 안돼! 또한 자동차는 특정 버전의 엔진에 연결됩니다.

이 말이 더 합리적입니다. 다른 사람이 자동차 엔진을 제공해야합니다. 그것은 일부 엔진 공급 업체, 엔진 공장 일 수 ... 그것은 엔진을 만드는 자동차의 직업이 아닙니다!

class Car 
{ 
    private $engine; 

    public function __construct(Engine $engine) 
    { 
     $this->engine = new $engine; 
    } 
} 


interface Engine 
{ 
    public function start(); 
} 

class V6Engine implements Engine 
{ 
    public function start() 
    { 
     echo "vrooom, vrooom V6 cool noise" 
    } 
} 

또한 엔진을 쉽게 바꿀 수 있으며 특정 엔진에 연결되어 있지 않을 수 있습니다. 그 새로운 엔진은 시작할 수 있어야합니다.

마틴 파울러 (Martin Fowler)는 제어 및 의존성 주입의 반전에 대해 매우 좋은 기사를 작성했습니다.

https://martinfowler.com/articles/injection.html

그것을 읽어 보시기 바랍니다 - 나는) : 할 수있는 것보다 그가 훨씬 더 DI를 설명하기 때문에)

는 또한, Miško Hevery "깨끗한 코드 회담에서 아주 좋은 비디오가 - 사물을 보지 마라! ". 당신은 그것을보고 후 더 영리 할 것이다 : 나는 당신의 서비스 내에서 객체를 생성하는 서비스의 범위를 숨기는 것을 추가 할

https://www.youtube.com/watch?v=RlfLCWKxHJ0

2

.

하드 종속성으로 요구하면 서비스가 작동하기 위해 해당 개체의 인스턴스가 필요하다는 것을 분명하게 나타냅니다. 계약의 일부로 만들면 종속성은 더 이상 구현 세부 사항이 아닙니다.

또한 유연성을 위해 열립니다. 예를 들어. EngineInterface을 사용합니다. 즉, 구현이 서비스에 전달되지만 인터페이스에 의해 부과 된 계약에 의존하지 않습니다 (프로덕션을 위해 메일을 보내는 메일러를 상상해보십시오. 테스트는 수행하지 않습니다).

관련 문제