成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 重構:盡量避免使用 else、break 和 continue

開發 前端
我經常要解開多個復雜的 if else 結構,多余的縮進、過多的邏輯只會加深理解。這篇文章的主要目的是讓代碼更透明、更易讀。

今天,我想談談相當簡單的事情。我不會發明什么,但我在生產代碼中經常看到這樣的事情,所以我不能回避這個話題。

我經常要解開多個復雜的 if else 結構。多余的縮進、過多的邏輯只會加深理解。首先,這篇文章的主要目的是讓代碼更透明、更易讀。不過,在某些情況下還是必須使用這些操作符。

else 操作

例如,我們有簡單的用戶處理程序:

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

如果沒有提供用戶,則需要將收到的請求重定向到登錄頁面。If else 似乎是個不錯的決定。但我們的主要任務是確保業務邏輯單元在任何輸入情況下都能正常工作。因此,讓我們使用提前返回來實現這一點。

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

邏輯是一樣的,但是下面的做法可讀性會更強。

break 操作

對我來說,Break 和 Continue 語句總是可以分解的信號。

例如,我們有一個簡單的搜索任務。找到目標并執行一些業務邏輯,或者什么都不做。

func processData(data []int, target int) {
    for i, value := range data {
        if value == target {
            performActionForTarget(data[i])
            break
        }
    }
}

你應該始終記住,使用 break 操作符并不能保證整個數組都會被處理。這對性能有好處,因為我們丟棄了不必要的迭代,但對代碼支持和可讀性不利。因為我們永遠不知道程序會在列表的開頭還是結尾停止。

在某些情況下,帶有子任務的簡單功能可能會破壞這段代碼。

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
        }
    }
}

這樣我們實際上可以拆出一個 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
}

同樣的邏輯,但是拆分成更細粒度的方法,也有精確的返回語句,可以很容易地通過測試來實現。

continue 操作

該操作符與 break 類似。為了正確閱讀代碼,您應該牢記它對操作順序的具體影響。

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

Continue 使得這種簡單的流程變得有點難以理解。

讓我們寫得更簡潔些:

func processWords(words []string, substring string) {
    for _, word := range words {
        if strings.Contains(word, substring) {
            performAction(word)
        }
    }
}
責任編輯:趙寧寧 來源: 愛發白日夢的后端
相關推薦

2024-03-25 10:00:00

C++編程else

2022-12-22 20:47:01

腳本循環結構

2009-07-21 14:38:08

Scalamatch表達式break和conti

2010-11-18 10:22:58

職場

2021-01-29 07:22:09

C#ContinueReturn

2009-08-27 12:56:53

breakcontinuereturn

2023-10-27 07:55:40

函數設計枚舉

2012-11-08 09:43:12

編程語言技術開發代碼重構

2024-01-05 07:41:08

Go語言語句

2023-11-14 08:00:00

Angular前端開發

2024-12-06 12:09:56

Java場景Break

2024-06-18 18:36:03

2023-02-10 10:14:59

普通索引唯一索引

2021-03-30 08:00:00

semanageSELinux工具

2022-01-03 08:06:15

函數Go數據

2024-04-26 08:58:54

if-else代碼JavaSpring

2019-11-19 16:10:24

面試官Java編程語言

2023-09-13 08:00:00

JavaScript循環語句

2024-06-06 09:09:41

SQL循環控制命令

2021-11-03 15:15:21

Go重構技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品www久久久久久广东 | 日本大香伊一区二区三区 | 亚洲视频 欧美视频 | 精品视频一区二区 | 国内精品在线视频 | 欧美精品一区二区三区四区 在线 | 亚洲精品高清视频 | 女生羞羞视频 | av中文在线播放 | 天天看天天爽 | 亚洲精品视频在线 | 日韩在线 | 国产亚洲欧美日韩精品一区二区三区 | 成人亚洲一区 | 丝袜久久| 国产精品国产成人国产三级 | 欧美一区二区三区四区五区无卡码 | 国产美女精品视频免费观看 | 亚洲欧洲精品在线 | 欧美午夜精品久久久久久浪潮 | 福利国产| 日韩在线播放中文字幕 | 国产精品一区二区福利视频 | 欧美国产日韩精品 | 一区二区免费 | a欧美 | 在线看一区二区三区 | 一本大道久久a久久精二百 国产成人免费在线 | 欧美中文在线 | 欧美激情一区二区 | 精品一区二区久久久久久久网站 | 色综合色综合网色综合 | 国产视频三级 | www一级片| 福利一区二区 | 亚洲看片| 国产一级片在线观看视频 | 国产精品国产精品国产专区不片 | 亚洲欧美成人影院 | 亚洲高清在线 | 久草视频2 |