1、基本原则

  • 格式化的基本原理

    使代码看起来有条理的最大意义莫过于展示出代码的结构。请选择能够更好的给出代码结构而不是使代码更悦目的方法。

  • 人和计算机对程序的解读

    布局是关于程序结构的有用暗示。计算机可能只关心花括号或者begin/end,而人在看程序时总倾向于从代码的视觉外观获取提示。

  • 好布局有什么用

    如果程序语句按照有意义的方式布局,高手能比新手更好的记住语句。而当程序乱七八糟时,高手的优势就不明显了。

    结构能帮助高手去感知、理解和记住程序的重要特性。编程高手通常会恪守自己的风格,即使和其他高手的风格迥然不同。底线是前后如一的组织程序。

  • 把布局作为一种信仰

    强调对程序理解的重要性,并把程序结构化成熟知的形式,引发了编程风格不同时是否会影响他人对程序的理解能力的思考。这意味着对编程格式的针轮请起来更像是宗教斗争,而非在讨论哲学。

  • 良好布局的目标

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

2、布局技术

  • 空白

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

    • 分组

      从另一个角度看,空白也是分组。也是确保相关语句成组放在一起。

    • 空行

      将不相关语句分隔开也很有必要。代码中的一个段落的前面应该加入空行。

    • 缩进

      用缩进形式显示程序的逻辑结构。作为一项守则,那些逻辑上隶属于某语句的语句都应缩进。

  • 括号

    括号应该用得比你觉得需要的更多。对包含两个以上的项的表达式,应该用括号去澄清之。括号使得语义更加清晰且不会损失什么。

3、布局风格

常见布局风格:

  • 纯块结构

    有些语言并不要求块结构,并因此会产生很多缩进问题。请为程序添加构成代码块的元素(begin/end或花括号),弥补语言结构上的不良设计。

  • 模仿纯块结构

    如果语言不支持纯块结构,可以讲关键字begin/end 或{/}看出是所在控制结构的扩展。

  • 使用begin-end对(花括号)指定块边界
  • 行尾布局

    行尾布局是一大组代码缩进至行中间或结尾的布局策略,用来将代码块作为该块开始的关键子对其,是子程序的其余参数与第一个参数对其或在case语句中将各种情况对齐等。

  • 哪种风格最优

    所有风格都不绝对可靠,都偶尔需要进行合理而明显的折中。

4、控制结构的布局

结构化控制结构的要点:

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

其他考虑:

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

5、单条语句的布局

  • 语句长度

    • 超过80个字符的语句很难读
    • 80个字符的限制不鼓励深度嵌套
    • 长于80字符的语句在打印纸上放不下
    • 大显示器、横向打印、窄字体等可以避免武断的拆分代码适应80个字符的限制
  • 用空格使语句显得清楚

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

    • 是续行明显
    • 把紧密关联的元素放在一起
    • 将子程序调用的后续行按标准量缩进
    • 让后续行的结尾易于发现
    • 将控制语句的后续行缩进以标准的空格数
    • 不要将赋值语句按等号对齐
    • 对赋值语句后续行按标准量缩进
  • 每行仅写一条语句

    • 能够提供有关程序复杂性的准确观点
    • 多条语句放在一行对于现代编译器没有任何优化线索
    • 代码仅需自上而上读,而不必自上而下,还要从左往右去读
    • 编译器以行号指出错误时,更容易找出语法错误
    • 基于行的调试器中容易单步执行代码
    • 编辑单个语句更容易:删除一行或者临时注释某行
    • c++中不要让一行里有多高操作(副作用)
  • 数据声明的布局

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

6、注释的布局

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

7、子程序的布局

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

8、类的布局

  • 类接口的布局

    • 说明类及其完整用法的头部注释
    • 构造函数与析构函数
    • public 子程序
    • protected 子程序
    • private 子程序和数据成员
  • 类实现的布局

    • 描述类所在文件只内容的头部注释
    • 类数据
    • public 子程序
    • protected 子程序
    • private 子程序和数据成员
    • 如果文件包含多个类,要清楚的标出每一个类
  • 文件和程序布局

    • 一个文件应该只有一个类
    • 文件的命名应与类名有关
    • 在文件中清晰点的分隔各个子程序
    • 按字母顺序排列子程序

更多有关《代码大全 2》的读书笔记,请关注 :
http://tabalt.net/blog/code-complete-2-reading-notes/

本文链接:http://tabalt.net/blog/cc2-layout-and-style/,转载请注明。