今天,我想談談相當簡單的事情。我不會發明什么,但我在生產代碼中經常看到這樣的事情,所以我不能回避這個話題。
我經常要解開多個復雜的 if 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 和 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 = -1func findTarget(data []int, target int) int { if len(data) == 0 { return notFound } for _, value := range data { if value == target { return value } } return notFound}
同樣的邏輯,但是拆分成更細粒度的方法,也有精確的返回語句,可以很容易地通過測試來實現。
該操作符與 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) } }}
本文鏈接:http://www.tebozhan.com/showinfo-26-16385-0.htmlGo 重構:盡量避免使用 else、break 和 continue
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Python十大常用庫:讓你的Python編程更上一層樓
下一篇: Java循環的終止方式