高质量编程
高质量: 编写的代码能够达到正确可靠、简洁清晰的目标。
编程原则:
1.简单性
(1) 消除“多余的复杂性”,以简单清晰的逻辑编写代码
(2) 不理解的代码无法修复改进
2.可读性
(1)代码是给人看的,而不是机器
(2)编写可维护代码的第一步是确保代码可读
3.生产力
编程在当前更多是团队合作,因此团队整体的工作效率是非常重要的一方面 为了降低新成员上手项目代码的成本,Go语言甚至通过工具强制统一所有代码格式 编码在整个项目开发链路中的一个节点,遵循规范,避免常见缺陷的代码能够降低后续联调、测试、验证、上线等各个节点的出现问题的概率,就算出现问题也能快速排查定位
编码规范
-
代码格式
可以使用
gofmt、goimports工具 -
注释
解释代码作用:适合注释公共符号
解释代码如何实现的:适合注释实现过程
解释代码实现的原因:适合解释代码的外部因素,提供额外上下文
什么情况下会出错:适合解释代码的限制条件
-
命名规范
-
简洁胜于冗长
-
缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
- 例如使用
ServeHTTP而不是ServeHttp - 使用
XMLHTTPRequest或者xmlHTTORequest
- 例如使用
-
变量距离其被使用的地方越远,则越需要携带越多的上下文信息
- 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义
-
i和index的作用域范围仅限于for循环内部时index的额外冗长几乎没有增加对于程序的理解
- 将`deadline`替换成`t`降低了变量的信息量
- t常代指任意时间
- deadline指截止时间,有特定含义
package
- 只由小写字母组成,不包含大写字母和下划线等字符。
- 简短并包含一定的上下文信息。例如shema、task
- 不要与标准库同名。
- 控制流程
如果两个分支都包含return语句,则可以去除冗余的else 方便后续维护,else一般是正常流程,如果需要在正常流程新增判断逻辑,避免分支嵌套
- 最常见的正常流程的路径被嵌套在两个if条件内
- 成功的退出条件是return nil,必须仔细匹配大括号来发现
- 函数最后一行返回一个错误,需要追溯到匹配的左括号,才能了解何时会触发错误
- 如果后续正常流程需要增加一步操作,调用新的函数,则又会增加一层嵌套
调整后的代码
- 错误和异常处理
简单错误
- 简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
- 优先使用errors.New来创建匿名变量来直接表示错误
- 如果有格式化的需求,使用fmt.Errorf
错误的Wrap和Unwrap
- 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链
- 在fmt.Errorf中使用%w关键字来将一个错误关联至错误链中