SOLIDтеги көзкарандылык принциби жөнүндө айтып бериңиз, ал D тамгасына туура келет.
sobes.tech AI
AIден жооп
Тендиктин тескери принципи (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 да абстракцияга көз каранды, аны ишке ашыруу аркылуу. Көз карандылыктун инверсиясы — жогорку деңгээл модул төмөнкү деңгээл модулга көз каранды болбойт, экөө тең абстракцияга көз каранды.