Golang - Design Pattern #18: 原型模式 (Null Object)

2023/08/28閱讀時間約 3 分鐘
raw-image
🌌 優雅處理空值 🌌

在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!本文將深入探討如何在 Go 中使用空物件模式。


空物件模式 🌠

空物件模式的核心思想是使用一個提供了預設行為的物件,代替nilnull。這樣,當我們期望的物件不存在時,我們可以使用這個空物件,而不是返回nilnull。這通常可以減少檢查nil的次數,並提供一種更一致、可靠的方法來處理物件的不存在情況。


來點 Go


🌈 處理用戶設定

假設我們有一個系統,該系統允許用戶自定義某些設定。如果用戶沒有提供設定,我們可以使用空物件模式提供一個預設的設定。


type UserSettings interface {
GetTheme() string
}

type RealUserSettings struct {
Theme string
}

func (rus *RealUserSettings) GetTheme() string {
return rus.Theme
}

type NullUserSettings struct{}

func (nus *NullUserSettings) GetTheme() string {
return "Default Theme"
}

// Usage
var settings UserSettings

if userHasSettings {
settings = &RealUserSettings{Theme: "Dark Mode"}
} else {
settings = &NullUserSettings{}
}

theme := settings.GetTheme() // Always get a valid theme without checking for nil!


📘 處理日誌記錄

在某些情況下,我們可能只想在開發模式下記錄日誌,而在生產模式下不進行日誌記錄。這時,空物件模式可以派上用場。


type Logger interface {
Log(message string)
}

type ConsoleLogger struct{}

func (cl *ConsoleLogger) Log(message string) {
fmt.Println(message)
}

type NullLogger struct{}

func (nl *NullLogger) Log(message string) {}

// Usage
var logger Logger

if isDevelopmentMode {
logger = &ConsoleLogger{}
} else {
logger = &NullLogger{}
}

logger.Log("This is a log message.") // In production mode, this won't print anything!


小結

空物件模式為我們提供了一個優雅的方法來處理空值情況,減少了需要進行nil檢查的地方,並提高了程式碼的可讀性和健壯性🚀。該模式特別適合於那些需要預設行為或值的場景。希望這篇文章能幫助你在 Go 中更優雅地處理空值情況!

30會員
193內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
發表第一個留言支持創作者!