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()
);