πŸ’¬ Π’ Ρ‡Π΅ΠΌ ΡΡƒΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Dependency Inversion Π² Go?



Dependency Inversion Principle, DIP β€” это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· пяти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ.



Богласно DIP, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ высокого уровня Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Π½ΠΎ ΠΎΠ±Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций (интСрфСйсов Π² контСкстС Go). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, зависящий ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΊΠΎΠ΄Ρƒ.



πŸ“Œ Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ отправляСт увСдомлСния.



πŸ”Έ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ Π±Π΅Π· использования DIP:



package main



import "fmt"



// ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня

type EmailSender struct{}



func (es *EmailSender) SendEmail(message string) {

fmt.Printf("Sending email: %s\n", message)

}



// ΠœΠΎΠ΄ΡƒΠ»ΡŒ высокого уровня

type NotificationService struct {

emailSender *EmailSender

}



func NewNotificationService() *NotificationService {

return &NotificationService{emailSender: &EmailSender{}}

}



func (ns *NotificationService) SendNotification(message string) {

ns.emailSender.SendEmail(message)

}



func main() {

notificationService := NewNotificationService()

notificationService.SendNotification("Hello, world!")

}





Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ высокого уровня NotificationService Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависит ΠΎΡ‚ модуля Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня EmailSender, Ρ‡Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ DIP.



πŸ”Έ ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ с использованиСм DIP:



package main



import "fmt"



// Абстракция (интСрфСйс)

type MessageSender interface {

Send(message string)

}



// ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня

type EmailSender struct{}



func (es *EmailSender) Send(message string) {

fmt.Printf("Sending email: %s\n", message)

}



// ΠœΠΎΠ΄ΡƒΠ»ΡŒ высокого уровня

type NotificationService struct {

messageSender MessageSender

}



func NewNotificationService(ms MessageSender) *NotificationService {

return &NotificationService{messageSender: ms}

}





Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ высокого уровня NotificationService зависит ΠΎΡ‚ MessageSender.