iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Software Development

軟體開發 - 程式不是會跑就好系列 第 26

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

  • 分享至 

  • xImage
  •  

文章同步於blog

前言

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

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

簡介

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

例如說

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實作

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) 來解除強耦合吧
依賴注入


上一篇
【Day-25】改造MVC - Controller(單元測試篇)
下一篇
【Day - 27】開發模式 - 隕石開發
系列文
軟體開發 - 程式不是會跑就好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言