是否应该避免使用新关键字以支持其他模式(例如工厂)?

时间:2017-05-19 19:58:20

标签: php oop model-view-controller

谷歌清洁代码谈判中的{p> This video表示new对测试不利,乍看起来似乎有道理。

PHP的优秀做法是什么?我应该创建一个工厂类来为每个对象类型实例化一个方法,允许松散耦合吗?或者,使用单个方法初始化new实例的通用初始化方法(自动加载程序?)是否更合适,尽管后者没有指定返回类型,这使得代码在黑暗中完成IDE。

1 个答案:

答案 0 :(得分:2)

好。视频是正确的。每当您在代码的一部分中有new时,就会使测试更加困难。基本上,没有办法隔离你正在测试的东西。这意味着您需要完整覆盖该类(您在new语句中的那个),以使您的单元测试真正可靠。

绝对最佳的选择是将所有实例作为依赖项传递(在类或方法中),但通常仅在某些特定层中起作用。例如,如果正确编写,则可以非常简单地删除控制器中的任何new语句。您只需将服务作为依赖项传递给构造函数,并在“操作调用”中传递Request抽象或显式值。

因此,传递依赖关系(可能通过使用一些DI容器)是最好的方法。最容易测试的一个。但这不会普遍适用。

您的其余代码可能最终(至少 - 部分)与new运算符和工厂的混合。

您可以通过使用工厂中的::class和添加docblock注释来缓解IDE相关问题:

/** @var \Mapper\SalesSomething\Invoice $invoice */
$invoice = $this->factory->create(Invoice::class);

我的个人偏好是:

  • controllers:相关对象仅作为DIC的依赖
  • 服务:用于映射器的工厂,用作依赖关系的存储库,具有new
  • 的域实体
  • mappers:只对构造函数的依赖
  • entities:no dependencies
  • views:相关对象仅作为DIC的依赖项
  • 演示文稿对象/小部件:通过工厂

但那只是我的方法