Խոսեք SOLID-ի կախվածության սկզբունքի մասին, որը համապատասխանում է տառին D։
sobes.tech AI
Պատասխան AI-ից
Անվտանգության հակադարձման սկզբունք (Dependency Inversion Principle, DIP).
Բարձր մակարդակի մոդուլները չպետք է կախված լինեն ցածր մակարդակի մոդուլներից: Երկուսն էլ պետք է կախված լինեն աբստրակցիաներից: Աբստրակցիաները չպետք է կախված լինեն մանրամասներից: Մանրամասները պետք է կախված լինեն աբստրակցիաներից:
Նպատակը՝ նվազեցնել կոմպոնենտների միջև կապը, դարձնելով համակարգը ավելի ճկուն, թեստավորվող և մասշտաբային:
Swift-ում օրինակ՝
Ձախ:
class UserRepository {
func getAllUsers() -> [User] {
// Օգտագործողների ստացման տրամաբանություն կոնկրետ տվյալների բազայից կամ ցանցից
// ...իրականացում...
վերադարձնել []
}
}
class UserService {
private let repository = UserRepository() // Անկախ կոնկրետ իրականացմանից
func fetchUsers() -> [User] {
վերադարձնել repository.getAllUsers()
}
}
Լավ (DIP կիրառմամբ):
// Աբստրակցիա
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Նվազ մակարդակի մոդուլ (աբստրակցիայի իրականացում)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Օգտագործողների ստացման տրամաբանություն (իրականացման մանրամասներ)
// ...իրականացում...
վերադարձնել []
}
}
// Բարձր մակարդակի մոդուլ, որը կախված է աբստրակցիայից
class UserService {
private let repository: UserRepositoryProtocol // Կապվածություն աբստրակցիայից
init(repository: UserRepositoryProtocol) {
self.repository = repository // Կապվածության ներդրում
}
func fetchUsers() -> [User] {
վերադարձնել repository.getAllUsers()
}
}
// Կապվածությունների հավաքում (լավ է՝ օգտագործել DI կոնտեյներ)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Այստեղ UserService (բարձր մակարդակի մոդուլը) չի կախված ուղղակիորեն ConcreteUserRepository (նվազ մակարդակի մոդուլից), այլ կախված է աբստրակցիայից UserRepositoryProtocol: ConcreteUserRepository նույնպես կախված է աբստրակցիայից՝ իր իրականացման միջոցով: Կապվածությունը "ինվերտվում" է՝ փոխարենը բարձր մակարդակի մոդուլը կախված չէ ցածր մակարդակի մոդուլից, երկուսն էլ կախված են աբստրակցիայից։