Opowiedz o zasadzie zależności w SOLID, która odpowiada literze D.
sobes.tech AI
Odpowiedź od AI
Zasada odwracania zależności (Dependency Inversion Principle, DIP).
Moduły wysokiego poziomu nie powinny zależeć od modułów niskiego poziomu. Oba powinny zależeć od abstrakcji. Abstrakcje nie powinny zależeć od szczegółów. Szczegóły powinny zależeć od abstrakcji.
Cel zasady: zmniejszenie powiązań między komponentami, czyniąc system bardziej elastycznym, testowalnym i skalowalnym.
Przykład w Swift:
Złe:
class UserRepository {
func getAllUsers() -> [User] {
// Logika pobierania użytkowników z konkretnej bazy danych lub sieci
// ...implementacja...
return []
}
}
class UserService {
private let repository = UserRepository() // Bezpośrednia zależność od konkretnej implementacji
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
Dobrze (z zastosowaniem DIP):
// Abstrakcja
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Moduł niskiego poziomu (implementacja abstrakcji)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Logika pobierania użytkowników (szczegóły implementacji)
// ...implementacja...
return []
}
}
// Moduł wysokiego poziomu zależny od abstrakcji
class UserService {
private let repository: UserRepositoryProtocol // Zależność od abstrakcji
init(repository: UserRepositoryProtocol) {
self.repository = repository // Wstrzyknięcie zależności
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Konfiguracja zależności (lepiej w kontenerze DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Tutaj, UserService (moduł wysokiego poziomu) nie zależy bezpośrednio od ConcreteUserRepository (moduł niskiego poziomu), lecz od abstrakcji UserRepositoryProtocol. ConcreteUserRepository również zależy od abstrakcji, ją implementując. Zależność "odwraca się" — zamiast, aby moduł wysokiego poziomu zależał od niskiego, oba zależą od abstrakcji.