გააზიარეთ 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-ც დამოკიდებულია აბსტრაქციაზე, მისი რეალიზაციის საშუალებით. დამოკიდებულების ინვერსია ხდება — მაღალი დონე მოდული არ არის დამოკიდებული დაბალ დონეზე, ორივე დამოკიდებულია აბსტრაქციაზე.