2

我开始使用 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,这听起来非常非常不直观。未来的编码人员不必为此烦恼。

我怎样才能既舒适地使用代码,又舒适地测试代码?

4

1 回答 1

0

在我看来,您的问题不是您的课程的可测试性,而是您的应用程序的设计。

在真正的 DDD 中,你的类不应该依赖于 DAO,甚至不应该知道它的存在。你可以称之为持久性无知。保险对象应该注意的唯一事项是各方(客户、保险公司)和其他业务概念,例如法律条款。

封装最重要的一点是,你的类的消费者不需要知道它在其他方面的内部工作原理就可以成功地使用它。让保险依赖于静态 DAO 对象会破坏封装,因为它的消费者需要知道静态 DAO 必须存在于某个地方,否则会发生异常。

DAO 是一个实现细节。您的域对象不应该依赖或知道它,应该依赖于您的域对象。IoC 是一种确保更基本事物的手段,例如关注点分离和封装。如果您的设计违反了这些,那么任何 IoC 都无法解决它。作为一个起点,我会从 DDD 的角度来看看我的设计。看看下面的问题:DDD 中的数据访问层设计

让我知道这是否有帮助。

于 2012-10-15T12:15:21.323 回答