Una introducción rápida a la inyección de dependencias: qué es y cuándo usarla

Foto de rawpixel en Unsplash

Introducción

En ingeniería de software, la inyección de dependencias es una técnica mediante la cual un objeto (o método estático) suministra las dependencias de otro objeto. Una dependencia es un objeto que se puede usar (un servicio).

Esa es la definición de Wikipedia, pero aún así, pero no es particularmente fácil de entender. Entonces, entendamos mejor.

Antes de comprender lo que significa en la programación, veamos primero lo que significa en general, ya que nos ayudará a comprender mejor el concepto.

Dependencia o dependencia significa confiar en algo para apoyo. Por ejemplo, si digo que confiamos demasiado en los teléfonos móviles, eso significa que dependemos de ellos.

Entonces, antes de recibir inyecciones de dependencia, primero comprendamos qué significa una dependencia en la programación.

Cuando la clase A usa alguna funcionalidad de la clase B, se dice que la clase A tiene una dependencia de la clase B.

Mostrando dependencias entre clases

En Java, antes de que podamos usar métodos de otras clases, primero debemos crear el objeto de esa clase (es decir, la clase A necesita crear una instancia de la clase B).

Entonces, transferir la tarea de crear el objeto a otra persona y usar directamente la dependencia se llama inyección de dependencia.

¿Y si el código pudiera hablar?

¿Por qué debería usar la inyección de dependencia?

Digamos que tenemos una clase de automóvil que contiene varios objetos como ruedas, motor, etc.

Aquí la clase de automóvil es responsable de crear todos los objetos de dependencia. Ahora, ¿qué pasa si decidimos deshacernos de MRFWheels en el futuro y queremos usar Yokohama Wheels?

Tendremos que recrear el objeto del automóvil con una nueva dependencia de Yokohama. Pero cuando usamos la inyección de dependencia (DI), podemos cambiar las ruedas en tiempo de ejecución (porque las dependencias se pueden inyectar en tiempo de ejecución en lugar de en tiempo de compilación).

Puede pensar en DI como el intermediario en nuestro código que hace todo el trabajo de crear el objeto de ruedas preferido y proporcionarlo a la clase Car.

Hace que nuestra clase Car sea independiente de la creación de objetos de ruedas, batería, etc.

Básicamente, hay tres tipos de inyección de dependencia:

  1. inyección de constructor: las dependencias se proporcionan a través de un constructor de clase.
  2. inyección setter: el cliente expone un método setter que el inyector usa para inyectar la dependencia.
  3. inyección de interfaz: la dependencia proporciona un método de inyector que inyectará la dependencia en cualquier cliente que se le pase. Los clientes deben implementar una interfaz que exponga un método de establecimiento que acepte la dependencia.

Así que ahora es responsabilidad de la inyección de dependencia:

  1. Crea los objetos
  2. Sepa qué clases requieren esos objetos
  3. Y proporcionarles todos esos objetos

Si hay algún cambio en los objetos, entonces DI lo examina y no debería afectar a la clase que usa esos objetos. De esta manera, si los objetos cambian en el futuro, es responsabilidad de DI proporcionar los objetos apropiados a la clase.

Inversión de control: el concepto detrás de DI

Esto establece que una clase no debe configurar sus dependencias estáticamente, sino que debe ser configurada por alguna otra clase desde afuera.

Es el quinto principio de S.O.L.I.D, los cinco principios básicos de programación y diseño orientados a objetos del Tío Bob, que establece que una clase debe depender de la abstracción y no de las concreciones (en términos simples, codificados).

De acuerdo con los principios, una clase debe concentrarse en cumplir con sus responsabilidades y no en crear objetos que requiere para cumplir con esas responsabilidades. Y ahí es donde entra en juego la inyección de dependencia: proporciona a la clase los objetos necesarios.

Nota: Si desea conocer los principios SÓLIDOS del tío Bob, puede dirigirse a este enlace.

Beneficios de usar DI

  1. Ayuda en las pruebas unitarias.
  2. El código de la placa de la caldera se reduce, ya que la inicialización de dependencias se realiza mediante el componente inyector.
  3. Ampliar la aplicación se vuelve más fácil.
  4. Ayuda a habilitar el acoplamiento flojo, lo cual es importante en la programación de aplicaciones.

Desventajas de DI

  1. Es un poco complejo de aprender, y si se usa en exceso puede conducir a problemas de administración y otros problemas.
  2. Muchos errores de tiempo de compilación se envían al tiempo de ejecución.
  3. Los marcos de inyección de dependencia se implementan con reflexión o programación dinámica. Esto puede dificultar el uso de la automatización IDE, como "buscar referencias", "mostrar jerarquía de llamadas" y refactorización segura.

Puede implementar la inyección de dependencia por su cuenta (Pure Vanilla) o usar bibliotecas o marcos de terceros.

Bibliotecas y marcos que implementan DI

  • Primavera (Java)
  • Google Guice (Java)
  • Daga (Java y Android)
  • Castillo Windsor (.NET)
  • Unidad (.NET)

Para obtener más información sobre la inyección de dependencia, puede consultar los siguientes recursos:

Inyección de dependencia de Java - Tutorial de ejemplo de patrón de diseño DI - JournalDev

Uso de inyección de dependencia en Java - Introducción - Tutorial - Vogella

Inversión de contenedores de control y el patrón de inyección de dependencia - Martin Fowler

¡Espero eso ayude!

Si te gustó el artículo y quieres leer más artículos increíbles, sígueme aquí (Bhavya Karia) y muestra tu apoyo, ya que me motiva a escribir más.

Si tiene alguna pregunta o comentario para mí, conectemos en LinkedIn, Twitter, Facebook.

Editar 1:

Gracias a Sergey Ufocoder ahora este artículo se ha convertido al idioma ruso. Mis amigos rusos y todos los que pueden leer el idioma ruso lo leen.

Enlace al articulo

Además, si desea aplicar DI en JavaScript y está buscando una biblioteca, Jo Surikat sugiere que pruebe su biblioteca.

Di-Ninja

Nicolas Froidure sugirió una biblioteca DI más impresionante en JavaScript.

navaja

Edición 2:

Si eres un desarrollador de PHP, no te preocupes, también tienes todo cubierto. Gordon Forsythe recomendó esta increíble biblioteca que todos querrán probar.

auryn

Gracias por todas las amables palabras que he estado recibiendo. Comparta el artículo para que más y más personas puedan beneficiarse.

Si aprendiste incluso una o dos cosas, aplaude tantas veces (50 ) como puedas para mostrar tu apoyo.