Дар бораи принсипи вобастагӣ дар SOLID, ки ба ҳарфи D мувофиқат мекунад, нақл кунед.
sobes.tech AI
Ҷавоб аз AI
Принципи ивазкуи такя dependence (Dependency Inversion Principle, DIP).
Модулҳои сатҳи баланд набояд аз модулҳои сатҳи пасттар такя кунанд. Ҳарду бояд аз абстраксияҳо такя кунанд. Абстраксияҳо набояд аз тафсилот такя кунанд. Тафсилотҳо бояд аз абстраксияҳо такя кунанд.
Ҳадафи принсип: кам кардани пайвастагӣ байни компонентҳо, сохтани системаи бештар флексибл, тестшаванда ва масштабшаванда.
Масалан дар Swift:
Нодуруст:
class UserRepository {
func getAllUsers() -> [User] {
// Логикаи гирифтани корбарон аз базаи маълумот ё шабакаи махсус
// ...амалӣ кардан...
return []
}
}
class UserService {
private let repository = UserRepository() // Такяи мустақим ба иҷрои махсус
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
Дуруст (бо истифодаи DIP):
// Абстраксия
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Модул дар сатҳи паст (амалӣ кардани абстраксия)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Логикаи гирифтани корбарон (тафсилоти амалӣ)
// ...амалӣ кардан...
return []
}
}
// Модул дар сатҳи баланд, ки аз абстраксия такя мекунад
class UserService {
private let repository: UserRepositoryProtocol // Такя ба абстраксия
init(repository: UserRepositoryProtocol) {
self.repository = repository // Вуруд ба такя
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Тартиби пайвастшавии такяҳо (ба беҳтарин дар контейнер DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Ин ҷо, UserService (модул дар сатҳи баланд) мустақиман аз ConcreteUserRepository (модул дар сатҳи паст) такя намекунад, балки аз абстраксияи UserRepositoryProtocol. ConcreteUserRepository низ аз абстраксия такя мекунад ва онро амалӣ мекунад. Такя "баргашт" — ба ҷои он, ки модул дар сатҳи баланд аз сатҳи паст такя кунад, ҳар ду аз абстраксия такя мекунанд.