2014-06-24 1 views
5

현재 종속성이 밀접하게 연결된 클래스가 있으며 클래스 생성자에는 현재 매개 변수가 없습니다. 나는 선택적으로 생성자 서명을 변경하지 않고 다른 종속성을 전달할 수 있기 때문에 현재 클래스를 사용하는 응용 프로그램을 중단 할 수 있습니다. 종속성 삽입의 기본값

나는이 패턴 내놓았다 :

class Car { 
    private $engine; 

    public function __construct($options = array()) { 
     if (isset($options['engine']) { 
      $this->engine = $options['engine']; 
     } else { 
      $this->engine = new Engine(); 
     } 
    } 
} 

이 자동차는 여전히 new car()로 (기본 엔진)이 생성 될 수있는 방법으로, 또는 사용자 정의 엔진에 전달하여 : new Car(array('engine' => new CustomEngine()))합니다.

올바른 방법입니까? 이것이 유지 보수성에 어떤 문제점이 있습니까?

+1

오른쪽 트랙에 있습니다! 의존성 주입은 정확히 이것입니다. – colburton

+1

이게 http://stackoverflow.com/q/8295060/1767861과 관련이 있다고 생각하면 주어진 답을 읽어 주어야합니다 :) –

답변

4

이것은 내 의견으로는 올바른 패턴이며 자주 사용합니다.

종속성 삽입을 사용하면 클래스 사용자가 종속성을 제공 할 수 있습니다. 코드를 사용하면 가능하기 때문에 문제가 발생하지 않습니다.

내가 다르게하는 유일한 방법은 명백한 매개 변수를 사용하므로 개체를 입력 할 때 힌트를 사용하여 올바른 클래스인지 확인하고 매개 변수없이 전달할 수 있는지 쉽게 알 수 있도록하는 것입니다. 코드를보고 :

class Car { 
    private $engine; 

    public function __construct(Engine $engine = null) { 
     $this->engine = $engine ?: new Engine(); 
    } 
} 
+1

아, 그런 식으로 타입 힌팅 된 매개 변수를 설정할 수는 없어요. 나는'__construct (Engine $ engine = new Engine())'을 시도했지만 물론 작동하지 않았습니다. 감사! – algoni