setter,validator和dependency injection

时间:2012-05-21 17:41:57

标签: php oop validation dependency-injection setter

假设我有一个Thing类,我需要使用由扩展Zend_Validate_Abstract的MySpecificDateValidation类提供的某些特定日期验证。

在Thing类中,我正在考虑依赖注入,并想知道是否有这段代码:

public function SetDateBegin($dateBegin) {
    $dateValidator = new MySpecificDateValidation();
    if ($dateValidator->isValid($dateBegin)) {
        $this->dateBegin = $dateBegin;
    } else {
        throw new Exception /*...*/;
    }
}

应该重构为:

public function SetDateBegin($dateBegin, MySpecificDateValidation $dateValidator) {
    if ($dateValidator->isValid($dateBegin)) {
        $this->dateBegin = $dateBegin;
    } else {
        throw new Exception /*...*/;
    }
}

或者你可以忍受一些依赖的东西?

1 个答案:

答案 0 :(得分:4)

unit test您的第二个选项会更容易,因为您可以模拟验证器并注入mocked object而不是真实的验证器。

如果您尝试对第一个选项进行单元测试,则最终会测试Thing类及其所依赖的任何内容,例如验证器。如果单元测试失败,则必须通过所有依赖项跟踪失败。

dependency injection的要点是允许您将类与其依赖项隔离开来,以便单独测试每个类。

因此,从测试的角度来看,您应该始终注入所有依赖项。