日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Go 重構(gòu):盡量避免使用 else、break 和 continue

今天,我想談?wù)勏喈?dāng)簡(jiǎn)單的事情。我不會(huì)發(fā)明什么,但我在生產(chǎn)代碼中經(jīng)??吹竭@樣的事情,所以我不能回避這個(gè)話(huà)題。

我經(jīng)常要解開(kāi)多個(gè)復(fù)雜的 if else 結(jié)構(gòu)。多余的縮進(jìn)、過(guò)多的邏輯只會(huì)加深理解。首先,這篇文章的主要目的是讓代碼更透明、更易讀。不過(guò),在某些情況下還是必須使用這些操作符。

else 操作

例如,我們有簡(jiǎn)單的用戶(hù)處理程序:

func handleRequest(user *User) {
    if user != nil {
        showUserProfilePage(user)
    } else {
        showLoginPage()
    }
}

如果沒(méi)有提供用戶(hù),則需要將收到的請(qǐng)求重定向到登錄頁(yè)面。If else 似乎是個(gè)不錯(cuò)的決定。但我們的主要任務(wù)是確保業(yè)務(wù)邏輯單元在任何輸入情況下都能正常工作。因此,讓我們使用提前返回來(lái)實(shí)現(xiàn)這一點(diǎn)。

func handleRequest(user *User) {
    if user == nil {
        return showLoginPage()
    } 
    showUserProfilePage(user)
}

邏輯是一樣的,但是下面的做法可讀性會(huì)更強(qiáng)。

break 操作

對(duì)我來(lái)說(shuō),Break 和 Continue 語(yǔ)句總是可以分解的信號(hào)。

例如,我們有一個(gè)簡(jiǎn)單的搜索任務(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ì)被處理。這對(duì)性能有好處,因?yàn)槲覀儊G棄了不必要的迭代,但對(duì)代碼支持和可讀性不利。因?yàn)槲覀冇肋h(yuǎn)不知道程序會(huì)在列表的開(kāi)頭還是結(jié)尾停止。

在某些情況下,帶有子任務(wù)的簡(jiǎn)單功能可能會(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ì)粒度的方法,也有精確的返回語(yǔ)句,可以很容易地通過(guò)測(cè)試來(lái)實(shí)現(xiàn)。

continue 操作

該操作符與 break 類(lèi)似。為了正確閱讀代碼,您應(yīng)該牢記它對(duì)操作順序的具體影響。

func processWords(words []string, substring string) {
    for _, word := range words {
        if !strings.Contains(word, substring) {
            continue
        }
        
        // do some buisness logic
        performAction(word)
    }
}

Continue 使得這種簡(jiǎn)單的流程變得有點(diǎn)難以理解。

讓我們寫(xiě)得更簡(jiǎn)潔些:

func processWords(words []string, substring string) {
    for _, word := range words {
        if strings.Contains(word, substring) {
            performAction(word)
        }
    }
}

本文名稱(chēng):Go 重構(gòu):盡量避免使用 else、break 和 continue
路徑分享:http://m.5511xx.com/article/cosgehg.html