2016-04-26 72 views
0

我有去像紧耦合与DI门槛

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保持其子节点的所有依赖关系。或者在某个时候足够健全地成为stupid

回答

1

这取决于D和E实际是什么。如果他们只是简单的数据对象,你会没事的。如果他们例如抽象数据库访问,你最好注入它们。作为一条经验法则:如果你可以编写一个适用于每个系统的单元测试(例如使用phpUnit)(这意味着不仅仅是你的本地开发环境),那么耦合并不那么严重,你会没事的用你现在正在做的方式。

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