第三十一章 布局与风格

基本原则

格式化的基本原理

格式化的借本原理指出,好的布局凸显程序的逻辑结构。

任何计算机对程序的解读

布局是关于程序结构的有用暗示。

好布局有什么用

> 以某种风格来写程序并不仅仅是处于美观考虑。用习惯的方式写程序有着心理因素——程序员有着强烈的意识,觉得其他程序员都会遵循这些论述规矩。

把布局当作一种信仰

布局不仅涉及美学,同时也有了逻辑问题的味道,意即对编程格式的争论听起来更像是宗教斗争,而非在讨论哲学。

良好布局的目标

  • 准确表现代码的逻辑结构;
  • 始终如一地表现代码的逻辑结构;
  • 改善可读性;
  • 经得起修改。

布局技术

  • 空白;
    • 空白能够增强可读性。空白包括空格、制表符、换行、空行,是展现程序结构的主要手段;
    • 分组;
    • 空行;
    • 缩进;
  • 括号。

布局风格

  • 纯块结构;
  • 模仿纯块结构;
  • 使用begin-end对(花括号)指定块边界;
  • 行尾布局。

控制结构的布局

格式化控制结构块的要点

  • 不要使用未缩进的begin-end对;
  • 别让begin-end两次缩进。

其他考虑

  • 段落之间要使用空行;
  • 单语句代码块的格式要前后统一;
  • 对于复杂的表达式,将条件分隔放在几行上;
  • 不用goto
  • case语句不要有行尾布局的例外。

单条语句的布局

语句长度

一条常见但有点过时的规则,就是语句长度应限制在80个字符以内,理由如下:

  • 超过80个字符的语句很难读;
  • 80个字符的限制不鼓励深度嵌套;
  • 长于80字符的语句行在8.5×11英寸规格纸张上放不下,特别是当一面打印两栏代码时。

用空格使语句显得清除

  • 使用空格会让逻辑表达式更易读;
  • 使用空格让数组引用更容易读;
  • 使用空格让子程序参数更容易读;

格式化后续行

  • 使续行明显;
  • 将控制语句的后续行缩进以标准的空格数;
  • 不要将赋值语句按等号对齐;
  • 对赋值语句后续行按标准量缩进。

每行仅写一条语句

  • 将每个语句单独置于一行,能提供有关程序复杂性的准确观点。
  • 对于现代编译器,将多个语句放在一行不能提供任何优化线索。
  • 各语句独占一行,则代码仅需自上而下读,而不必自上而下,还要从左往右去读;
  • 各语句独占一行,在编译器以行号指出某行有错误时,你将更容易找出语法错误;
  • 各语句独占一行,编辑单个语句也更容易——删除一行或者临时将某行改为注释。

数据声明的布局

  • 每行只声明一个数据;
  • 变量声明应尽量接近其首次使用的位置;
  • 合理组织声明顺序;
  • C++中,声明指针变量时请把星号靠近变量名,或者是去声明指针类型。

注释的布局

  • 注释的缩进要与相应代码一致;
  • 每行注释至少一个空行分开。

子程序的布局

  • 用各行分隔子程序的各部分;
  • 将子程序参数按标准缩进。

类的布局

类接口的布局

在布局类接口时,一般应将类成员按如下顺序表示:

  1. 说明类及其完整用法的头部注释;
  2. 构造函数与析构函数;
  3. public子程序;
  4. protected子程序;
  5. private子程序和数据成员。

类实现的布局

类实现通常应按以下顺序排布:

  1. 描述类所在的文件之内容的头部注释;
  2. 类数据;
  3. public子程序;
  4. protected子程序;
  5. private子程序。

文件和程序布局

  • 一个文件应只有一个类;
  • 文件的命名应与类名有关;
  • 在文件中清晰地分隔各子程序;
  • 按字母顺序排列子程序;
  • 对于C++,请仔细组织源文件中内容的次序:
    1. 文件的描述性注释;
    2. #include文件行;
    3. 在多个类里使用的常量定义;
    4. 在多个类里使用的枚举;
    5. 宏函数定义;
    6. 在多个类里使用的类型定义;
    7. 导入的全局变量和函数;
    8. 导出的全局变量和函数;
    9. 本文件私用的变量和函数;
    10. 各个类,包括各个类中的常量定义,枚举以及类型定义。

核对表:布局

一般问题

  • [ ] 格式化主要是为了展现代码的逻辑结构吗?
  • [ ] 你的布局方案能统一地运用吗?
  • [ ] 你的布局方案能让代码易于维护吗?
  • [ ] 你的布局方案是否有利于代码的可读性?

控制结构的布局

  • [ ] 你的代码中避免begin-end对或{}的双重缩进了吗?
  • [ ] 相邻的块之间用空行分隔了吗?
  • [ ] 对复杂表达式格式化使考虑到可读性吗?
  • [ ] 对只有一条语句的块的布局始终如一吗?
  • [ ] case语句与其他控制结构的格式化保持一致了吗?
  • [ ] 对goto语句的格式化是否让其显眼了呢?

单条语句的布局

  • [ ] 为逻辑表达式、数组下标和子程序参数的可读性而使用空格了吗?
  • [ ] 不完整的语句在行末是以明显有错的方式结束了吗?
  • [ ] 后续行按照标准数目缩进了吗?
  • [ ] 每行顶多只有一条语句吗?
  • [ ] 所写的每个语句都没有副作用吗?
  • [ ] 每行顶多只声明一个数据吗?

注释的布局

  • [ ] 注释与其所注释的代码的缩进量相同吗?
  • [ ] 注释的风格便于维护吗?

子程序的布局

  • [ ] 你对每个子程序参数的格式化方式便于看懂、修改、注释吗?
  • [ ] 采用空行分隔子程序的各个部分了吗?

类、文件和程序的布局

  • [ ] 多数类和文件之间是一一对应的关系吗?
  • [ ] 如果文件内有多个类,各类中的子程序按类分组了吗?各类都清楚标识了吗?
  • [ ] 文件中的子程序用空行清楚地分开了吗?
  • [ ] 在没有更好的组织形式的场合,所有子程序都按字母顺序排列了吗?

要点

  • 可视化布局的首要任务是指明代码的逻辑组织。评估该任务是否实现的指标包括准确性、一致性、易读性和易维护性;
  • 外表悦目比起其他指标是最不重要的。然而,如果其他指标都达到了,带代码又质量好,那么布局效果看上去也会不错;
  • Visual Basic具有纯代码块风格,而Java的传统做法就是使用纯块风格,所以若用这些语言编程,就请使用纯代码块风格。C++中,模拟纯代码块或者begin-end块边界都行之有效;
  • 结构化代码尤其自身目的。始终如一地沿用某个习惯而少来创新。不能持久的布局规范只会损害可读性;
  • 布局的很多方面设计信仰问题。应试着将客观需要和主观偏好区分开来。定出明确的目标,在地基础上在讨论风格参数的选择。

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。