紧密耦合和DI阈值


Tight coupling & DI threshold

我有一个代码是这样的

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的构造函数中注入可能的DE类吗?这里的问题是项目的层次结构遵循这种树状结构,从而使上层节点A保存其子节点的所有依赖项。还是在某个时候变得愚蠢到足够理智?

这取决于 D 和 E 实际上是什么。如果它们只是简单的数据对象,你会没事的。例如,如果它们抽象数据库访问,则最好注入它们。

根据经验:如果你可以编写一个适用于所有系统(不仅仅是本地开发环境)的单元测试(例如使用 phpUnit),那么耦合就不会那么严重,你会对你目前的方式很好。

另一方面,如果这样的单元测试由于缺少某些资源(例如数据库连接)而失败,则需要注入此服务。然后,您可以为测试创建一个模拟对象,然后它再次运行。