En la anterior entrada, vimos como crear un adaptador, pero no llegamos a ver como podemos utilizar esos adaptadores para sacar toda su utilidad. Para eso vamos a ver el patrón de inyección de dependencias.
Este patrón nos ayudará a que nuestra aplicación tenga un bajo acoplamiento y una alta cohesión. Para los que no estén familiarizados, decir que eso significa que dos piezas de software no deben ser dependientes entre ellas, pero deben definir correctamente una unidad de software. Para más detalles os dejo una referencia al final de la entrada(1).
Si programas una clase sin utilizar este patrón, la clase resultante puede ser parecida a la del ejemplo, donde se crean objetos dentro de la propia clase y eso hace que haya un fuerte acoplamiento, que es algo que queremos evitar.
class my_class { public function obtenerDatos() { $base_de_datos = new Mysqli(); //Fuerte acoplamiento $base_de_datos->connect(); $result = $base_de_datos->query( 'SELECT * FROM tabla' ); return $result; } } $instancia = new my_class(); $instancia->obtenerDatos();
Si utilizamos el patrón, la dependencia se inyecta de forma externa, por lo que la propia clase ya no necesita saber que objeto va a utilizar (realizar un new Objeto), si no solamente la interfaz que va a utilizar de ese objeto, y ahí es cuando entran en juego los adaptadores.
Los adaptadores, tal y como explicamos en la anterior entrada, tienen una interfaz en común que nos asegura que esos objetos tienen un conjunto común de métodos. De esta forma se puede inyectar en la clase cualquier objeto que posea la interfaz que el requiera y olvidarse de que objeto concreto usa.
class my_class { //Inyección de un objeto del tipo InterfazBaseDeDatos public function obtenerDatos( InterfazBaseDeDatos $base_de_datos ) { $base_de_datos->connect(); $result = $base_de_datos->query( 'SELECT * FROM tabla' ); return $result; } } $base_de_datos = new AdaptadorMysqli(); //Creamos la dependencia de forma externa. $instancia = new my_class(); $instancia->obtenerDatos( $base_de_datos ); //Inyectamos la dependencia.
En el ejemplo puede verse que la clase ya no requiere el objeto Mysqli, si no que requiere un objeto que tenga la interfaz InterfazBaseDeDatos. Esto permitirá nuestra clase utilizar cualquier objeto que disponga del adaptador.
La dependencia, en el ejemplo anterior, se ha inyectado en el mismo método en el que se utiliza la dependencia externa, pero la inyección de dependencia se puede realizar en otros lugares como por ejemplo el constructor o un método específico para la inyección de dependencias.
Tipos de inyecciones alternativas
Constructor
//Inyección de dependencia en el constructor. class my_class { //Código de la clase public function __construct( InterfazBaseDeDatos $base_de_datos ) { $this->base_de_datos = $base_de_datos; } //Código de la clase }
Método específico
//Inyección de dependencia en un método concreto. class my_class { //Código de la clase public function establecerConectorBaseDeDatos( InterfazBaseDeDatos $base_de_datos ) { $this->base_de_datos = $base_de_datos; } //Código de la clase }
Por último decir, que si leéis más cosas sobre inyección de dependencias y os encontráis con algo llamado "Contenedor de inyección de dependencias", decir que no es lo mismo que explicado en esta entrada.
No hay comentarios:
Publicar un comentario