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

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

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

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

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

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

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

數據表和Model的命名規范

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Go語言編碼規范

1.函數簽名要避免歧義

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

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

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

正確案例:g4M28資訊網——每日最新資訊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.禁止使用硬編碼的魔術數字或字符串進行邏輯判斷

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

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

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

正確案例:g4M28資訊網——每日最新資訊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函數中對前面已初始化后的全局變量進行更改。g4M28資訊網——每日最新資訊28at.com

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

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

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

未初始化的slice,可以進行讀取和append操作,但不做初始化遇到接口中要返回的某個字段查不到數據直接返回,該字段在JSON里會用null表示而不是[], 有一定幾率造成前端錯誤。g4M28資訊網——每日最新資訊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阻塞,程序最終會死鎖:g4M28資訊網——每日最新資訊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 解引用直接panicg4M28資訊網——每日最新資訊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.代碼邏輯要盡量減少嵌套

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

錯誤案例:g4M28資訊網——每日最新資訊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)  }}

正確案例:g4M28資訊網——每日最新資訊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代碼塊

注意下面兩種寫法的直觀感受:g4M28資訊網——每日最新資訊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沒法幫助提示這些參數的內部結構,這讓其他人使用這個代碼時就會很苦惱,還需要先看看函數實現里具體用到了字典的哪些鍵。g4M28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲国产精品嫩草影院| 国产丝袜一区二区三区| 蜜桃av噜噜一区二区三区| 毛片一区二区| 欧美久久久久久久| 国产精品v亚洲精品v日韩精品| 国产精品视频第一区| 国产亚洲va综合人人澡精品| 一区在线观看| 一本久久青青| 久久全球大尺度高清视频| 欧美日韩视频| 狠狠爱www人成狠狠爱综合网| 亚洲精品国精品久久99热| 亚洲一区二区免费在线| 久久人人97超碰精品888| 欧美日韩在线视频一区| 狠狠色噜噜狠狠色综合久 | 亚洲国内自拍| 亚洲综合999| 欧美69视频| 国产伦精品一区| 亚洲精品久久久久| 欧美在线中文字幕| 欧美精品v日韩精品v国产精品| 国产欧美一区二区精品性色| 亚洲国产精品传媒在线观看 | 欧美视频在线观看视频极品| 狠狠色香婷婷久久亚洲精品| 亚洲视频观看| 蜜臀久久99精品久久久画质超高清| 国产精品国产三级欧美二区 | 亚洲欧美国内爽妇网| 欧美国产视频一区二区| 国产日韩欧美在线播放| 一区二区精品| 欧美成人自拍视频| 国产婷婷一区二区| 一本色道久久综合亚洲二区三区| 久久婷婷久久| 国产欧美va欧美不卡在线| 亚洲老板91色精品久久| 久久综合影音| 国产亚洲毛片| 亚洲专区欧美专区| 欧美日韩精品综合| 亚洲国产日韩欧美在线图片| 久久本道综合色狠狠五月| 国产精品福利在线| 日韩视频一区| 免费观看在线综合色| 国产一区二区三区四区三区四| 中日韩高清电影网| 欧美—级在线免费片| 黑人巨大精品欧美一区二区 | 久久久免费精品视频| 国产精品视频男人的天堂| 日韩午夜视频在线观看| 欧美/亚洲一区| 在线观看视频免费一区二区三区| 性做久久久久久久免费看| 欧美午夜片欧美片在线观看| 日韩亚洲欧美成人一区| 欧美成人a视频| 亚洲高清激情| 久久综合伊人| 在线观看亚洲a| 老司机亚洲精品| 一区二区三区在线视频免费观看| 欧美影院在线| 国产午夜精品一区理论片飘花| 亚洲欧美久久久久一区二区三区| 欧美日韩一区二区高清| 亚洲精品日本| 欧美另类高清视频在线| 亚洲精品免费在线播放| 欧美不卡三区| 亚洲人成人一区二区三区| 欧美激情一区二区久久久| 亚洲激情av| 欧美精品成人91久久久久久久| 亚洲区免费影片| 欧美乱在线观看| 99在线精品视频在线观看| 欧美日韩免费高清一区色橹橹| 亚洲乱码国产乱码精品精天堂 | 午夜精品久久久久| 国产伦精品一区二区三区四区免费| 亚洲一区999| 国产欧美一区二区精品仙草咪| 久久国产精品亚洲77777| 狠狠色伊人亚洲综合网站色| 免费不卡在线观看| 亚洲三级影片| 欧美视频在线一区二区三区| 亚洲一区在线看| 国产日韩欧美夫妻视频在线观看| 久久av一区二区| 在线观看亚洲视频啊啊啊啊| 欧美激情在线观看| 9久re热视频在线精品| 欧美无砖砖区免费| 欧美一区二区三区四区在线观看 | 国产日韩亚洲欧美精品| 久久久7777| 亚洲国产精品一区二区第四页av| 欧美日韩爆操| 亚洲欧美精品伊人久久| 国产综合久久久久久鬼色| 久久综合999| 99在线热播精品免费99热| 国产精品视频免费观看| 欧美中文在线观看国产| 揄拍成人国产精品视频| 欧美激情小视频| 亚洲一区三区电影在线观看| 激情久久综艺| 欧美日韩hd| 欧美一区二区网站| 亚洲国内欧美| 国产精品人人爽人人做我的可爱| 久久久久看片| 99视频一区二区三区| 国产亚洲欧美一区在线观看 | 国产在线观看91精品一区| 欧美激情精品久久久久久| 亚洲一区二区免费视频| 狠狠色综合日日| 欧美日韩另类国产亚洲欧美一级| 亚洲欧美日韩精品一区二区| 在线观看日韩国产| 国产精品激情偷乱一区二区∴| 久久天堂精品| 亚洲淫性视频| 亚洲国产天堂久久综合| 国产精品激情av在线播放| 久久嫩草精品久久久久| 在线一区欧美| 亚洲第一页在线| 国产精品扒开腿做爽爽爽视频| 久久蜜桃精品| 一区二区三区欧美成人| 国产专区综合网| 欧美色视频日本高清在线观看| 久久久精品tv| 亚洲一级影院| 亚洲精品小视频| 国产一区二区三区黄视频| 欧美日韩另类丝袜其他| 久久午夜视频| 亚洲影院免费观看| 亚洲欧洲精品一区二区精品久久久 | 亚洲深夜福利| 在线成人欧美| 国产伦精品一区二区三区高清| 欧美精品91| 久久中文欧美| 性久久久久久久久久久久| 亚洲毛片在线免费观看| 在线观看成人小视频| 国产日韩欧美一二三区| 欧美日韩免费看| 欧美a级片网站| 久久精品在线观看| 亚洲一区尤物| 一区二区日本视频| 亚洲国产成人不卡| 国产一区二区三区的电影 | 亚洲经典一区| 伊人春色精品| 国产日韩精品入口| 国产精品久久久999| 欧美日韩高清不卡| 免费成人黄色片| 久久免费的精品国产v∧| 午夜日韩电影| 亚洲资源av| 亚洲天堂成人在线观看| 亚洲免费av观看| 亚洲黄色尤物视频| 在线观看中文字幕不卡| 国产综合自拍| 国产一区二区三区高清在线观看| 国产精品xxxav免费视频| 欧美日韩国产91| 欧美日本国产在线| 欧美精品一区二| 欧美国产日韩免费| 你懂的一区二区| 久久综合久久综合久久| 久久精品成人一区二区三区蜜臀| 欧美亚洲视频在线看网址| 亚洲欧美视频在线观看视频| 亚洲无线视频| 亚洲男女毛片无遮挡| 亚洲在线日韩| 亚洲欧美色婷婷| 午夜亚洲伦理| 欧美在线地址| 久久久久久久999| 久久久久中文| 理论片一区二区在线| 毛片av中文字幕一区二区| 久久手机精品视频|