Principio de inversión de dependencia (DIP)

El Principio de inversión de dependencia (DIP) es el quinto y último del acrónimo SOLID y establece que: "Los módulos de alto nivel no deberían depender de módulos de bajo nivel, ambos deberían depender de abstracciones" y "Las abstracciones no deberían depender de detalles sino que los detalles deberían depender de las abstracciones". Si esto no es un buen trabalenguas, los trabalenguas dónde están...
Esto básicamente significa que en ningún lugar de nuestro código deberíamos depender de una implementación actual, sino que en su lugar debemos depender de interfaces o clases abstractas. ¿Y por qué deberíamos hacer esto? Porque esto nos habilita a cambiar cualquier implementación por otra y ninguna otra clase que hayamos codificado debe saberlo o importarle. Si, es así, a ninguna otra clase debe importarle que el cambiemos un colaborador por otro.
En este ejemplo podemos ver que la clase ProcesadorDeOrdenes depende de la implementación actual (detalle) de Repositorio y NotificadorPorMail. Entonces, si quisiéramos cambiar la manera en que se envían las notificaciones al cliente, por ejemplo por SMS, deberíamos crear la clase NotificadorPorSMS y deberíamos cambiar la clase ProcesadorDeOrdenes para que use tanto NotificadorPorMail como NotificadorPorSMS, lo cual, está mal, porque estamos haciendo que ProcesadorDeOrdenes sea consciente de la forma en que se envían las notificaciones.
Ahora, ProcesadorDeOrdenes ya no depende más de las implementaciones actuales, sólo se basa en interfaces: INotificadorPorMail y IRepositorio. Entonces, si ahora queremos cambiar la manera en que se envían las notificaciones simplemente debemos crear una nueva implementación de INotificadorPorMail y proveerle dicha implementación al ProcesadorDeOrdenes. Ésta, simplemente debe seguir trabajando como hasta el momento, su comportamiento ha cambiado, pero esto no le importa, sólo le importa su propia lógica.
Este principio fue postulado por Robert C. Martin y descrito en varias publicaciones incluyendo: Object Oriented Design Quality Metrics: an analysis of dependencies: un artículo publicado en el C++ Report en mayo de 1996 titulado El principio de inversión de dependencia. Y los libros Agile Software Development, Principles, Patterns, and PracticesAgile Principles, Patterns, and Practices in C#.

4 comentarios:

Emanuel dijo...

Gracias por el post, me ayudó mucho

Juan Barrionuevo dijo...

Emanuel, me complace saber que te ha servido el post.
Saludos!!!

Cristhian Emmanuel Fernández dijo...

Muchas gracias por tu post. Me parece una precisa y clara explicación de este principio. Solo tengo una duda. La interfaz que deben implementar los notificadores no debería llamarse mejor "INotificador" en vez de "INotificadorPorMail", ya que con este ultimo nombre denotaria que importa quien la implementa, pero lo que importa que las clases que la implementen tengan funciones o metodos en comun al ser notificadores (por ejemplo "enviarNotificacion()"). Saludos

Juan Barrionuevo dijo...

Muchas gracias por comentar, Cristhian.
En pro de una mejor abstracción del nombre de la interfaz, llamarla INotificador en lugar de INotificadorPorMail, me parece correcto.
Gracias por el aporte!!

Publicar un comentario

Muchas gracias por leer el post y comentarlo.

 
Copyright 2009 Programación SOLIDa
BloggerTheme by BloggerThemes | Design by 9thsphere