我有一个代码是这样的
class A
{
public $b, $c;
//Inject D and E here? (B $b, C $c, D $d, E $e, ...)
public function __construct(B $b, C $c)
{
$this->b = $b;
$this->c = $c;
}
public function main()
{
if (rand(0,1)) {
new D();
} else {
new E();
}
}
}
我应该在A
的构造函数中注入可能的D
和E
类吗?这里的问题是项目的层次结构遵循这种树状结构,从而使上层节点A
保存其子节点的所有依赖项。还是在某个时候变得愚蠢到足够理智?
这取决于 D 和 E 实际上是什么。如果它们只是简单的数据对象,你会没事的。例如,如果它们抽象数据库访问,则最好注入它们。
根据经验:如果你可以编写一个适用于所有系统(不仅仅是本地开发环境)的单元测试(例如使用 phpUnit),那么耦合就不会那么严重,你会对你目前的方式很好。
另一方面,如果这样的单元测试由于缺少某些资源(例如数据库连接)而失败,则需要注入此服务。然后,您可以为测试创建一个模拟对象,然后它再次运行。