Fale sobre o princípio de dependência no SOLID, que corresponde à letra D.
sobes.tech IA
Resposta da IA
Princípio da inversão de dependências (Dependency Inversion Principle, DIP).
Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações. As abstrações não devem depender de detalhes. Os detalhes devem depender de abstrações.
Objetivo do princípio: reduzir o acoplamento entre componentes, tornando o sistema mais flexível, testável e escalável.
Exemplo em Swift:
Ruim:
class UserRepository {
func getAllUsers() -> [User] {
// Lógica para obter usuários de uma base de dados ou rede específica
// ...implementação...
return []
}
}
class UserService {
private let repository = UserRepository() // Dependência direta de uma implementação concreta
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
Bom (aplicando DIP):
// Abstração
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Módulo de baixo nível (implementação da abstração)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Lógica para obter usuários (detalhes de implementação)
// ...implementação...
return []
}
}
// Módulo de alto nível que depende da abstração
class UserService {
private let repository: UserRepositoryProtocol // Dependência da abstração
init(repository: UserRepositoryProtocol) {
self.repository = repository // Injeção de dependência
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Configuração de dependências (melhor fazer em um container DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Aqui, UserService (módulo de alto nível) não depende diretamente de ConcreteUserRepository (módulo de baixo nível), mas depende da abstração UserRepositoryProtocol. ConcreteUserRepository também depende da abstração, implementando-a. A dependência é "invertida" — em vez de o módulo de alto nível depender do de baixo nível, ambos dependem da abstração.