Veamos el DIP
DIP (Dependency Inversion Principle – Principio de Inversión de Dependencias)
+ Los módulos de alto nivel no deben depender de módulos de bajo nivel. ambos deben depender de abstracciones
+ Las abstracciones no deben depender de detalles. Los detalles deben depender de las abstracciones.
“La estructura de dependencias en una aplicación orientada a objetos bien diseñada suele ser la inversa”.
La inversión de dependencias se puede realizar siempre que una clase envía un mensaje a otra y deseamos eliminar la dependencia.
Vamos con un mal ejemplo, para luego ir al bueno:
// DIP - mal ejemplo
class Worker {
public void work() {
// ....working
}
}
class Manager {
Worker m_worker;
public void setWorker(Worker w) {
m_worker=w;
}
public void manage() {
m_worker.work();
}
}
class SuperWorker {
public void work() {
//.... working much more
}
}
Y aquí vendría la versión “buena”
// DIP
interface IWorker {
public void work();
}
class Worker implements IWorker{
public void work() {
// ....working
}
}
class SuperWorker implements IWorker{
public void work() {
//.... working much more
}
}
class Manager {
IWorker m_worker;
public void setWorker(IWorker w) {
m_worker=w;
}
public void manage() {
m_worker.work();
}
}
Como siempre, con ejemplos es como mejor se entiende. Aunque este principio básicamente se resume en los 2 puntos del inicio:
+ Los módulos de alto nivel no deben depender de módulos de bajo nivel. ambos deben depender de abstracciones
+ Las abstracciones no deben depender de detalles. Los detalles deben depender de las abstracciones.
Cuando se aplica este principio significa que las clases de alto nivel no trabajan directamente con las de bajo nivel, utilizan interfaces como una capa de abstracción. En este caso la creación de nuevos objetos de bajo nivel dentro de las clases de alto nivel no se puede hacer usando “new”. (En lugar de eso, deberíamos usar el método de Factoría, Abstracto, Prototype.)
Por supuesto, utilizar este principio implica mucha más complejidad en el código, pero a la vez, obtenemos un código mucho más flexible.