在程序员的世界里有两件最讨厌的事情,第一件事情是讨厌写代码注释,第二件事情是讨厌看别人的代码不写注释。虽然这只是个段子,但也反映了当下很多程序员的心声。下面简单介绍下代码规范的重要性,第一,规范的代码可以促进团队合作,第二,规范的代码可以减少bug处理,第三,规范的代码可以降低维护成本,第四,规范的代码有助于代码审查,第五,养成代码规范的习惯,有助于程序员自身的成长。
本系列文章将整合 阿里巴巴《Java开发手册》 和 谷歌《Java编程规范》 ,总结Java开发过程的编码规范,并通过具体编码案例给出编码规范的原因,如果总结内容存在问题还望指出。
目录
上一篇 《Java开发规范之代码格式篇(上)》 介绍了括号换行和空格等注意事项,本文将继续介绍字符限制和方法格式等内容。IDEA中可以配置格式化模板,使用快捷键ctrl+alt+L即可一键格式化代码,具体路径请参考 File - Settings - Editor - Code Style - Java - Scheme,点击齿轮图标导入配置文件即可,点击下载idea的Java格式化模板 。
6.单行字符数限制和自动行号准则
Alibaba规约(强制)
单行字符数限制不超过120个,超出需要换行,换行时遵循如下原则:
- 第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进,参考示例。
- 运算符与下文一起换行。
- 方法调用的点符号与下文一起换行。
- 方法调用中的多个参数需要换行时,在逗号后进行。
- 在括号前不要换行。
Google规约
一个项目可以选择一行80个字符或100个字符的列限制,除了下述例外,任何一行如果超过这个字符数限制,必须自动换行。
- 不可能满足列限制的行(例如,Javadoc中的一个长URL,或是一个长的JSNI方法参考)。
- package 和 import 语句。
- 注释中那些可能被剪切并粘贴到shell中的命令行。
换行的基本准则是:更倾向于在更高的语法级别处断开。
- 如果在 非赋值运算符 处断开,那么在该符号前断开(比如+,它将位于下一行)。注意:这一点与Google其它语言的编程风格不同(如C++和JavaScript)。 这条规则也适用于以下“类运算符”符号:点分隔符(.),类型界限中的&( <T extends Foo & Bar> ),catch块中的管道符号( catch (FooException | BarException e )。
- 如果在 赋值运算符 处断开,通常的做法是在该符号后断开(比如=,它与前面的内容留在同一行)。这条规则也适用于 foreach 语句中的分号。
- 方法名或构造函数名与左括号留在同一行。
- 逗号(,)与其前面的内容留在同一行。
说明:一行代码的长度很大程度决定了代码的可读性,如果长连接代码又没有注释简直就是噩梦,长代码需要根据语法进行自动换行。
区别:两个大厂的行代码长度有很大不同,Google规约条例更加清晰,明确规定了例外,同时指出自动换行的具体使用场景,但自动换行的标准基本一致。
正例:
StringBuilder sb = new StringBuilder();
// 超过120个字符的情况下,换行缩进4个空格,点号和方法名称一起换行
sb.append("Jack").append("Ma")...省略部分代码
.append("123456")...省略部分代码
.append("123456")...省略部分代码
.append("123456");
// 运算符和下文一起换行
int result = function1(flag) + function2(flag) + ...省略部分代码
+ function10(flag);
反例:
StringBuilder sb = new StringBuilder();
// 超过120个字符的情况下,不要在括号前换行
sb.append("Jack").append("Ma")...省略部分代码...append
("alibaba");
// 参数很多的方法调用可能超过120个字符,不要在逗号前换行
method(args1, args2, args3, ...省略部分代码
, argsX);
7.方法参数与逗号空格
Alibaba规约(强制)
方法参数在定义和传入时,多个参数逗号后边必须加空格。
Google规约
在 , : ; 及右括号( ) )后需要使用空格。
说明:方法中参数相隔太紧密看着非常臃肿,一旦参数过于复杂无法区分各参数。
正例:
void method(int args1, String args2, Long args3, Double args4){
// 省略部分代码
}
反例:
// 参数之间没有空格,参数和方法混杂一起无法区分
int result = method(method(args1),method(args2,args3),args4);
8.编码格式
Alibaba规约(强制)
IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用Windows格式。
Google规约
源文件编码格式为UTF-8。
说明:如果文件格式无法统一,协同工作效率将大大降低。
区别:Alibaba规约特别指出换行符使用Unix格式
正例:
9.单个方法代码行数
Alibaba规约(推荐)
单个方法的总行数不超过80行。
Google规约
未定义类似规范
说明:方法内的代码行数过多很容易引用代码可读性,可以将部分代码重写整合为另外一个方法再调用。
10.不推荐使用空格使得代码对齐
Alibaba规约(推荐)
- 没有必要增加若干空格来使变量的赋值等号与上一行对应位置的等号对齐。
- 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。任何情形,没有必要插入多个空行进行隔开。
Google规约
对于通过增加可变数量的空格来使某一行的字符与上一行的相应字符对齐的方式不做要求,这是允许的(而且在不少地方可以看到这样的代码),但Google编程风格对此不做要求。即使对于已经使用水平对齐的代码,我们也不需要去保持这种风格。
说明:对齐可增加代码可读性,但它为日后的维护带来问题。考虑未来某个时候,我们需要修改一堆对齐的代码中的一行。 这可能导致原本很漂亮的对齐代码变得错位。很可能它会提示你调整周围代码的空白来使这一堆代码重新水平对齐(比如程序员想保持这种水平对齐的风格), 这就会让你做许多的无用功,增加了reviewer的工作并且可能导致更多的合并冲突。
示例:
//注释未对齐,变量定义未对齐
private int flag; // this is fine
private Color color; // this too
int one = 1;
long two = 2L;
float three = 3F;
StringBuilder sb = new StringBuilder();
//注释对齐,增加额外工作量
private int x; // permitted, but future edits
private Color color; // may leave it unaligned