這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
原創翻譯文章,轉載請註明出處:伺服器非業餘研究-sunface
對於代碼風格的爭議由來已久:程式員在一段代碼中到底該使用多少嵌套或者縮排結構。請先看看下面兩個例子:
在第一個例子中,如果我們想在高亮代碼附近進行debug,那麼我們需要記住哪些呢?
func (g *Gopher) WriteTo(w io.Writer) (size int64, err error) { err = binary.Write(w, binary.LittleEndian, int32(len(g.Name))) if err == nil { size += 4 var n int n, err = w.Write([]byte(g.Name)) size += int64(n) if err == nil { err = binary.Write(w, binary.LittleEndian, int64(g.AgeYears)) if err == nil { size += 4 } return } return } return}
答案是:在高亮代碼之前的每個if語句,這些語句每個都是一種狀態。接下來請繼續看看第二例子:
func (g *Gopher) WriteTo(w io.Writer) (size int64, err error) { err = binary.Write(w, binary.LittleEndian, int32(len(g.Name))) if err != nil { return } size += 4 n, err := w.Write([]byte(g.Name)) size += int64(n) if err != nil { return } err = binary.Write(w, binary.LittleEndian, int64(g.AgeYears)) if err == nil { size += 4 } return}
在這個例子中,高亮代碼對於代碼之前的邏輯(它到底從哪裡來的)所關心甚少 —— 它所需要知道的就是我們的代碼已經執行到這裡了。這種扁平的、大量“失敗-返回”的結構可以被稱為“迅速失敗”模式:在這種模式中,當你執行到代碼最底部時,你只需要一種狀態:代碼已經執行到最後了,並且成功了,並不需要向上層逐層返回。所以你可以忽略這個狀態之前的所有代碼和過程。當然了這兩段代碼在邏輯上是等價的。
最後不得不談到心智模型——當工作在一段本地代碼(本地狀態)的時候你還要記住那些“非本地元素”列表(代碼耦合度很高)。對於作者來說“非本地元素“列表就是非本地狀態的一種很好的定義。所以請記住避免狀態之間的耦合,盡量採用第二種模式來實現你的代碼。
原文地址:http://clipperhouse.com/2014/03/30/nesting-is-state/