0%

【Day-26】淺談DI - 可以嘗試不在function裡面建立物件

文章同步於it邦

前言

大家一定都有自己建立物件的經驗
但你有沒有想過
當今天我們要修改建立物件的內容的時候
面臨到要改的範圍過大的問題

今天我們可以使用依賴注入(Dependency Injection, DI)的方式,來規範我們的Class

簡介

DI到底是什麼呢
這是一種設計模式,傳統上當我需要某個物件的時候
我就會直接建立他,而這個狀況會有一個壞處就是,有時當我修改原本的被建立物件的function,我就必須大規模修改我的程式碼

例如說

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
"fmt"
)

type Notifier interface {
SendNotification(message string)
}

type EmailNotifier struct{}

func (e *EmailNotifier) SendNotification(message string) {
fmt.Printf("Email sent: %s\n", message)
}

type OrderProcessor struct{}

func (op *OrderProcessor) ProcessOrder(orderID int) {
// 處理訂單邏輯

notifier := &EmailNotifier{}
notifier.SendNotification(fmt.Sprintf("Order #%d processed", orderID))
}

func main() {
// 處理訂單
orderProcessor := &OrderProcessor{}
orderProcessor.ProcessOrder(123)
}

雖然用Golang可能會不太明顯
不過還是將就一下
我們可以看到此時我們是在比較低階的模組去實體化我們的EmailNotifier

DI實作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"fmt"
)

// 定義通知服務接口
type Notifier interface {
SendNotification(message string)
}

// EmailNotifier 實現了通知服務接口
type EmailNotifier struct{}

func (e *EmailNotifier) SendNotification(message string) {
fmt.Printf("Email sent: %s\n", message)
}

// 訂單處理,依賴通知服務
type OrderProcessor struct {}

func (op *OrderProcessor) ProcessOrder(orderID int, notifier Notifier) {
// 處理訂單邏輯

// 發送通知
notifier.SendNotification(fmt.Sprintf("Order #%d processed", orderID))
}

func main() {
// 創建 EmailNotifier 實例
notifier := &EmailNotifier{}

// 使用依賴注入,將通知服務傳遞給訂單處理
orderProcessor := &OrderProcessor{notifier}

// 處理訂單
orderProcessor.ProcessOrder(123)
}

不過這樣僅僅只做到了將傳遞模組的工作交給更上層的main()
但只少這樣能夠先把依賴給稍微降低

參考資料

淺入淺出 Dependency Injection
菜雞新訓記 (6): 使用 依賴注入 (Dependency Injection) 來解除強耦合吧
依賴注入