Sobes.tech
Senior

Ի՞նչ է Dependency Inversion և Dependency Injection-ի հիմնական տարբերությունը։

sobes.tech AI

Պատասխան AI-ից

Անվտանգության հակադրումը (վերածնության սկզբունքը) SOLID սկզբունքներից մեկն է, որը ասում է, որ բարձր մակարդակի մոդուլները չպետք է կախված լինեն ցածր մակարդակի մոդուլներից, երկուսն էլ պետք է կախված լինեն աբստրակցիաներից: Աբստրակցիաները չպետք է կախված լինեն մանրամասներից, մանրամասները պետք է կախված լինեն աբստրակցիաներից:

Վերածնության ներդրում (Dependency Injection) կոնկրետ օրինակ կամ տեխնիկա է, որը իրականացնում է Անվտանգության հակադրության սկզբունքը: Դա մեթոդ է, որով արտաքինից փոխանցվում են կախվածությունները (օբյեկտները) դասին կամ ֆունկցիային, այլ ոչ թե ներսում ստեղծելու:

Այլ կերպ ասած՝

  • Անվտանգության հակադրությունը՝ դա նախագծման կամ կոնցեպտի սկզբունք է:
  • Վերածնության ներդրում՝ դա այդ կոնցեպտի իրականացման միջոց է, երբ կախվածությունները փոխանցվում են արտաքինից:

Օրինակ Go-ում:

// Աբստրակցիա
 type Notifier interface {
    Notify(message string)
}

// Կոնկրետ իրականացում
 type EmailNotifier struct {}

func (e EmailNotifier) Notify(message string) {
    fmt.Println("Էլեկտրոնային փոստ ուղարկվում է հաղորդագրությամբ:", message)
}

// Բարձր մակարդակի մոդուլ
 type UserService struct {
    notifier Notifier // կախված է աբստրակցիայից
}

// Վերածնության ներդրում կոնստրուկտորով
func NewUserService(n Notifier) *UserService {
    return &UserService{notifier: n}
}

func (s *UserService) RegisterUser(name string) {
    // գրանցման տրամաբանություն
    s.notifier.Notify("Օգտագործողը գրանցված է: " + name)
}

Այստեղ, Անվտանգության հակադրության սկզբունքը պահպանվում է Notifier ինտերֆեյսից կախվածությամբ, և վերածնության ներդրումը կատարվում է փոխանցելով կոնկրետ EmailNotifier իրականացումը UserService կոնստրուկտորին։