我正在开始使用PHP,所以如果我做了一些可怕的错误,请原谅我的代码 让我们看看这个方法,我有一个“保险”对象,这将给我所有已经说过保险的客户:
public function getBeneficiarios() {
$petitionsVariables = array(
PeticionDeCoberturaColumns::COBERTURA_ID => $this->getId()
);
$petitions = (new PeticionDeCoberturaDAO())->getByValues($petitionesVariables);
$clientes = array();
foreach ($petitions as $petition) {
$clientes[] = $petition->getClient();
}
return $clientes;
}
所述代码显然不是非常可测试的,因为它与特定的DAO耦合。为了正确测试它,我需要模拟DAO并注入模拟。
执行它的依赖注入方式应该是
public function getBeneficiarios($dao) {
$petitionsVariables = array(
PeticionDeCoberturaColumns::COBERTURA_ID => $this->getId()
);
$petitions = $dao->getByValues($petitionesVariables);
$clientes = array();
foreach ($petitions as $petition) {
$clientes[] = $petition->getClient();
}
return $clientes;
}
我可以在保险对象构造函数上注入DAO,但我不喜欢传递不相关的DAO的想法,因为它需要在单个方法上使用。
每次我想使用getBeneficiarios方法时,我都需要先创建DAO,听起来非常非常直观。未来的编码员不应该为此烦恼。
我怎样才能保持使用代码的舒适度和测试代码的舒适度?
答案 0 :(得分:0)
在我看来,你的问题不是你班级的可测试性,而是你的应用程序的设计。
在真正的DDD中,你的类不应该依赖于DAO,或者甚至不知道它存在。你可以称之为持久性无知。保险对象应该注意的唯一事情是当事人(客户,保险公司)和其他商业概念,如法律条款。
关于封装的最重要的事情是,你的类的消费者不需要知道其内部工作在其他方面成功使用它。保险依赖于静态DAO对象会破坏封装,因为它的消费者需要知道静态DAO必须存在于某处,否则会发生异常。
DAO是一个实现细节。您的域对象不应该依赖或了解它, it 应该取决于您的域对象。 IoC是一种确保更基本的东西的方法,例如关注点分离和封装。如果按照设计你违反了这些,那么没有任何数量的IoC会修复它。作为一个起点,我将从DDD的角度来看看我的设计。请查看以下问题:Data access layer design in DDD
如果有帮助,请告诉我。