日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

幾個祖傳代碼不遵守就想罵的代碼規范

來源: 責編: 時間:2024-04-03 17:44:27 213觀看
導讀今天說幾個我曾經在管理項目和團隊要求的基本編碼規范。實際執行下來成本比較低,長期堅持下來的確有助于項目的維護。雖然是幾個非常基本的代碼規范,但我們只在團隊比較穩定的時候堅持下來過,后來隨著人員更迭,懂得都懂。

今天說幾個我曾經在管理項目和團隊要求的基本編碼規范。實際執行下來成本比較低,長期堅持下來的確有助于項目的維護。rFP28資訊網——每日最新資訊28at.com

雖然是幾個非常基本的代碼規范,但我們只在團隊比較穩定的時候堅持下來過,后來隨著人員更迭,懂得都懂。 這里也不是吐槽誰的代碼習慣不好, 我也干過復制舊代碼過來就能用,媽呀真香,趕緊上線吧這種事情。rFP28資訊網——每日最新資訊28at.com

rFP28資訊網——每日最新資訊28at.com

數據表和Model的命名規范

類型
rFP28資訊網——每日最新資訊28at.com

規則
rFP28資訊網——每日最新資訊28at.com

正確示例
rFP28資訊網——每日最新資訊28at.com

錯誤示例
rFP28資訊網——每日最新資訊28at.com

數據表名
rFP28資訊網——每日最新資訊28at.com

使用SnakeCase 命名法多個單詞用下劃線 _ 分割使用單詞的復數形式命名rFP28資訊網——每日最新資訊28at.com

vip_members
rFP28資訊網——每日最新資訊28at.com

vipMembers   vipMember vip_member
rFP28資訊網——每日最新資訊28at.com

數據表字段名
rFP28資訊網——每日最新資訊28at.com

使用SnakeCase 命名法多個單詞用下劃線 _ 分割
rFP28資訊網——每日最新資訊28at.com

user_name
rFP28資訊網——每日最新資訊28at.com

userName UserName  _user_name
rFP28資訊網——每日最新資訊28at.com

數據表在代碼中的Model 名
rFP28資訊網——每日最新資訊28at.com

使用CamelCase命名 單詞使用單數形式rFP28資訊網——每日最新資訊28at.com

VipMember  vipMember
rFP28資訊網——每日最新資訊28at.com

VipMembers  Members  vip_member
rFP28資訊網——每日最新資訊28at.com

關于為啥數據表用復數,Model用單數,我的理解是Model代表的是這類東西,在英語里應該用復數。rFP28資訊網——每日最新資訊28at.com

下面說幾個Go語言里比較容易堅持執行下去且能有助于我們減少BUG的編碼規范。其他語言像Java的話,看阿里出的《阿里巴巴Java手冊》就可以,里面要求的比較細致。rFP28資訊網——每日最新資訊28at.com

Go語言編碼規范

1.函數簽名要避免歧義

函數名、參數名、參數類型、返回值類型要表達清楚要做的事情,避免產生歧義。這一條,感覺說簡單非常簡單,但是實際項目開發中,總是有不少人直接copy類似的函數,名字也不按使用場景去調整,讓看代碼的人就很難受。rFP28資訊網——每日最新資訊28at.com

錯誤案例:rFP28資訊網——每日最新資訊28at.com

func handleSomething(delay int) {  for {    // ...    time.Sleep(time.Duration(delay) * time.Millisecond)  }}poll(10) // delay參數定義成int 每次加的延遲是10毫秒還是10秒,還需要看poll函數的實現才知道

正確案例:rFP28資訊網——每日最新資訊28at.com

func handleSomething(delay time.Duration) {  for {    // ...    time.Sleep(delay)  }}poll(10 * time.Second) //delay參數定義成time.Duration類型, 調用時根據需求傳遞執行任務時要延遲的時間段  // 或者用參數名,明確告訴調用者,傳遞要延遲的秒數func handleSomething(delaySeconds int) {  for {    // ...    time.Sleep(delaySeconds * time.Second)  }}

2.禁止使用硬編碼的魔術數字或字符串進行邏輯判斷

在邏輯判斷里使用類似判斷屬性值是否等于某個硬編碼的值時會使得代碼晦澀難懂,應該使用更能從字面上看明白含義的常量來代替這些邏輯判斷里硬編碼的值。rFP28資訊網——每日最新資訊28at.com

錯誤案例rFP28資訊網——每日最新資訊28at.com

if prize.Type != 1 && prize.Type != 2{    ......}

正確案例:rFP28資訊網——每日最新資訊28at.com

const (  PRIZE_TYPE_COUPON = 1  PRIZE_TYPE_MONEY = 2  PRIZE_TYPE_VIPSCORE = 3)if prize.Type != PRIZE_TYPE_COUPON && prize.Type != PRIZE_TYPE_MONEY {    ......}

3.避免在init中修改已初始化好的數據

注意程序的完全確定性,不要依賴init執行的順序實現功能,比如在后執行的init函數中對前面已初始化后的全局變量進行更改。rFP28資訊網——每日最新資訊28at.com

4.slice、map、chan、struct指針使用前必須先初始化

未初始化的map 默認值是nil , 可以對nil map進行讀取,但是寫入會直接panic:rFP28資訊網——每日最新資訊28at.com

   var aMap map[string]stringaMap["foo"] = "bar" // panic

未初始化的slice,可以進行讀取和append操作,但不做初始化遇到接口中要返回的某個字段查不到數據直接返回,該字段在JSON里會用null表示而不是[], 有一定幾率造成前端錯誤。rFP28資訊網——每日最新資訊28at.com

type Person struct {    Friends []string}  func main() {    var f1 []string    f2 := make([]string, 0)     json1, _ := json.Marshal(Person{f1})    json2, _ := json.Marshal(Person{f2})    fmt.Printf("%s/n", json1)     fmt.Printf("%s/n", json2)}  {"Friends":null} {"Friends":[]}

向未初始化的nil chan 寫入會造成goroutine阻塞,程序最終會死鎖:rFP28資訊網——每日最新資訊28at.com

func main() {   //fmt.Println("Called heapAnalysis", heapAnalysis())   var achan chan struct{}   achan <- struct{}{} // fatal error: all goroutines are asleep - deadlock! }

struct指針默認為nil , 未初始化直接使用,假如程序邏輯里是查不到數據就不對指針指向的struct進行復制,后續邏輯代碼再使用指針引用struct里的字段進行判斷時會因為嘗試對nil pointer 解引用直接panicrFP28資訊網——每日最新資訊28at.com

func QueryData(a int) (data *Data, err error) {    // data 返回值直接使用時,默認是nil    // 確保安全應該先對data 進行初始化 data = new(Data)    data, err := querySomeData()    if errors.IsNotFoundErr(err) {        return;    }}  func main() {    dataP, err := QueryData()    if err != nil {        return err    }      if dataP.State == STATE_ACTIVE { // 此處有可能嘗試對nil pointer進行解引用,會造成空指針問題程序崩潰。        // active logic     }}

5.代碼邏輯要盡量減少嵌套

代碼應通過盡可能先處理錯誤情況/特殊情況并盡早返回或繼續循環來減少嵌套。減少嵌套多個級別的代碼的代碼量。rFP28資訊網——每日最新資訊28at.com

錯誤案例:rFP28資訊網——每日最新資訊28at.com

for _, v := range data {  if v.F1 == 1 {    v = process(v)    if err := v.Call(); err == nil {      v.Send()    } else {      return err    }  } else {    log.Printf("Invalid v: %v", v)  }}

正確案例:rFP28資訊網——每日最新資訊28at.com

for _, v := range data {  if v.F1 != 1 {    log.Printf("Invalid v: %v", v)    continue  }   v = process(v)  if err := v.Call(); err != nil {    return err  }  v.Send()}

6.減少不必要的else代碼塊

注意下面兩種寫法的直觀感受:rFP28資訊網——每日最新資訊28at.com

var a intif b {  a = 100} else {  a = 10}  // 減少了不必要的else塊// 如果在 if 和 else 兩個分支中都設置了變量,則可以將其替換為單個 if。a := 10if b {  a = 100}

7.盡量避免使用map[string]interface{} 類型的參數

在函數的參數中盡量不使用map[string]interface{}, map[string][string]這種類型的參數,IDE沒法幫助提示這些參數的內部結構,這讓其他人使用這個代碼時就會很苦惱,還需要先看看函數實現里具體用到了字典的哪些鍵。rFP28資訊網——每日最新資訊28at.com

針對比較復雜的代表一類事物的參數,應該先定義結構體,然后使用結構體指針或者結構體指針切片作為參數。rFP28資訊網——每日最新資訊28at.com

錯誤案例:rFP28資訊網——每日最新資訊28at.com

func AuthenticateUser(input map[string]interface{}) error {    name, _ := input[name].(string)    password, _ := input[name].(string)    findUser(input["name"], input["password"])    ...}

正確案例:rFP28資訊網——每日最新資訊28at.com

type UserAuth struct{  Name     string  Age      int32  Password string}func AuthenticateUser(input *UserAuth) error {    findUser(input.Name, input.Password)    ...}

本文鏈接:http://www.www897cc.com/showinfo-26-81250-0.html幾個祖傳代碼不遵守就想罵的代碼規范

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 用代碼實現流水線部署,像詩一般優雅

下一篇: 我們一起聊聊如何在云上搭建無服務架構?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 华坪县| 普兰县| 定西市| 东至县| 博兴县| 潮安县| 隆林| 红河县| 浠水县| 鹿泉市| 收藏| 保德县| 潮安县| 略阳县| 江西省| 临沧市| 汾阳市| 昌宁县| 肇东市| 永州市| 湄潭县| 双城市| 兴和县| 黎川县| 莱芜市| 花莲县| 敦煌市| 偏关县| 如皋市| 山阴县| 思茅市| 永嘉县| 南雄市| 衡阳县| 舒城县| 鲁甸县| 伊宁市| 西安市| 新巴尔虎左旗| 乐业县| 蒲城县|