# 编程规范
# Flag
- https://github.com/topics/styleguide (opens new window)
- 十二要素 https://github.com/heroku/12factor (opens new window)
- 敏捷宣言 https://agilemanifesto.org (opens new window)
- 贡献者契约 https://github.com/EthicalSource (opens new window)
- License https://en.wikipedia.org/wiki/Software_license (opens new window)
- https://github.com/fossas (opens new window)
- https://spdx.org/licenses (opens new window)
- https://opensource.org/licenses (opens new window)
- 开源指南 https://github.com/github/opensource.guide (opens new window)
- https://creativecommons.org (opens new window)
- https://www.apiref.com (opens new window)
- HTTP 的业务错误码 (opens new window)
- https://open.weibo.com/wiki/Error_code (opens new window)
- 适合测试人员看的经典书籍有哪些? (opens new window)
- 《软件测试的艺术》读书笔记 (opens new window)
- 软件测试之代码审查和代码走查 (opens new window)
- 安全评估 https://github.com/chaitin/xray (opens new window)
- https://github.com/whwlsfb/BurpCrypto (opens new window)
- 为什么你不应该继续在文本格式中使用时间戳 (opens new window)
- UUID https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format (opens new window)
- https://github.com/ai/nanoid (opens new window)
- https://github.com/sony/sonyflake (opens new window)
- https://github.com/segmentio/ksuid (opens new window)
- https://github.com/rs/xid (opens new window)
- https://github.com/paralleldrive/cuid2 (opens new window)
- https://github.com/ai/nanoid (opens new window)
- https://github.com/boundary/flake (opens new window)
- https://github.com/richardtallent/RT.Comb (opens new window)
- https://github.com/ppearcy/elasticflake (opens new window)
- https://github.com/T-PWK/flake-idgen (opens new window)
- https://github.com/uuidjs/uuid (opens new window)
- 雪花算法唯一数字ID https://github.com/yitter/IdGenerator (opens new window)
- https://github.com/sqids (opens new window)
- ULID https://github.com/ulid (opens new window)
- https://github.com/geckoboard/pgulid (opens new window)
- https://github.com/oklog/ulid (opens new window)
- 随机数 https://www.random.org (opens new window)
- 治理 Cloudflare 办公室里的混乱情况 (opens new window)
编程语言提供的随机数,是伪随机数,所谓伪随机数,并非真的随机,而是算法得到的。只要初始的种子值相同,算法会给出一样的结果。 一般来说,只有通过硬件,才能得到真随机数,单纯的软件算法做不到。真随机数需要满足三个条件。
- 无法预测。 随机数不能被猜到,所以必须非常大,否则会被暴力破解。
- 不能重复。 每次生成的随机数,不能是一样的。
- 均匀分布。 随机数必须平均散布在所有区间,不能集中在某些区间。
boolean
bool表示布尔型变量,bai也du就是逻辑型变量的定义符,zhi以英国数学家、布尔代数的奠基人乔dao治·布尔(George Boole)命名。
布尔型变量bool的取值只有false和true,0为false,非0为true。(例如-1和1都是true)
日期时间字符格式表示法
- ISO 8601(第一版为ISO8601:1988,第二版为ISO8601:2000,第三版ISO8601:2004):国际标准,每周从周一开始,每年的第一周至少包含4天
- Common:通用标准,每周从周日开始,每年的第一周至少包含1天
# 代码风格指南
naming conventions 约定大于配置
- https://github.com/topics/clean-code (opens new window)
- https://github.com/topics/styleguide (opens new window)
- https://github.com/topics/style-guide (opens new window)
- https://github.com/topics/formatter (opens new window)
- https://github.com/topics/standard (opens new window)
- https://github.com/topics/conventions (opens new window)
- https://github.com/Kristories/awesome-guidelines (opens new window)
- Web界面开发指南 https://github.com/raunofreiberg/interfaces (opens new window)
- 谷歌代码风格 https://github.com/google/styleguide (opens new window)
- JavaScript https://github.com/standard/standard (opens new window)
- https://github.com/ryanmcdermott/clean-code-javascript (opens new window)
- https://github.com/sivan/javascript-style-guide (opens new window)
- https://github.com/airbnb/javascript (opens new window)
- https://github.com/arcticicestudio/styleguide-javascript (opens new window)
- css https://github.com/necolas/idiomatic-css (opens new window)
- HTML/CSS开发规范指南 https://github.com/doyoe/html-css-guide (opens new window)
- https://www.oracle.com/cn/java/technologies/javase/codeconventions-contents.html (opens new window)
- 阿里巴巴Java开发手册和插件 https://github.com/alibaba/p3c (opens new window)
- 代码安全指南 https://github.com/Tencent/secguide (opens new window)
- 干净的代码 https://github.com/JuanCrg90/Clean-Code-Notes (opens new window)
- 系统重构与迁移指南 https://github.com/phodal/migration (opens new window)
- https://github.com/xianweics/refator-code (opens new window)
- 安全编码手册 https://github.com/joswha/Secure-Coding-Handbook (opens new window)
- python https://www.python.org/dev/peps/pep-0008 (opens new window)
- JavaScript 开发规范 (opens new window)
- shell脚本编写规范 (opens new window)
- 计算机编程/编码风格/最小化嵌套 (opens new window)
展开查看思维导图
# 命名规范
- 匈牙利命名法(Hungarian):变量类型缩写+大驼峰,如int iMyAge,Windows编程常用
- 驼峰命名法(camelCase/lowerCamelCase,小驼峰): 首字母小写,后续每个单词首字母都大写。面向对象语言(如Java、C#)变量、方法常用
- 帕斯卡命名法(CamelCase/Pascal Case,大驼峰): 首字母大写,后续每个单词首字母都大写。常被面向对象语言(如Java、C#)类常用
- 下划线命名法(under_score_case,Snake蛇形):C、Python变量、数据库命名常用
- 短横线命名法(kebab-case):Web前端语言(如CSS)变量常用,HTML 特性是不区分大小写的,无法使用驼峰命名
- https://github.com/topics/naming (opens new window)
- https://github.com/unbug/codelf (opens new window)
Java
大小写敏感的,且只能以
字母
、$
、_
开头,首字母随后的字符可以是字母
、数字
、$
、_
- 项目名:全部小写,可使用
-
或_
连接符以分割单词,且不能有空格、中文和其他特殊字符 - 包名:全部小写,单词不需分割,且不能有空格、中文和其他特殊字符
- 常量:全部大写,可使用
_
连接符以分割单词 - 变量:小驼峰式命名法,前缀应当是名词。尽量在变量名字中体现所属类型,如:length、count表示数字类型;name、title表示字符串类型
- 函数:小驼峰式命名法,前缀应当为动词。
- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
- 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。注意,即使纯拼音命名方式也要避免采用。
- 类名使用大驼峰风格,但以下情形例外:DO / BO / DTO / VO / AO / PO等。
- 方法名、参数名、成员变量、局部变量都统一使用小驼峰风格,必须遵从小驼峰形式。
- 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
- 抽象类命名使用Abstract或Base开头。
- 异常类命名使用Exception结尾。
- 测试类命名以它要测试的类名开始,以Test结尾。
- 类型与中括号紧挨相连来定义数组。
- POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。
- 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
- 杜绝完全不规范的缩写,避免望文不知义。
- 最好逐一声明每个变量而不是写在一行。
- Java的变量声明尽量靠近变量第一次使用的地方。
# Golang
- https://golang.google.cn/ref/spec (opens new window)
- https://golang.google.cn/doc/effective_go (opens new window)
可见性(访问控制)取决于其第一个字符是否为大写
- 包名称:其他字母应该为小写单词,不要使用下划线或者混合大小写
- 文件命名:尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词
- 结构体、接口、变量:使用驼峰命名法
- 常量:全部大写字母组成,并使用下划线分词
- 单元测试:文件名命名规范为
_test
结尾,测试用例的函数名称必须以Test
开头
# Python
- 文件名、包名、模块名、局部变量名、函数&方法名:全小写+下划线式驼峰
- 类:首字母大写式驼峰。内部类可以使用额外的前导下划线
- 函数和方法的参数
- 类实例方法第一个参数使用self, 类方法第一个参数使用cls
- 如果一个函数的参数名称和保留的关键字冲突,通常使用一个后缀下划线好于使用缩写或奇怪的拼写
- 全局变量
- 对于from M import *导入语句,如果想阻止导入模块内的全局变量可以使用旧有的规范,在全局变量上加一个前导的下划线。
- 全大写+下划线式驼峰,应避免使用全局变量
- 变量
- 不论是类成员变量还是全局变量,均不使用 m 或 g 前缀。
- 私有类成员使用单一下划线前缀标识,多定义公开成员,少定义私有成员。
- 变量名不应带有类型信息,因为Python是动态类型语言,在解释的时候才确定类型
- 常量
- 所有字母大写,由下划线连接各个单词
- 异常
- 因为异常也是一个类,所以遵守类的命名规则。此外,如果异常实际上指代一个错误的话,应该使用
Error
做后缀
- 因为异常也是一个类,所以遵守类的命名规则。此外,如果异常实际上指代一个错误的话,应该使用
- 缩写命名应当尽量使用全拼写的单词,缩写的情况有如下两种:
- 常用的缩写,如XML、ID等,在命名时也应只大写首字母,如XmlParser。
- 命名中含有长单词,对某个单词进行缩写。这时应使用约定成俗的缩写方式。
function 缩写为 fn text 缩写为 txt object 缩写为 obj count 缩写为 cnt number 缩写为 num
关于下划线
- 一个前导下划线:表示私有。
- 一个后缀下划线:避免关键字冲突。
- 以单下划线开头,是弱内部使用标识,from M import * 时,将不会导入该对象(python 一切皆对象)。
- 两个前导下划线:当命名一个类属性引起名称冲突时使用。
- 两个前导和后缀下划线:有特殊用途的对象或者属性,例如init或者file。绝对不要创造这样的名字,而只是使用它们。
- 以双下划线开头的变量名,主要用于类内部标识类私有,不能直接访问。
- 双下划线开头且双下划线截尾的命名方法尽量不要用,这是标识
# GNU风格版本规则
MAJOR.MINOR.PATCH
即:主版本号.次版本号.修正版本号
Major.Minor.Revision
即:主版本号.次版本号.修正版本号
Major
主版本号:表示当前APR的主版本号,它的变化通常意味着APR的巨大的变化,比如体系结构的重新设计、API的重新设计、 重大的重构、重大的feature
改动、重大的不兼容性的变化等等,而且这种变化通常会导致APR版本的向前不兼容。Minor
次版本号:发布较大的新feature
功能,或者较大的重构或者模块变化,或者出现不兼容性改动,会增加子版本号; 子版本的发布会伴随着完整的change log
,算是一个较大的版本发布,有仪式感Revision
/PATCH
修正版本号:往往是bug fix
,或者增加较小的feature
,较小的功能改进或者模块变化, 在保证完整向后兼容的前提下,会增加修正版本号当主版本号增加时,子版本号及修正版本号置
0
当子版本号增加时,修正版本号置
0
按照测试过程标识
Alpha
版:预览版或内部测试版,一般不向外部发布,会有很多Bug。Beta
版:公测版。RC
版:Release Candidate
候选版本。也叫做Gamma
版本。
# Commit提交规范
- linking-a-pull-request-to-an-issue-using-a-keyword (opens new window)
- angular.js-git-commit-guidelines (opens new window)
- AngularJS Git Commit Message Conventions (opens new window)
- 关于git提交规范 (opens new window)
- git commit 提交规范 (opens new window)
- https://github.com/commitizen (opens new window)
- bugfix/fix/fixed: 表示修复 bug
- feature: 表示增加新功能
- add: 表示增加类、文件、代码块等
- delete/del: 表示删除类、文件、代码块等
- update: 表示对代码块、功能的更新
- refactor: 表示对代码块、功能重构(即不是新增功能,也不是修改bug的代码变动)
- arch: 表示输出中间版本,用于测试等
- release to v1.0.0: 表示打包输出的版本号
- test:增加测试
- chore:构建过程或辅助工具的变动
- mod 修改
- changed ( 完成的任务 )
- rem:移除(Remove,移除功能)
- feat:新功能(feature)
- docs:文档(documentation)
- style:格式(不影响代码运行的变动)
# switch
- 在Python中没有
switch
语法 - JavaScript的
switch
语法跟Java一样 - 在Java中
如果
default
不是switch
代码块中最后一个case
,请记得用break;
结束默认case
。
switch ("A".toLowerCase()) {
case "a":
System.out.println("a");
// 注意:此处如果条件满足但没有添加break,则代码会继续执行,
// 会无条件执行后面的语句,直到遇到break
//break;
// fall thorugh
case "b":
System.out.println("b");
break;
default:
// 如果default写在最前面,会先执行,
// 但是如果没有写break;还是会无条件执行后面的语句
System.out.println("default");
break;
}
- 在Go中
- 左花括号
{
必须与switch
处于同一行; - 条件表达式不限制为常量或者整数;
- 单个
case
中,可以出现多个结果选项,以,
分割; - 与C语言等规则相反,Go语言不需要用
break
来明确退出一个case
; - 只有在
case
中明确添加fallthrough
关键字,才会继续执行紧跟的下一个case
; - 可以不设定
switch
之后的条件表达式,在此种情况下,整个switch
结构与多个if...else...
的逻辑作用等同。
switch strings.ToLower("A") {
case "a":
fmt.Println("a")
case "b":
fmt.Println("b")
default:
fmt.Println("default")
}