Ispričaj o principu zavisnosti u SOLID-u, koji odgovara slovu D.
sobes.tech АИ
Одговор од АИ
Princip principa inverzije zavisnosti (Dependency Inversion Principle, DIP).
Moduli visokog nivoa ne bi trebalo da zavise od modula niskog nivoa. Oba bi trebalo da zavise od apstrakcija. Apstrakcije ne bi trebalo da zavise od detalja. Detalji bi trebalo da zavise od apstrakcija.
Cilj principa: smanjenje povezanosti između komponenti, čineći sistem fleksibilnijim, testabilnijim i skalabilnijim.
Primer u Swift:
Loše:
class UserRepository {
func getAllUsers() -> [User] {
// Logika za dobijanje korisnika iz konkretne baze podataka ili mreže
// ...implementacija...
return []
}
}
class UserService {
private let repository = UserRepository() // Direktna zavisnost od konkretne implementacije
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
Dobro (sa primenom DIP):
// Apstrakcija
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Nisko nivo modul (implementacija apstrakcije)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Logika za dobijanje korisnika (detalji implementacije)
// ...implementacija...
return []
}
}
// Visoko nivo modul koji zavisi od apstrakcije
class UserService {
private let repository: UserRepositoryProtocol // Zavisnost od apstrakcije
init(repository: UserRepositoryProtocol) {
self.repository = repository // Injektovanje zavisnosti
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Sastavljanje zavisnosti (bolje u DI kontejneru)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Ovde, UserService (modul visokog nivoa) ne zavisi direktno od ConcreteUserRepository (modul niskog nivoa), već od apstrakcije UserRepositoryProtocol. ConcreteUserRepository takođe zavisi od apstrakcije i implementira je. Zavisnost se "obrtom" — umesto da visok nivo zavisi od niskog, oba zavise od apstrakcije.