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 Practices y Agile Principles, Patterns, and Practices in C#.
4 comentarios:
Gracias por el post, me ayudó mucho
Emanuel, me complace saber que te ha servido el post.
Saludos!!!
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
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.