Saltar al contenido principal

Dependency Inversion Principle (DIP)

Definición: Los módulos de alto nivel no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones. Code Smell Relacionado:

  • Acoplamiento Alto
  • Dependencias Concretas
  • Dificultad para Testear

Técnicas de Refactorización:

  • Dependency Injection: Inyectar dependencias en lugar de crearlas internamente
  • Introduce Factory: Usar fábricas para crear objetos
  • Extract Interface: Depender de interfaces en lugar de implementaciones concretas
class UserService {
constructor() {
this.database = new MySQLDatabase(); // Dependencia concreta
this.logger = new FileLogger(); // Dependencia concreta
}

createUser(userData) {
this.logger.log("Creating user");
return this.database.insert("users", userData);
}

getUser(userId) {
this.logger.log("Fetching user");
return this.database.select("users", userId);
}
}
class UserService {
constructor(database, logger) {
this.database = database; // Inyección de dependencia
this.logger = logger; // Inyección de dependencia
}

createUser(userData) {
this.logger.log("Creating user");
return this.database.insert("users", userData);
}

getUser(userId) {
this.logger.log("Fetching user");
return this.database.select("users", userId);
}
}

// Uso:
const userService = new UserService(
new MySQLDatabase(),
new FileLogger()
);