anncode

[Android Native, Kotlin, Geek & Teacher]

🧠 Inversi贸n de Dependencias vs Inyecci贸n de Dependencias

驴Inversi贸n de Dependencias es lo mismo que Inyecci贸n de Dependencias? te suenan? la diferencia entre ellos suele ser una de las preguntas m谩s concurridas en entrevistas de trabajo.

  • Inyecci贸n de Dependencias es un Patr贸n de Dise帽o
  • Inversi贸n de Dependencias es un Principio SOLID (Dependency Inversion Principle DIP)

Dependecy Injection (Inyecci贸n de Dependencias)

Este es un Patr贸n de Dise帽o que nos dice que los objetos deben ser creados fuera y deben ser prove铆dos a un m茅todo, clase y/o m贸dulo en part铆cular en lugar de ser 茅l mismo quien los cree.

Por ejemplo, mira la clase Vehicle que en su m茅todo constructor necesita un objeto para existir, en este caso el objeto est谩 siendo creado dentro del m茅todo, por lo tanto estar铆amos violando el Patr贸n de Dise帽o Dependency Injection.

class Vehicle(
  val motor = GasMotor()
)

Arreglemos esto.

Extraemos la creaci贸n del objeto hac铆a fuera e independiente de la clase, de esta manera podemos crear un objeto fuera de la clase e inyectarlo.

class Vehicle(
  val motor: Movable
)

val motor = GasMotor()
val vehicle = Vehicle(motor)

Con esto ya estamos cumpliendo la Inyecci贸n de Dependencias ✅

He dise帽ado un聽Curso de Dise帽o Orientado a Objetos y Principios SOLID聽d贸nde te ense帽o a aplicar correctamente este principio en problemas reales, echale un ojo a este聽Cup贸n de Descuento.

Dependency Inversion Principle de SOLID

El principio dice:

Los m贸dulos de alto nivel no deber铆an dependeer de los de bajo nivel.

Ambos deber铆an depender de abstracciones

Para entender este principio es necesario entender principalmente qu茅 significa Alto y Bajo nivel.

Alto Nivel

Ser谩n todas esas clases funciones y/o m贸dulos que necesitan una dependencia, es decir, necesitan de otro objeto para poder crearse.

Por ejemplo: La clase Vehicle necesita un objeto motor para poder crearse, por lo tanto dir铆amos que Vehicle es una clase de Alto nivel.

class Vehicle(
  val motor: Movable
)

Bajo Nivel

Ser谩n las dependencias en s铆. Los objetos necesarios para crear una clase.

La caracter铆stica principal para que sea de Bajo nivel es que no sea una abstracci贸n (Interfaces y/o Clases Abstractas) sino objetos concretos.

Usando el ejemplo anterior.

Podemos identificar por su nombre, que Movable es una abstracci贸n, y m谩s espec铆ficamente una Interfaz.

Por lo tanto para que sea un objeto de bajo nivel necesitamos que motor sea un objeto concreto, es decir, motor podr铆a ser de tipo ElectricMotor y GasMotor como se ve a continuaci贸n

class ElectricMotor : Movable()
class GasMotor : Movable()

Estas son clases de bajo nivel y si las instaciamos ser铆an objetos de bajo nivel.

Violando el Principio de Inversi贸n de Dependencias que dice en su primera parte: Los m贸dulos de alto nivel no deber铆an dependeer de los de bajo nivel.

Instanciar铆amos la clase Vehicle de Alto Nivel con un objeto de Bajo Nivel por ejemplo: GasMotor.

class Vehicle(
  val gasMotor: GasMotor
)

Esto hace que nuestra clase Vehicle est茅 acoplada a solo crear ve铆culos con motor de gas, y cuando evolucionemos, hacer el cambio a motores el茅ctricos ser谩 muy doloroso.

Tener una clase con bajo acoplamiento nos ayuda a hacer software m谩s flexible y escalable.

De hecho hay otro principio de dise帽o que nos dice que si tenemos 芦Bajo Acoplamiento y Alta Cohesi贸n禄 nos ayuda a crear software m谩s saludable.

C贸mo detectar una Inversi贸n de Dependencias vs una Inyecci贸n de Dependencias

Ver谩s que ahora es muy f谩cil de entender y es que de acuerdo a la segunda parte del Principio de Inversi贸n de Dependencias: Ambos deber铆an depender de abstracciones.

Para que exista una Inversi贸n de dependencias necesitamos Depender de Abstracciones (Interfaz o Clase Abstracta)

Mientras que en la Inyecci贸n de dependencias simplemente es mantener la creaci贸n de objetos fuera de la clase, m茅todo y/o m贸dulo e inyectarlos como dependencias.

Por ejemplo:

Aqu铆 podemos ver que el Patr贸n de Inyecci贸n de Dependencias s铆 se cumple, ya que no estamos creando los objetos dentro de la clase, tenemos la posibilidad de crearlos fuera.

class Vehicle(
  val gasMotor: GasMotor
)

Sin embargo, el Principio de Inversi贸n de Dependencias no se cumple por que no estamos dependiendo de Abstracciones.

Por lo tanto tenemos:

✅ Inyecci贸n de Dependencias

❌ Inversi贸n de Dependencias

Otro Ejemplo:

Aqu铆 vemos los dos principios aplicados pues podemos crear objetos fuera de la clase y adem谩s la clase dependende de una abstracci贸n

class Vehicle(
  val motor: Movable
)

interface Movable { }

class ElectricMotor : Movable()
class GasMotor : Movable()

Por lo tanto tenemos:

✅ Inyecci贸n de Dependencias

✅ Inversi贸n de Dependencias

Puedes explicarme en tu palabras cu谩l es la diferencia entre ellos? Expl铆came en los comentarios ✍

En mi Curso de Dise帽o Orientado a Objetos y Principios SOLID te ense帽o todo desde cero y paso a paso con ejemplos reales, te dej茅 un regalo en este link para que lo adquieras a un precio especial.

Si te gust贸 esta clase no olvides compartirla haces un excelente trabajo divulgando conocimiento ⚡

4 thoughts on “🧠 Inversi贸n de Dependencias vs Inyecci贸n de Dependencias

  1. Hola Ann, Muchas gracias por tu tiempo y tu dedicaci贸n para explicar estos 3 temas, me quedo muy claro todo lo que explicas.

    Saludos

Deja una respuesta

Tu direcci贸n de correo electr贸nico no ser谩 publicada.

Este sitio usa Akismet para reducir el spam. Aprende c贸mo se procesan los datos de tus comentarios.