Pastāstiet par atkarības principu SOLID, kas atbilst burtam D.
sobes.tech AI
Atbilde no AI
Atkarības inversijas princips (Dependency Inversion Principle, DIP).
Augstākā līmeņa moduļi nedrīkst būt atkarīgi no zemākā līmeņa moduļiem. Abi ir jāatkarīgās no abstrakcijām. Abstrakcijas nedrīkst būt atkarīgas no detaļām. Detaļas ir jāatkarās no abstrakcijām.
Mērķis: samazināt komponentu savstarpējo saistību, padarot sistēmu elastīgāku, testējamu un mērogojamu.
Piemērs Swift:
Slikti:
class UserRepository {
func getAllUsers() -> [User] {
// Lietotāju iegūšanas loģika no konkrētas datu bāzes vai tīkla
// ...īstenojums...
return []
}
}
class UserService {
private let repository = UserRepository() // Tieša atkarība no konkrētas īstenošanas
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
Labi (ar DIP piemērošanu):
// Abstrakcija
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Zema līmeņa modulis (īstenojums)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Lietotāju iegūšanas loģika (īstenošanas detaļas)
// ...īstenojums...
return []
}
}
// Augstākā līmeņa modulis, kas ir atkarīgs no abstrakcijas
class UserService {
private let repository: UserRepositoryProtocol // Atkarība no abstrakcijas
init(repository: UserRepositoryProtocol) {
self.repository = repository // Injekcija
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Atkarību savākšana (labāk — DI konteinerā)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Šeit UserService (augstākā līmeņa modulis) nav tieši atkarīgs no ConcreteUserRepository (zemākā līmeņa modulis), bet ir atkarīgs no abstrakcijas UserRepositoryProtocol. ConcreteUserRepository arī ir atkarīgs no abstrakcijas, to īstenojot. Atkarību inversija — vietā, lai augstākā līmeņa modulis būtu atkarīgs no zemākā līmeņa, abi ir atkarīgi no abstrakcijas.