第六届字节跳动青训营第三课 | 青训营

89 阅读3分钟

1. 高质量的定义

各种边界条件是否完备 异常情况能正常处理,稳定性有保障 易读易维护 Go语言开发者Dave Cheney指出,编程需要遵循以下原则:

  1. 简单性

消除多余的复杂性,以简单清晰的逻辑编写代码 无法理解的代码意味着无法修复和改进

  1. 可读性

代码是给人看的 编写可维护代码的第一步是确保代码可读 3. 生产力

团队整体工作效率很重要: 一、注释 : 包中生命的每个公共符号,包括变量、函数以及结构体都要注释 任何既不明显也不简短的公共功能 都要注释 无论长度或者复杂程度,库中任何函数都需要进行注释 实现接口的函数不需要注释 gofmt是Go语言官方提供的工具,能够自动格式化Go语言代码为官方统一风格,一般的IDE比如GoLand直接内置并且默认开启gofmt

除了gofmt之外还有goimport,实际上等于gofmt加上依赖包管理,会自动增删依赖包的引用并且按照字母排序并分类

注释需要: 解释代码作用、代码的逻辑、代码实现的原因、在什么情况下会出错

1.解释代码的作用

在功能和逻辑不太明显的情况需要额外注释,而对于逻辑清晰的比如:

for e := range elements{
    process(e)
}

可以不需要注释

2.注释代码的实现原因

对于注释,我们应该解释代码实现的原因,另外还可以解释代码的外部因素,和额外的上下文关系

3.注释代码的出错原因

适合解释代码的限制条件,比如对于将字符串转化为时间格式的方法

那么上面则解释了传入非法的、不符合格式的字符串会触发什么异常

4.公共符号始终要注释

小结

总而言之,代码就是最好的注释,而注释需要提供代码未表达的上下文信息

二、命名

1.变量名

简洁胜于冗长 缩略词全大写,但是如果位于变量头则全小写 变量距离其被使用的地方越远,则需要携带更详细的信息 比如:

for i := 0; i < 10; i++ {
   process()
}
for index := 0; index < 10; index++ {
   process()
}

2.函数名

函数名不懈怠包名已有的上下文信息,因为包名和函数名会一起出现 函数名尽量简短 当名为foo的包的某个函数返回的类型T并不是Foo的时候,可以在返回的函数名中加入类型信息 比如在http包中有一个创建服务的函数,有以下两种命名:

func Serve(l net.Listener, handler Handler)
func ServeHTTP(l net.Listener, handler Handler)

其中,要调用这个函数分别是使用http.Serve和http.ServeHTTP。我们发现http.ServeHTTP对于http重复描述了,实际上不够好,更合适的命名方式为http.Serve

3.包名

只使用小写字母组成,不包含大写字母和下划线 简短并包含一定上下文信息 不要和标准库同名

小结

核心目标是降低阅读理解代码的成本,重点考虑上下文名称,设计简洁清晰的名称

三、流程控制

1.避免嵌套,保证流程清晰

如果两个分支中都有return,则需要去除冗余的else

2.复杂的控制流程,优先处理错误和特殊情况,尽早返回或者继续循环来减少嵌套

也就是要尽量的扁平,减少嵌套层数