3:12 0 0
Principios SOLID Dependency Inversion Principle

Principios SOLID Dependency Inversion Principle

  DrUalcman |  abril 72022

Single responsabilitie Principle [SRP]

Open/Close Principle [OCP]

Liskov Substitutio Principle [LSP]

Interface Segregation Principle [ISP]

Dependency Inversion Principle [DIP]

Definicion: Se puede resumir en que un módulo de alto nivel no debe de depender de un nódulo de bajo nivel. Ambos deben de depender de una abtractión. Esta abstraction no debe de depender de detalles. Los detalles deben de depender de la abtracción.

Y entramos en lo de siempre. ¿Que me estas contando?. Pues la verdad que es un principio que, cuando se practica se entiende mejor, pero que es bastante dificil hacer entender, por lo menos para mí, que además no soy muy diestro explicando. Pero vamos a intentarlo. Lo que quiere decir esta definición es que si un objeto necesita exponer alguna funcionalidad, es mejor que se haga implementando una abstracción, ya sea una clase abstracta o un unterfaz (lo más común en estos casos).

De esta forma, utilizando DIP, cuando una clase que expone alguna funcionalidad, y alguno de sus componente cambia, al utilizar una abstracción, no debería de verse afactada directamente o romperse por dichos cambios. Sin utilizar DIP el programador tiene su clase fuertemente aclopada a otras y cualquiercambio en una de ellas puede afectar directamente a la funcionalidad de mi programa.

Si minimizas las dependencias, los cambios se mas localidados y requiere de menos esfuerzo de encontrar dónde los componentes se han visto afectados por el cambio.

Veamos un ejemplo para comprenderlo mejor

Vamos a crear un pequeño ejemplo utilizando una interfaz, un poco de codigo de alto nivel, otro poco de bajo nivel y algunos detalles. Primero crearemos una interfaz con un sólo método.

public interface ICustomerDataAccess
{
string GetCustomerName(int id);
}

Ahora, vamos a imlementar esta interfaz en una clase.

public class CustomerDataAccess: ICustomerDataAccess
{
public CustomerDataAccess() {
}

public string GetCustomerName(int id) {
return "Dummy Customer Name";
}
}

Continuamos con una clase, siguiendo el patrón Factory, que nos devuelva una instancia de la interfaz. Éste es nuestro código de bajo nivel.

public class DataAccessFactory
{
public static ICustomerDataAccess GetCustomerDataAccessObj()
{
return new CustomerDataAccess();
}
}

Finalmente implementamos el código de alto nivel que también implementa la interfaz creada. Nótese que nuestro componente de alto nivel no implmeente el componente de bajo nivel sino que simplemente lo usa.

public class CustomerBusinessLogic: ICustomerDataAccess
{
ICustomerDataAccess CustDataAccess;

public CustomerBusinessLogic()
{
CustDataAccess = DataAccessFactory.GetCustomerDataAccessObj();
}

public string GetCustomerName(int id)
{
return CustDataAccess.GetCustomerName(id);
}
}

Conclusión.

Este principio va muy de la mano de lo que se comonoce como Inversión de Control, y se utiliza pasando las interfaces de las abstracciones por medio de los contruxtores y así podemos utilizar directamente las implementaciones. Pero la verdad que es un principio que es muy dificil de explicar en unas líneas de un blog, por lo que te animo a practicarlo y luego ya verás que lo entiendes, y sin darte cuenta lo vas a ir aplicando fácilmente.

0 Comentarios

 
 
 

Archivo