Cuéntame sobre el principio de dependencias en SOLID, que corresponde a la letra D.
sobes.tech AI
Respuesta de la IA
Principio de inversión de dependencias (Dependency Inversion Principle, DIP).
Los módulos de alto nivel no deben depender de los de bajo nivel. Ambos deben depender de abstracciones. Las abstracciones no deben depender de los detalles. Los detalles deben depender de las abstracciones.
El objetivo del principio: reducir el acoplamiento entre componentes, haciendo que el sistema sea más flexible, testeable y escalable.
Ejemplo en Swift:
Malo:
class UserRepository {
func getAllUsers() -> [User] {
// Lógica para obtener usuarios de una base de datos o red específica
// ...implementación...
return []
}
}
class UserService {
private let repository = UserRepository() // Dependencia directa de una implementación concreta
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
Bueno (aplicando DIP):
// Abstracción
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Módulo de bajo nivel (implementación de la abstracción)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Lógica para obtener usuarios (detalles de implementación)
// ...implementación...
return []
}
}
// Módulo de alto nivel que depende de la abstracción
class UserService {
private let repository: UserRepositoryProtocol // Dependencia de la abstracción
init(repository: UserRepositoryProtocol) {
self.repository = repository // Inyección de dependencia
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Configuración de dependencias (mejor en un contenedor DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Aquí, UserService (módulo de alto nivel) no depende directamente de ConcreteUserRepository (módulo de bajo nivel), sino que depende de la abstracción UserRepositoryProtocol. ConcreteUserRepository también depende de la abstracción, implementándola. La dependencia se "invierte": en lugar de que el módulo de alto nivel dependa del de bajo nivel, ambos dependen de la abstracción.