Kubernetes的代码规范
动机:
从换了工作以后开始做云方面的开发之后,一直思考如何再提高自己的代码质量。
发现了这篇文档,这是kubernetes建议contributor遵守的代码规约,我觉得对于云开发其实都很具有参考价值。文章不多,简单翻译整理一下,希望对其他和我一样入门云的同学有所帮助。
代码规范
这是一个集合,包含了项目中涉及的,指导方针,风格建议以及用不同语言写代码的提示。
代码规范
- Bash
- https://google.github.io/styl...
- 确保编译,发布,测试和集群管理的脚本,在macOS上可以允许
- Go
- Go Code Review Comments Go代码审查评论(可以理解为一些常见的错误集合)
- Effective Go(go语言的文档,入门go必看)
- 知道并避免go语言的地雷
- 注释你的代码:
- Go's commenting coventions(go的代码注释规范)
- 如果代码的审查者问起某一处代码为什么那么写,那其实是一个那里需要添加注释的信号。
- 命令行的flag,应该使用破折号,而不是下划线
破折号:
./fakestuff --hello-world xxx
下滑线:
./fakestuff --hello_world xxx
- 命名
- 【Kubernetes的代码规范】在选择interface名字的时候,请考虑到包名,以避免重复。
- 举例:
storage.Interface
就比storage.StorageInterface
更好。
- 举例:
- 不要在包名中使用大写,下划线和破折号
- 在选择包名的时候,请考虑到包的父目录名字。
- 所以文件
pkg/controllers/autoscaler/foo.go
的包名应该是package autoscaler
, 而非package autoscalercontroller
。 - 除非有特殊原因,否则
package foo
应该和go文件所在目录名匹配。(即go文件应该在/foo
下)。 - 引用包的地方可以进行重命名以避免歧意。
- 锁应该命名为
lock
,并且永远不应该被内嵌(永远保持lock sync.Mutex
)。当当前有多个锁的时候,给每一个锁一个符合go规范的不同名字 -statelock
,maplock
等。
此处添加一个内嵌结构的错误使用案例:
type A struct { lock sync.Mutex } type B struct { A // 此时B可以使用锁,但是其实应该给B也添加一个lock }
- 所以文件
- 【Kubernetes的代码规范】在选择interface名字的时候,请考虑到包名,以避免重复。
- API变更
- API规范
- kubectl规范
- 日志规范
- 所有的新包和新的重要功能,都必须有单元测试
- 表驱动测试是测试多个场景/输入的首选,参考: TestNamespaceAuthorization
- 重要的功能应该带有集成测试或者e2e测试
- 也包含新的kubectl和现有的主要功能,都需要集成测试或e2e测试
- 单元测试可以在macOS和Windows平台通过 - 如果你在使用Linux平台的特定功能,你的测试用例必须要么可以跳过其他平台,要么可以编译出来(当你的代码无法在windows上编译的时候,在编译的时候跳过这些linux平台的特定指令)。
- 避免依赖 Docker hub(比如从docker hub上拉取镜像)。使用 gcr.io 作为替代。
- 避免等待一小段时间(或不等待)然乎期待一个异步执行的事件发生(比如:等待1s,并预期某个pod开始运行)。应该使用“等待加重试”作为替代。
- 可以参考测试规范以获取更多的建议。
- 避免包蔓延。为新包找到一个合适的子目录。(详情可以参见#4851的讨论)
- 没什么好位置放的库,应该归属到
pkg/util
下。
- 没什么好位置放的库,应该归属到
- 避免通用的功能包。名字为“uitl”的包就很可疑。想法,想一个描述你需要的方法的包名。比如,一个处理等待操作的工具方法
Poll
,应该放在一个名为wait
的包中,全称为wait.Poll
。 - 文件名全部小些。
- Go源文件和目录应该使用下划线,而非破折号
- 包目录应该尽量避免使用多个单词,如果出现“a_b”的包名,那么意味着为好拆分一个子目录:
a/b
- 包目录应该尽量避免使用多个单词,如果出现“a_b”的包名,那么意味着为好拆分一个子目录:
- 文档目录和文件名应该使用破折号而非下划线
- 描述系统功能的人为示例,应该归属
/docks/user-guide
或者/docs/admin
, 具体取决于这是一个面向部署应用的用户还是集群管理员。 实际应用例子属于/examples
。
- 例子应该描述配置和使用这个系统的最佳实践。
- 第三方代码
- 对于普通第三方代码的依赖,应该使用go modules进行管理,在kubernetes的vendor指南中中有描述。
- 其他的第三方代码,放在
/third_party
目录下
- forked的第三方go代码,放在
/third_party/forked
- forked的golang 标准库代码,放在
/third_party/forked/golang
- forked的第三方go代码,放在
- 第三方代码必须带有licenses
- 包括修改过的第三方代码和摘录
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河