Principio de Inversión de dependencias — SOLID
Dependency inversion principle o la Principio de inversión de dependencias es el quinto principio de SOLID.
La definición original de Robert C. Martin de 1995 es:
A. Las clases de alto nivel no deberían depender de las clases de bajo nivel. Ambas deberían depender de las abstracciones.
B. Las abstracciones no deberían depender de los detalles. Los detalles deberían depender de las abstracciones.
Con esto no resulta realmente claro el problema. Vamos a tratar de verlo en un ejemplo.
Tenemos un DTO de una persona:
Tenemos una clase Mysql para guardar la información de la persona en base de datos.
Y tenemos una clase de Servicio que hace las funciones de la lógica de negocio.
A simple vista todo parece normal estamos creando una instancia de la clase Mysql para usar el método de guardado.
Pero el problema viene cuando en lugar de guardar en la base de datos Mysql quieres guardar en Oracle o en lugar de guardarlo en base de datos quieres tratarlo de otra manera.
Instanciar la clase como se hace en el ejemplo anterior genera un fuerte acoplamiento lo que implica tener que rehacer el código y evita la reutilizar el mismo.
¿Como aplicamos correctamente el Principio de Inversión de dependencias?
Veamos el siguiente ejemplo.
Creamos una Interfaz IPersitence para abstraer la clase Mysql.
Modificamos la Clase Mysql para que implemente dicha Interface.
Y modificamos la clase ServicePerson para evitar que se cree una instancia de la clase Mysql y así evitar el fuerte acoplamiento de las clases.
En este ejemplo podemos observar que el constructor de la clase ServicePerson recibe una Instancia de una clase de tipo IPersitence. De este modo ServicePerson puede recibir la clase Mysql y realizar el guardado de la información como ya lo definimos y si en un futuro se requiere crear otra manera de persistir la información solo debemos crear una nueva clase que implemente IPersistence y enviarla en el constructor reemplazando la clase Mysql.
Si quieres hondar mas en el tema, te recomiendo los siguientes cursos.
El código del ejemplo puedes encontrarlo en mi Github en el siguiente enlace.