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

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 utilizar (un servicio).

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

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

Dependencia o dependencia significa depender de algo para recibir apoyo. Como si dijera que confiamos demasiado en los teléfonos móviles de lo que significa que dependemos de ellos.

Entonces, antes de pasar a las inyecciones de dependencia , primero entendamos qué significa una dependencia en la programación.

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

En Java, antes de que podamos usar métodos de otras clases, primero necesitamos 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.

¿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 car 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?

Necesitaremos recrear el objeto del coche con una nueva dependencia de Yokohama. Pero cuando usamos la inyección de dependencias (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 de coche sea independiente de la creación de objetos de ruedas, batería, etc.

Básicamente, existen 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 de setter: el cliente expone un método de setter que el inyector usa para inyectar la dependencia.
  3. inyección de interfaz: la dependencia proporciona un método 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 dales todos esos objetos

Si hay algún cambio en los objetos, entonces DI lo investiga y no debería afectar a la clase que usa esos objetos. De esta manera, si los objetos cambian en el futuro, entonces es responsabilidad de su 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 externa.

Es el quinto principio de SOLID : elcinco principios básicos de programación y diseño orientados a objetos por el 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 los 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 obtener información sobre los principios SOLID 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 el componente del inyector realiza la inicialización de las dependencias.
  3. Ampliar la aplicación se vuelve más fácil.
  4. Ayuda a permitir un acoplamiento suelto, que 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 provocar problemas de gestió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 utilizar bibliotecas o marcos de terceros.

Bibliotecas y Frameworks que implementan DI

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

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

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

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

Inversión de contenedores de control y 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.

Edición 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 sí lo leen.

Enlace al artículo

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.

ciclo de cuchillo

Edición 2:

Si usted es un desarrollador de PHP, no se preocupe, también lo cubrimos todo. 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 una cosa o dos, ¡comparte esta historia!