《代码整洁之道》阅读笔记 5格式

281 阅读5分钟

用什么样的代码风格不是关键,关键是整个项目组的成员应当使用相同的代码风格,让多个人编写的代码看起来像一个人书写的。 在这里插入图片描述

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】、【操作系统】、【计算机网络】、【设计模式】、【数据结构与算法】、【大厂面经】、【数据库】期待你加入!!!

1.计算机网络----三次握手四次挥手

2.梦想成真-----项目自我介绍

3.你们要的设计模式来了

4.震惊!来看《这份程序员面试手册》!!!

5.一字一句教你面试“个人简介”

6.接近30场面试分享