Go語言中重構(gòu)的技巧分享
今天,我想談?wù)勏喈?dāng)簡單的事情。我不會(huì)發(fā)明什么,但我在生產(chǎn)代碼中經(jīng)??吹竭@樣的事情,所以我不能回避這個(gè)話題。
我經(jīng)常要解開多個(gè)復(fù)雜的 if else 結(jié)構(gòu)。多余的縮進(jìn)、過多的邏輯只會(huì)加深理解。首先,這篇文章的主要目的是讓代碼更透明、更易讀。不過,在某些情況下還是必須使用這些操作符。
else 操作
例如,我們有簡單的用戶處理程序:
func handleRequest(user *User) {
if user != nil {
showUserProfilePage(user)
} else {
showLoginPage()
}
}
如果沒有提供用戶,則需要將收到的請求重定向到登錄頁面。If else 似乎是個(gè)不錯(cuò)的決定。但我們的主要任務(wù)是確保業(yè)務(wù)邏輯單元在任何輸入情況下都能正常工作。因此,讓我們使用提前返回來實(shí)現(xiàn)這一點(diǎn)。
func handleRequest(user *User) {
if user == nil {
return showLoginPage()
}
showUserProfilePage(user)
}
邏輯是一樣的,但是下面的做法可讀性會(huì)更強(qiáng)。
break 操作
對我來說,Break 和 Continue 語句總是可以分解的信號。
例如,我們有一個(gè)簡單的搜索任務(wù)。找到目標(biāo)并執(zhí)行一些業(yè)務(wù)邏輯,或者什么都不做。
func processData(data []int, target int) {
for i, value := range data {
if value == target {
performActionForTarget(data[i])
break
}
}
}
你應(yīng)該始終記住,使用 break 操作符并不能保證整個(gè)數(shù)組都會(huì)被處理。這對性能有好處,因?yàn)槲覀儊G棄了不必要的迭代,但對代碼支持和可讀性不利。因?yàn)槲覀冇肋h(yuǎn)不知道程序會(huì)在列表的開頭還是結(jié)尾停止。
在某些情況下,帶有子任務(wù)的簡單功能可能會(huì)破壞這段代碼。
func processData(data []int, target int, subtask int) {
for i, value := range data {
if value == subtask {
performActionForSubTarget(data[i])
}
if value == target {
performActionForTarget(data[i])
break
}
}
}
這樣我們實(shí)際上可以拆出一個(gè) find 的方法:
func processData(data []int, target int, subTarget int) {
found := findTarget(data, target)
if found > notFound {
performActionForTarget(found)
}
found = findTarget(data, subTarget)
if found > notFound {
performActionForSubTarget(found)
}
}
const notFound = -1
func findTarget(data []int, target int) int {
if len(data) == 0 {
return notFound
}
for _, value := range data {
if value == target {
return value
}
}
return notFound
}
同樣的邏輯,但是拆分成更細(xì)粒度的方法,也有精確的返回語句,可以很容易地通過測試來實(shí)現(xiàn)。
continue 操作
該操作符與 break 類似。為了正確閱讀代碼,您應(yīng)該牢記它對操作順序的具體影響。
func processWords(words []string, substring string) {
for _, word := range words {
if !strings.Contains(word, substring) {
continue
}
// do some buisness logic
performAction(word)
}
}
Continue 使得這種簡單的流程變得有點(diǎn)難以理解。
讓我們寫得更簡潔些:
func processWords(words []string, substring string) {
for _, word := range words {
if strings.Contains(word, substring) {
performAction(word)
}
}
}
到此這篇關(guān)于Go語言中重構(gòu)的技巧分享的文章就介紹到這了,更多相關(guān)Go重構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中實(shí)現(xiàn)完美錯(cuò)誤處理實(shí)踐分享
Go?語言是一門非常流行的編程語言,由于其高效的并發(fā)編程和出色的網(wǎng)絡(luò)編程能力,越來越受到廣大開發(fā)者的青睞。本文我們就來深入探討一下Go?語言中的錯(cuò)誤處理機(jī)制吧2023-04-04
Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例
這篇文章主要為大家介紹了Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
解決Golang time.Parse和time.Format的時(shí)區(qū)問題
這篇文章主要介紹了解決Golang time.Parse和time.Format的時(shí)區(qū)問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

