如何使依赖注入和代码使用和测试都舒适?

时间:2012-09-29 20:42:17

标签: oop design-patterns language-agnostic dependency-injection

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

我怎样才能保持使用代码的舒适度和测试代码的舒适度?

1 个答案:

答案 0 :(得分:0)

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

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

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

DAO是一个实现细节。您的域对象不应该依赖或了解它, it 应该取决于您的域对象。 IoC是一种确保更基本的东西的方法,例如关注点分离和封装。如果按照设计你违反了这些,那么没有任何数量的IoC会修复它。作为一个起点,我将从DDD的角度来看看我的设计。请查看以下问题:Data access layer design in DDD

如果有帮助,请告诉我。