用什么样的代码风格不是关键,关键是整个项目组的成员应当使用相同的代码风格,让多个人编写的代码看起来像一个人书写的。
1.格式的目的
-
1.代码格式关乎沟通,而沟通是专业开发者的头等大事。
-
2.因为代码的可读性会对以后可能发生的修改行为产生深远的影响。
2.垂直格式
图中涉及7个不同项目: Junit、 FitNesse、 testNG、 Time and Money、 JDepend、Ant 和 Tomcat贯穿方块的直线两端显示这些项目中最小和最大的文件长度。方块表示在平均值以上或以下的大约三分之一文件(一个标准偏差)的长度。方块中间位置就是平均数。
-
所以FitNesse项目的文件平均尺寸是65行,而上面三分之一在40~100行及100行以上之间。
-
FitNesse中最大的文件大约400行,最小是6行。这是个对数标尺,所以较小的垂直位置差异意味着文件绝对尺寸的较大差异。
-
Junit、 FitNesse和 Time and Money由相对较小的文件组成。没有一个超过500行,多数都小于200行。
-
Tomcat和Ant则有些文件达到数千行,将近一半文件长于200行。对我们来说,这意味着什么?意味着有可能用大多数为200行、最长500行的单个文件 构造出色的系统(总长约50000)。尽管这并非不可违背的原则,也应该乐于接受。
短文件通常比长文件易于理解。
5.1 向报纸学习
名称应当简单且一目了然,最顶部应该给出高层次概念和算法, 细节应该往下渐次展开。
2.2 概念间垂直方向上的区隔
几乎所有的代码都是从上往下读,从左往右读。每行展现一个表达式或一个子句,每代码行展示一条完整的思路。这些思路用空白行区隔开来。
package fitnesse.wikitext.widgets;
import java.util.regex.*;
public class BoldWidget extends ParentWidget{
public static final String REGEXP = “’’’.+?’’’”;
private static final Pattern pattern = Pattern.compile(“’’’’(.+?)’’’”,
Pattern.MULTILINE + Pattern.DOTALL);
Public BoldWidget(…) throws Exception {
…
}
}
2.3垂直方向上的靠近
如下5-3切断两个实体变量之间的联系,5-4则规范。
2.4 垂直距离
-
概念相关的代码应该放到一起,相关性越强,彼此之间的距离就应该越短。
-
本地变量声明应该在函数的顶部出现。
-
循环中的控制变量应该总是在循环语句中声明。
-
实体变量应该在类的顶部声明。
-
若某个函数调用另一个,就应该把他们放置到一块,并且调用者尽可能放置于被调用者之上。
-
除非有很好的理由,否则就不要把关系密切的概念放到不同的文件中,实际上,这也是避免使用protected变量的理由之一,应避免迫使读者在源文件和类中跳来跳去。
3.横向格式
一行代码应该有多宽?要回答这个问题,来看看典型的程序中代码行的宽度。我们再一次检验7个不同项目。
图中展示了这7个项目的代码行宽度分布情况。其中展现的规律性令人印象深刻,45个字符左右的宽度分布尤为如此。
其实,20~60的每个尺寸,都代表全部代码行数的 1%,也就是总共40%!或许其余30%的代码行短于10个字符。
记住,这是个对数标尺,所以图中长于80个字符部分的线性下降在实际情况中会极其可观。程序员们显然更喜爱短代码行。
这说明,应该尽力保持代码行短小。死守80个字符的上限有点僵化,而且我也并不反对 代码行长度达到100个字符或120个字符。再多的话,大抵就是肆意妄为了。
正确的代码
return createOrderParamVO != null
&& createOrderParamVO.getUserId() != null
&& createOrderParamVO.getPatientId() != null
&& createOrderParamVO.getSpaceId() != null;
3.1.用空格分隔联系紧密的符号
例如:++,+=,==,&&,||,有一些编程专用字体会有连字符让这些变的更醒目(JetBrains Mono,Fira Code)
3.2.水平方向上的区隔与靠近
==赋值操作符两边加上空格字符,以强调左右两边重要的要素==
int lineSize = line.lenght();
totalChars += lineSize;
函数名和左圆括号之间不要加空格,因为函数与其参数密切相关。
recordWidestLine(lineSize);
函数中的参数用空格隔开,表示参数是互相分离的。
lineWidthHistogram.addLine(lineSize, lineCount);
3.3.水平对齐
不必过分对齐。
private Socket socket;
private InputStream input;
private OutputStream output;
protected long requestParsingTimeLImit;
3.4.缩进
- 类中的方法相对类缩进
- 方法的实现相对方法声明缩进
- 代码块的实现相对于其容器代码块缩进一个层级,以此类推。
3.5.空范围
有时,while或for语句的语句体为空。尽量不使用。如果无非避免,确保空范围体的缩进,用括号包起来。
否则经常被骗。除非你把分号放到另一行再加以缩进,否则很难看到它。
while (dis.read(buf,0,readBufferSize) != -1)
;
4.团队规则
在团队中,规则由团队说了算。好的软件系统是由一系列读起来不错的代码文件组成的,它们需要一致和顺畅的风格。不同的风格,会增加代码阅读和维护的复杂度。
5.参考文献
《代码整洁之道》 developer.aliyun.com/article/254… www.jianshu.com/p/c44eca6ad…
关注公众号“程序员面试之道”
回复“面试”获取面试一整套大礼包!!!
本公众号分享自己从程序员小白到经历春招秋招斩获10几个offer的面试笔试经验,其中包括【Java】、【操作系统】、【计算机网络】、【设计模式】、【数据结构与算法】、【大厂面经】、【数据库】期待你加入!!!