¿Cómo asegurarse de que el método del objeto devuelva el objeto esperado?

Estoy tratando de usar DI para poner un objeto en otro. Esto es fácil usando una interfaz y sugerencias de tipo.

El problema es que el objeto que estoy inyectando devuelve otro objeto con uno de los métodos esperados, y este objeto no se puede insinuar. El problema se parece a esto.

class Db implements DbInterface {
    public function query($query) {
        return new Result($query);
    }
}

interface DbInterface {
    public function query($query);
}

class Result {
    public function getRow() {
        // get row here
    }
}

class SomeClass {
    protected $data;

    // injection is here
    public function __construct(DbInterface $db) {
        $result = $db->query($some_query);
        $this->data = $result->getRow();
    }
}

Puedo asegurarme de obtener el objeto DbInterface correcto, pero ¿no hay forma de asegurarme de que el método run () de este objeto devuelva el tipo correcto de objeto? He buscado y no puedo encontrar una manera de escribir sugerencia del resultado de retorno de una función.

Esto podría generar problemas más adelante en un código más complejo. Si alguien escribe una nueva implementación de DbInterface, ¿cómo sabrá que la ejecución debe devolver un tipo específico de objeto si no hay forma de aplicarlo?

preguntado el 16 de mayo de 11 a las 16:05

2 Respuestas

Ponga todo a prueba. si una de sus pruebas especifica que el tipo de retorno debe ser x, es de esperar que la prueba falle al usar la nueva implementación. más allá de la prueba fallida, es de esperar que los desarrolladores utilicen las pruebas como documentación del desarrollador y vean cuál es el comportamiento previsto.

contestado el 16 de mayo de 11 a las 20:05

No, en el nivel del lenguaje no es posible restringir el valor de retorno de una función. Solo se permiten las sugerencias de tipo de los argumentos de la función: http://www.php.net/manual/en/language.oop5.typehinting.php

Lo que podría hacer es asegurarse de que el tipo incorrecto de valor devuelto se detecte antes. Digamos, en el código de inicio del contenedor IOC. Usted crea una instancia de su DbInterfacey compruebe el tipo de devolución de run(). Si está mal, lanza una excepción.

contestado el 16 de mayo de 11 a las 20:05

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