我目前有一个具有紧密耦合依赖关系的类,并且类构造函数当前没有任何参数。我试图能够选择性地传递不同的依赖项而不更改构造函数签名,从而破坏当前使用该类的应用程序。
我想出了这种模式:
class Car {
private $engine;
public function __construct($options = array()) {
if (isset($options['engine']) {
$this->engine = $options['engine'];
} else {
$this->engine = new Engine();
}
}
}
这样可以使用new car()
创建Car(使用默认引擎),或者传入自定义引擎:new Car(array('engine' => new CustomEngine()))
。
这是一种正确的方法吗?这与可维护性有什么问题?
答案 0 :(得分:6)
在我看来,这是一个正确的模式,我经常使用它。
依赖注入允许类的用户提供依赖项。使用您的代码,这是可能的,所以我没有看到它的问题。
我唯一不同的是,我使用显式参数,这样我就可以键入提示对象以确保它们是正确的类,并且更容易知道可以传递哪些参数而无需查看在代码:
class Car {
private $engine;
public function __construct(Engine $engine = null) {
$this->engine = $engine ?: new Engine();
}
}