来自谷歌清洁代码谈判的这段视频表示,new不利于测试,乍一看似乎是可信的。
什么是PHP的好实践?我是否应该创建一个工厂类来为每个对象类型实例化不同的对象类型,从而允许松散耦合?还是通用初始化方法(自动加载程序)?使用单一的插入方法,new实例更合适,尽管后者没有指定返回类型,这使得IDE的代码完成处于黑暗之中。
发布于 2017-05-19 20:23:56
井。录像是对的。每当代码的一部分中包含new时,就会使测试变得更加困难。基本上,没有办法将您正在测试的东西与该类隔离开来。这意味着您需要对这个类( new语句中的那个类)有一个完整的覆盖,这样您的单元测试才能真正可靠。
绝对最好的选择是将所有实例作为依赖项传递(无论是在类中还是在方法中),但通常只能在特定的层中工作。例如,如果编写正确,那么将控制器从任何new语句中删除是非常简单的。您只需将服务作为构造函数中的依赖项传递,并在“动作调用”中传递Request抽象或显式值。
因此,传递依赖项(可能通过使用某个DI容器)是最好的方法。也是最容易测试的。但这并不是普遍存在的。
您的其余代码可能会以new操作符和工厂的混合(至少部分)结束。
您可以通过在工厂中使用::class和添加docblock注释来缓解IDE相关问题:
/** @var \Mapper\SalesSomething\Invoice $invoice */
$invoice = $this->factory->create(Invoice::class);我个人的喜好是:
new的域实体但这只是我的方法
https://stackoverflow.com/questions/44078131
复制相似问题