Sobes.tech
Middle

Խոսեք 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 նույնպես կախված է աբստրակցիայից՝ իր իրականացման միջոցով: Կապվածությունը "ինվերտվում" է՝ փոխարենը բարձր մակարդակի մոդուլը կախված չէ ցածր մակարդակի մոդուլից, երկուսն էլ կախված են աբստրակցիայից։