2012-05-21 2 views
2

Предположим, у меня есть класс Thing, и мне нужно использовать определенную проверку даты, предоставляемую классом MySpecificDateValidation, который расширяет Zend_Validate_Abstract.setter, validator и dependency injection

В классе 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

Возможно, лучше передать валидаторы в объект при создании, а не в каждую функцию. Будет намного меньше кода, чтобы броситься, если у вас нет веских причин избежать лишнего багажа, если SetDateBegin никогда не вызывается. – DampeS8N

+0

, но, с другой стороны, если у меня есть дюжина атрибутов с полдюжинами разных валидаторов, это (переход к созданию) принесет дополнительный вес в конструкторе, не так ли? –

+1

@RodrigoAoCubo, если ваш класс имеет столько зависимостей, которые ему нужны для повторного факторинга, он делает слишком много! Сказав, что, когда вы передаете свои зависимости, зависит от вашего варианта использования. – vascowhite

ответ

4

Ваш второй вариант будет намного проще unit test, так как вы сможете высмеять валидатор и ввести mocked object вместо реального.

Если вы попытаетесь выполнить тестирование первого варианта, вы закончите тестирование класса Thing плюс все, от чего оно зависит, например, валидатор. Если единичный тест выходит из строя, вы должны отслеживать ошибку во всех зависимостях.

Точка dependency injection должна позволять вам изолировать свои классы от их зависимостей, чтобы вы тестировали каждый класс отдельно.

Итак, с точки зрения тестирования вы должны всегда вводить все зависимости.

+0

Хорошо, я понимаю, что это (модульное тестирование) является основным преимуществом. Я считаю, что я все еще пытаюсь привыкнуть к идее и оставляю старые вредные привычки позади ... –

+0

@RodrigoAoCubo Тестирование модулей не является главным преимуществом, это, по сути, единственное преимущество. Все остальное можно сделать более эффективно другими способами, но только через DI вы можете сделать все эти вещи с относительной легкостью, а также все же единично тестировать с легкостью. – DampeS8N