setter, validator e inyección de dependencia

Digamos que tengo una clase Thing y necesito usar alguna validación de fecha específica proporcionada por la clase MySpecificDateValidation que extiende Zend_Validate_Abstract.

En la clase Thing, estaba pensando en la inyección de dependencia y me preguntaba si este código:

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

debe refactorizarse para:

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

¿O hay algo así como una dependencia con la que puedes vivir?

preguntado el 21 de mayo de 12 a las 18:05

Probablemente sea mejor pasar los validadores al objeto en la creación y no a cada función. Habrá mucho menos código para lanzar a menos que tenga una razón convincente para evitar el equipaje adicional si nunca se llama a SetDateBegin. -

pero, por otro lado, si tengo una docena de atributos con media docena de validadores diferentes, esto (pasar la creación) traerá un peso extra en el constructor, ¿no es así? -

@RodrigoAoCubo si su clase tiene tantas dependencias que necesita refactorizar, ¡está haciendo demasiado! Habiendo dicho eso, donde pasas en tus dependencias depende de tu caso de uso. -

tal vez lo "hiperbolé" un poco, o hice una confusión en la forma en que lo describí... No estaba hablando de 12 parámetros en un método con 6 validadores diferentes juntos, sino de una clase con alrededor de 12 setters con una especie de diferentes validadores, no iguales para todos. ¿lo convierte en algo menos desagradable? :) -

Lol, un poco menos desagradable, pero no mucho :) -

1 Respuestas

Su segunda opción será mucho más fácil de prueba de unidad ya que podrá burlarse del validador e inyectar el objeto burlado en lugar del verdadero.

Si intenta realizar una prueba unitaria de la primera opción, terminará probando la clase Thing más cualquier cosa de la que dependa, como el validador. Si falla una prueba unitaria, debe rastrear la falla a través de todas las dependencias.

El objetivo del inyección de dependencia es permitirle aislar sus clases de sus dependencias para que pruebe cada clase de forma aislada.

Entonces, desde el punto de vista de las pruebas, siempre debe inyectar todas las dependencias.

contestado el 21 de mayo de 12 a las 18:05

Ok, entiendo que (las pruebas unitarias) es el principal beneficio. Creo que todavía estoy tratando de acostumbrarme a la idea y dejar atrás los viejos malos hábitos... - Rodrigo Machado

@RodrigoAoCubo La prueba unitaria no es el beneficio principal, es esencialmente el único beneficio. Todo lo demás se puede hacer de manera más eficiente de otras maneras, pero solo a través de DI puede hacer todas esas cosas con relativa facilidad y también realizar pruebas unitarias con facilidad. - AmortiguaciónS8N

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.