inyeccion-dependencias-3

Conociendo la Inyección de Dependencias

Después de un tiempo sin publicar nada por cuestiones de estudio y trabajo, vuelvo a la carga con un tema muy interesante que es la Inyección de Dependencias. El tema aunque parece que no da para mucho realmente tiene muchas aristas, aquí solo explicaré la forma habitual de hacerlo.

¿Qué es la Inyección de Dependencias?

La Inyección de Dependencias es un patrón de diseño orientado a objetos en el que se suministran objetos a una clase en lugar de ser la propia clase quien cree el objeto. El término fue acuñado por primera vez por Martin Fowler. En la práctica, consiste en pasar a los componentes de software sus dependencias mediante sus constructores, sus propiedades o sus métodos setter. Así de sencillo.

Veamos un ejemplo sin usar Inyección de Dependencia

Supongamos que estamos haciendo el caso de uso de registrar un usuario en una aplicación PHP o usando algún framework cualquiera como muestra el siguiente ejemplo:

Podemos ver, que la clase UserController tiene varias dependencias, primero depende de la clase MySQLDatabase para crear una instancia de la misma y utilizarla para insertar un usuario. Luego el método store() depende de la clase Request para recibir la información que viene del exterior y también depende de la clase User para crear el objeto usuario que luego será persistido.

Hasta este momento, la clase UserController se está encargando de crear los objetos de las clases de las cuales depende. Este comportamiento hace que las clases estén muy acopladas entre ellas y si queremos sustituir la clase MySQLDatabase tenemos que crear un nuevo objeto de otra clase diferente y tocar mucho la clase controladora, lo que no es muy bueno según las buenas prácticas.

Entre una de las muchas técnicas que se pueden aplicar para tener un mejor diseño, es usar la Inyección de Dependencias, esta casi siempre va asociada a un Contenedor de Dependencias que es quien realmente hace la magia. Por tema de simplicidad, supongamos que nuestra aplicación cuenta con un Contenedor de Dependencias, esto se explicará en otro artículo.

Veamos ahora el mismo ejemplo usando Inyección de Dependencia

En el ejemplo anterior, vemos como inyectamos la dependencia MySQLDatabase mediante el constructor y la dependencia Request se la inyectamos al método store de la clase. Con esto logramos desacoplar un poco las clases ya que nuestra clase UserController no tiene la responsabilidad de crear ella misma los objetos.

¿Y que pasa con la clase User? ¿Por qué no inyectamos la clase en el método store? Bueno, realmente podríamos inyectarla sin ningún problema, pero considero que podemos permitirnos este pequeño acoplamiento. Con esto quiero decir, que no hay que aplicar todas las técnicas al 100% porque es muy difícil lograrlo, además de que podríamos aumentar la complejidad innecesariamente. Todo está en buscar un equilibrio entre un buen diseño y complejidad.

Ventajas de usar la Inyección de Dependencias

Como ventajas podemos nombrar:

  • Nuestro código se vuelve más modular y menos acoplado, ya que los submódulos no necesitan saber detalles de la implementación de otros en tu código.
  • Gracias a esta modularidad es que podemos hacer tests unitarios más fácilmente, cada parte del programa se puede aislar porque para realizar pruebas no tenemos que proveer a nuestros programas de las referencias reales, sino que podemos fingirlas mediante mocks.
  • La inyección de dependencias puede hacer que escribas código más rápido y te quita preocupaciones de tener que instanciar objetos tu mismo.

El código expuesto anteriormente, no cumple con todas las buenas prácticas que se deberían usar porque va a servir de base para explicar otras cuestiones en próximos artículos.

Espero que este articulo les haya sido de ayuda, recuerda que nuestra comunidad en Slack crece cada día mas, así que si no te has unido, tienes que hacerlo pronto, que por allá te daremos una cálida bienvenida. Si tienes alguna duda, sugerencia o recomendación no dudes dejarla en nuestros comentarios.

Luckys

Ingeniero Informático y amante del desarrollo web, empecé con Codeigniter y ahora con Laravel. Apasionado de las buenas prácticas y un eterno aprendíz del mundo de la informática.

  • Guillermo Romo

    excelente articulo