Dave Cheney:編寫簡單,可讀,可維護的Go程式碼的十個工程建議

Cloud001發表於2020-02-05

本文最早由davecheney發表於 GopherCon Israel 2020,今天早上在GitHub上開源,https://github.com/davecheney/the-zen-of-go/blob/master/the-zen-of-go.adoc。

Dave Cheney是誰?

Dave Cheney是Go程式語言的開源貢獻者和專案成員。Dave Cheney是科技界備受尊重的代言人,他講的是軟體設計,效能和Go程式語言等各種主題。從2009年起,Dave Cheney就開始在世界各地寫作,教學和演講golang。Dave Cheney目前是VMware技術人員。在他的前公司收購之前,他曾在位於西雅圖的公司Heptio擔任工程師,專注於構建工具,幫助開發人員提高Kubernetes的工作效率。
更多瞭解Dave -> https://dave.cheney.net/about


## 編寫簡單,可讀,可維護的Go程式碼的十個建議

### Package的單一職責原則

對於一個Go package來說,好的設計是隻表達一個主題,提供的是一系列與該主題相關的方法,並且具有規範的命名。試著把你package的名字想象成一個產品營銷的演講,儘量用一個最恰當的詞來描述它所提供的內容。

### 錯誤的及時處理

健壯的程式碼總是能在程式崩潰之前及時地處理錯誤。儘管 `if err!= nil { return err }`冗長地出現在程式碼當中,但是它是非常有用的,總能在出錯的地方及時給你一個反饋,所以不要牴觸這種錯誤處理。不過對於`panic`和`recover`的使用來說,就要謹慎和剋制一些。
### 及時返回避免巢狀
你每多一個條件巢狀,都會或多或少地對程式的效能造成影響,也會造成可讀性的降低。所以儘量避免多層巢狀的控制流程。
### 是否使用併發由呼叫方決定
如果你的庫使用了併發,讓呼叫者選擇是否要併發執行你的庫或函式,不要強加於他們。
### 瞭解你的goroutine的生命週期
Goroutines佔用的資源包括鎖,變數,記憶體等。只有及時停止goroutine才能釋放這些資源,所以你務必
瞭解你的goroutine的生命週期。
### Avoid package level state
Seek to be explicit, reduce coupling, and spooky action at a distance by providing the dependencies a type needs as fields on that type rather than using package variables.(實在不知道怎麼解釋,就不誤人子弟了)
### 簡潔至上
簡潔並不是複雜的反義詞,而是意味著可讀性和可維護性。在可能的情況下,選擇更簡潔的解決方案
### 測試用例是你package API的門面
儘管使用者使用的是你的API,但是詳盡的測試用例能夠給使用者足夠的安全感。
### Talk is cheap, show me your benchmark
有太多的程式碼打著提升效能的旗號而沒有考慮其可維護性。要警惕過度優化帶來的緊耦合、封裝性差、可讀性差的問題。如果你選擇承擔這些成本,一定要給出有說服力的理由。
### 剋制是一種美德
適當地使用goroutines、channels、locks、interface、embedded等技術,切勿炫技。
### 可維護性
可維護性包括清晰,易讀,簡單等方面。你能想象到在你走後,你同事會如何看待你你留下的一坨程式碼嗎?所以你現在就應該考慮一下如何讓後面的人更容易地接手你的程式碼。

緊跟Go官方blog的步伐,追蹤熱點資訊,盡在go official blog。

如發現文中錯誤,可至公眾號反饋(也歡迎技術交流),一經採納有紅包奉上喲。

相關文章