当前位置:首页 > 科技  > 软件

几个祖传代码不遵守就想骂的代码规范

来源: 责编: 时间:2024-04-03 17:44:27 332观看
导读今天说几个我曾经在管理项目和团队要求的基本编码规范。实际执行下来成本比较低,长期坚持下来的确有助于项目的维护。虽然是几个非常基本的代码规范,但我们只在团队比较稳定的时候坚持下来过,后来随着人员更迭,懂得都懂。

今天说几个我曾经在管理项目和团队要求的基本编码规范。实际执行下来成本比较低,长期坚持下来的确有助于项目的维护。9N228资讯网——每日最新资讯28at.com

虽然是几个非常基本的代码规范,但我们只在团队比较稳定的时候坚持下来过,后来随着人员更迭,懂得都懂。 这里也不是吐槽谁的代码习惯不好, 我也干过复制旧代码过来就能用,妈呀真香,赶紧上线吧这种事情。9N228资讯网——每日最新资讯28at.com

9N228资讯网——每日最新资讯28at.com

数据表和Model的命名规范

类型
9N228资讯网——每日最新资讯28at.com

规则
9N228资讯网——每日最新资讯28at.com

正确示例
9N228资讯网——每日最新资讯28at.com

错误示例
9N228资讯网——每日最新资讯28at.com

数据表名
9N228资讯网——每日最新资讯28at.com

使用SnakeCase 命名法多个单词用下划线 _ 分割使用单词的复数形式命名9N228资讯网——每日最新资讯28at.com

vip_members
9N228资讯网——每日最新资讯28at.com

vipMembers   vipMember vip_member
9N228资讯网——每日最新资讯28at.com

数据表字段名
9N228资讯网——每日最新资讯28at.com

使用SnakeCase 命名法多个单词用下划线 _ 分割
9N228资讯网——每日最新资讯28at.com

user_name
9N228资讯网——每日最新资讯28at.com

userName UserName  _user_name
9N228资讯网——每日最新资讯28at.com

数据表在代码中的Model 名
9N228资讯网——每日最新资讯28at.com

使用CamelCase命名 单词使用单数形式9N228资讯网——每日最新资讯28at.com

VipMember  vipMember
9N228资讯网——每日最新资讯28at.com

VipMembers  Members  vip_member
9N228资讯网——每日最新资讯28at.com

关于为啥数据表用复数,Model用单数,我的理解是Model代表的是这类东西,在英语里应该用复数。9N228资讯网——每日最新资讯28at.com

下面说几个Go语言里比较容易坚持执行下去且能有助于我们减少BUG的编码规范。其他语言像Java的话,看阿里出的《阿里巴巴Java手册》就可以,里面要求的比较细致。9N228资讯网——每日最新资讯28at.com

Go语言编码规范

1.函数签名要避免歧义

函数名、参数名、参数类型、返回值类型要表达清楚要做的事情,避免产生歧义。这一条,感觉说简单非常简单,但是实际项目开发中,总是有不少人直接copy类似的函数,名字也不按使用场景去调整,让看代码的人就很难受。9N228资讯网——每日最新资讯28at.com

错误案例:9N228资讯网——每日最新资讯28at.com

func handleSomething(delay int) {  for {    // ...    time.Sleep(time.Duration(delay) * time.Millisecond)  }}poll(10) // delay参数定义成int 每次加的延迟是10毫秒还是10秒,还需要看poll函数的实现才知道

正确案例:9N228资讯网——每日最新资讯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.禁止使用硬编码的魔术数字或字符串进行逻辑判断

在逻辑判断里使用类似判断属性值是否等于某个硬编码的值时会使得代码晦涩难懂,应该使用更能从字面上看明白含义的常量来代替这些逻辑判断里硬编码的值。9N228资讯网——每日最新资讯28at.com

错误案例9N228资讯网——每日最新资讯28at.com

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

正确案例:9N228资讯网——每日最新资讯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函数中对前面已初始化后的全局变量进行更改。9N228资讯网——每日最新资讯28at.com

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

未初始化的map 默认值是nil , 可以对nil map进行读取,但是写入会直接panic:9N228资讯网——每日最新资讯28at.com

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

未初始化的slice,可以进行读取和append操作,但不做初始化遇到接口中要返回的某个字段查不到数据直接返回,该字段在JSON里会用null表示而不是[], 有一定几率造成前端错误。9N228资讯网——每日最新资讯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阻塞,程序最终会死锁:9N228资讯网——每日最新资讯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 解引用直接panic9N228资讯网——每日最新资讯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.代码逻辑要尽量减少嵌套

代码应通过尽可能先处理错误情况/特殊情况并尽早返回或继续循环来减少嵌套。减少嵌套多个级别的代码的代码量。9N228资讯网——每日最新资讯28at.com

错误案例:9N228资讯网——每日最新资讯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)  }}

正确案例:9N228资讯网——每日最新资讯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代码块

注意下面两种写法的直观感受:9N228资讯网——每日最新资讯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没法帮助提示这些参数的内部结构,这让其他人使用这个代码时就会很苦恼,还需要先看看函数实现里具体用到了字典的哪些键。9N228资讯网——每日最新资讯28at.com

针对比较复杂的代表一类事物的参数,应该先定义结构体,然后使用结构体指针或者结构体指针切片作为参数。9N228资讯网——每日最新资讯28at.com

错误案例:9N228资讯网——每日最新资讯28at.com

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

正确案例:9N228资讯网——每日最新资讯28at.com

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

本文链接:http://www.28at.com/showinfo-26-81250-0.html几个祖传代码不遵守就想骂的代码规范

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 用代码实现流水线部署,像诗一般优雅

下一篇: 我们一起聊聊如何在云上搭建无服务架构?

标签:
  • 热门焦点
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克&middot;扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:&ldquo;不仅
Top