第 5 章 格式

  你应该保持良好的代码格式。你应该选用一套管理代码格式的简单规则,然后贯彻这些规则。如果你在团队中工作,则团队应该一致同意采用一套简单的格式规则,所有成员都要遵从。使用能帮你应用这些格式规则的自动化工具会很有帮助。

5.1 格式的目的

  代码格式很重要。代码格式不可忽略,必须严肃对待。代码格式关乎沟通,而沟通是专业开发者的头等大事。

5.2 垂直格式

  用大多数为 200 行、最长 500 行的单个文件构造出色的系统。尽管这并非不可违背的原则,也应该乐于接受。短文件通常比长文件易于理解。

5.2.1 向报纸学习

  源代码也要像报纸那样。名称应当简单且一目了然。名称本身应该足够告诉我们是否在正确的模块中。源文件最顶部应该给出高层次概念和算法。细节应该往下渐次展开,直至找到源文件中最底层的函数和细节。

5.2.2 概念间垂直方向上的区隔

  几乎所有的代码都是从上往下读,从左往右读。每行展现一个表达式或一个子句,每组代码行展示一条完整的思路。这些思路用空白行区隔开来。
  在封包声明、导入声明和每个函数之间,都有空白行隔开。这条及其简单的规则极大地影响到代码的视觉外观。每个空白行都是一条线索,标识出新的独立概念。往下读代码时,你的目光总会停留于空白行之后那一行。

5.2.3 垂直方向上的靠近

  如果说空白行隔开了概念,靠近的代码行则暗示了它们之间的紧密关系。所以,紧密相关的代码应该相互靠近。

5.2.4 垂直距离

  关系密切的概念应该相互靠近。显然,这条规则并不适用于分布在不同文件中的概念。除非有很好的理由,否则就不要把关系密切的概念放到不同的文件中。实际上,这也是避免使用 protected 变量的理由之一。
  对于那些关系密切、放置于同一源文件中的概念,他们之间的区隔应该成为对相互的易懂度有多重要的衡量标准。应避免迫使读者在源文件和类中跳来跳去。
  变量声明。变量声明应尽可能靠近其使用位置。因为函数很短,本地变量应该在函数的顶部出现。
  循环中的控制变量应该总是在循环语句中声明。
  偶尔,在较长的函数中,变量也可能在某个代码块顶部,或在循环之前声明。
  实体变量应该在类的顶部声明。这应该不会增加变量的垂直距离,因为在设计良好的类中,它们如果不是被该类的所有方法也是大多数方法所用。
  相关函数。若某个函数调用了另外一个,就应该把它们放在一起,而且调用者应该尽可能放在被调用者上面。这样,程序就有个自然的顺序。若坚定地遵循这条约定,读者将能够确信函数声明总会在其调用后很快出现。
  概念相关。概念相关的代码应该放在一起。相关性越强,彼此之间的距离就该越短。
  相关性应建立在直接依赖的基础上,如函数间调用,或函数使用某个变量。但也有其他相关性的可能。相关性可能来自于执行相似操作的一组函数(相同的函数名称,执行同一基础任务的函数)。

5.2.5 垂直顺序

  一般而言,我们想自上向下展示函数调用依赖的顺序。也就是说,被调用的函数应该放在执行调用的函数下面。这样就建立了一种自顶向下贯穿源代码模块的良好信息流。

5.3 横向格式

  应该尽力保持代码行短小。死守 80 个字符的上限有点僵化,而且也不反对代码行长度达到 100 个字符或 120 个字符。再多的话,大抵就是肆意妄为了。

5.3.1 水平方向上的区隔与靠近

  我们使用空格字符将彼此紧密相关的事物连接到一起,也用空格字符把相关性较弱的事物分隔开。
  在赋值操作符周围加上空格字符,以此达到强调目的。赋值语句有两个确定而重要的要素:左边和右边。空格字符加强了分隔效果。
  另一方面,我不在函数名和左圆括号之间加空格。这是因为函数与其参数密切相关,如果隔开,就会显得互无关系。我把函数调用括号中的参数一一隔开,强调逗号,表示参数是互相分离的。
  空格字符的另一种用法是强调其前面的运算符。
  乘法因子之前没加空格,因为它们具有较高优先级。加减法运算项之间用空格隔开,因为加法和减法优先级较低。

5.3.2 水平对齐

  对齐并没有什么用,如果有较长的列表需要做对齐处理,那么问题就是在列表的长度上而不是对齐上。

5.3.3 缩进

  源文件是一种继承结构,而不是一种大纲结构。其中的信息涉及整个文件、文件中每个类、类中的方法、方法中的代码块,也涉及代码块中的代码块。这种继承结构中的每一层级都圈出一个范围,名称可以在其中声明,而声明和执行语句也可以在其中解释。
  要让这种范围式继承结构可见,我们依源代码行在继承结构中的位置对源代码行做缩进处理。在文件顶层的语句,例如大多数的类声明,根本不缩进。类中的方法相对该类缩进一个层级。方法的实现相对方法声明缩进一个层级。代码块的实现相对于其容器代码块缩进一个层级,以此类推。

5.3.4 空范围

  有时,while 或 for 语句的语句体为空,尽量不要使用。如果无法避免,就确保空范围体的缩进,用括号包围起来。

5.4 团队规则

  记住,好的软件系统是由一系列读起来不错的代码文件组成的。它们需要拥有一致和顺畅的风格。读者要能确信,他们在一个源文件中看到的格式风格在其他文件中也是同样的用法。绝对不要用各种不同的风格来编写源代码,这样会增加其复杂度。

5.5 鲍勃大叔的格式规则

  编码标准文档的范例。

转载于:https://www.cnblogs.com/zhangmiao14/p/10325600.html

代码整洁之道-第5章-格式-读书笔记相关推荐

  1. 代码整洁之道(Clean Code)- 读书笔记

    Sorry, 许久未更新文章了,主要因为刚刚换了一家新公司,忙于组建团队(建设.招聘.流程.框架等)与熟悉公司业务,还有领导给的其他工作等等,实在是没有时间更新了.最近在和团队分享Bob大叔的< ...

  2. 《代码整洁之道》第一章 整洁代码 ---为什么需要整洁代码?

    第一章 整洁代码 概述 什么是整洁代码? 开始走向整洁代码 概述 欢迎阅读本栏目的读者,如果你想成为更加优秀的coder,请跟随笔者的观点去解析<代码整洁之道>这本书,相信你会收获颇丰. ...

  3. Clean Code 《代码整洁之道》前四章读书笔记

    第一章: 整洁的代码只做好一件事 减少重复代码 提高表达力 提早构建简单抽象 让营地比你来时更干净 第二章:有意义的命名 名副其实:如果名称需要注释来补充,就不算是名副其实. 一定要注意命名,一旦发现 ...

  4. 读《代码整洁之道》前四章浅显印象 和 我所见的不整洁代码引以为戒

    1.根本----良好端正的态度. 2.命名----有意义,规范,可搜索的名称,使用源自问题领域的名称,至少避免误导. 3.类名----名词或者名词短语. 4.方法----应当是动词或者动词短语. 5. ...

  5. 《代码整洁之道 Clean Architecture》-读书笔记

    大家好,我是烤鸭: 关于<代码整洁之道>,记录一下读书笔记. 代码整洁之道 第一章 整洁代码 整洁代码的艺术 第二章 有意义的命名 避免误导 有意义的区分 使用读得出来和可搜索的名字 避免 ...

  6. 【苦练基本功】代码整洁之道 pt4(第10章-第12章)

    代码整洁之道 pt4(第10章-第12章) 10 类 10.1 类的组织 10.2 类应该短小 10.2.1 单一权责原则 10.2.2 内聚 10.2.3 保持内聚性就会得到许多短小的类 10.3 ...

  7. 【苦练基本功】代码整洁之道 pt2(第4章-第6章)

    代码整洁之道 pt2(第4章-第6章) 4 注释 4.1 注释不能美化糟糕的代码 4.2 用代码来阐述 4.3 好注释 4.3.1 法律信息 4.3.2 提供信息的注释 4.3.3 对意图的解释 4. ...

  8. 《代码整洁之道》—第1章1.1节要有代码

    本节书摘来自异步社区<代码整洁之道>一书中的第1章1.1节要有代码,作者[美]Robert C. Martin,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第 ...

  9. 【苦练基本功】代码整洁之道 pt1(第1章-第3章)

    代码整洁之道 pt1(第1章-第3章) 1 整洁代码 1.1 要有代码 1.2 糟糕的代码 1.3 混乱的代价 1.3.1 什么是整洁代码? 2 有意义的命名 2.1 名副其实 2.2 避免误导 2. ...

  10. 【苦练基本功】代码整洁之道 pt3(第7章-第9章)

    代码整洁之道 pt3(第7章-第9章) 7 错误处理 7.1 使用异常而非返回码 7.2 先写try-catch-finally 7.3 使用未检异常 7.4 给出异常发生的环境说明 7.5 依调用者 ...

最新文章

  1. node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...
  2. MySQL之备份恢复
  3. OpenCV形态学变换函数morphologyEx()开运算的使用
  4. .NET开源项目小功能组件
  5. spring boot配置dubbo注意事项
  6. 在nlog(n)时间里对单链表排序
  7. C++中函数重载、缺省参数及命名空间
  8. java连接数据库的基本操作
  9. E: Sub-process /usr/bin/dpkg returned an error code (1)
  10. LeetCode 链表相关题目总结
  11. (ICIP2019)图像语义分割(23) LEDNet-用于实时语义分割的轻量级编解码网络
  12. react-cnode实践笔记
  13. charset参数 sqluldr2_SQLULDR2
  14. 蓝牙安全与攻击案例分析
  15. ps图片去水印-图片一键去水印的app
  16. 怎样把pdf转换成jpg文件
  17. IPCAM视频数据解码并处理
  18. LATEX之对文章排版的相关设置
  19. android gpu 视频编码,Android Mp4视频录制(OpenGL实现篇,附DEMO)
  20. react中的this.state与this.setState的区别

热门文章

  1. Crowd HDU - 4456 曼哈顿距离转切比雪夫距离的坐标变换与二维坐标离散化
  2. 【Go命令教程】11. go vet 与 go tool vet
  3. mysql索引之六:mysql高效索引之覆盖索引
  4. mysql中XtraBackup备份工作机制
  5. ASP.NET Trick文章系列--使用State Server管理Session状态的另类经济用法
  6. 如何避免后台IO高负载造成的长时间JVM GC停顿(转)
  7. 在Linux环境下安装MYSQL
  8. BZOJ 1443 游戏(二分图博弈)
  9. mysql 中的bool值
  10. listview去掉底部多出的边框黑色