代码大全这本书只看懂了一部分,现只对最有收获的部分写入笔记里
第七章 创建子程序的正当理由
(1)降低复杂度;(2)避免代码充分;(3)支持子类化;(4)隐藏顺序;(5)隐藏指针操作;(6)提高可移植性;(7)简化复杂的布尔判断;(8)改善性能
对于过于简单的代码写成子程序的两大理由:1 可以增加程序的可读性 2简单程序可能变成复杂程序
1 在子程序层上设计
内聚性强调把一件事做好,不再做其它任何事情这样做的好处是得到更高的可靠性
顺序上的内聚性是指在子程序内包含有需要按特定顺序执行的操作,这些步骤需要共享数据,而且只有在全部执行完毕后才完成了一项完整的功能
通信上的内聚性是指一个子程序的不同操作使用了同样的数据,但不存在其他任何联系。
临时的内聚性是指含有一些需要同时执行才放到一起的操作的子程序。
过程上的内聚性是指一个子程序中的操作是按特定的顺序进行的。
逻辑上的内聚性是指若干操作被放入同一个子程序中,通过传入的控制标志选择执行其中的一项操作。
巧合的内聚性是指子程序中的各个操作之间没有任何可以看到的关联
2 好的子程序名字
(1) 描述子程序所做的所有事情
(2) 避免使用无意义的,模糊或表述不清的动词
(3) 不要仅通过数字来形成不同的子程序名字
(4) 根据需要确定子程序名字的长度
(5) 给函数命名时要对返回值有所描述
(6) 给过程起名时使用语气强烈的动词加宾语的形式
(7) 准确的使用对仗词
(8) 为常用操作确立命名规则
3 如何使用子程序参数
1 按照输入-修改-输出的顺序排列参数
2 在接口中对参数的假定加以说明
3 把子程序的参数限制在大约七个以内
4 考虑对参数采用某种表示输入,修改输出的命名规则添加i_等前缀
5 为子程序传递用以维持其接口抽象的变量或对象
6 确保实际参数与形式参数相匹配
4 函数和过程
函数是指有返回值的子程序,过程是指没有返回值的子程序
设置函数的返回值:1 检查所有可能的返回路径;2 不要返回指向局部数据的引用或指针
5 宏子程序
用预处理器的宏语言编写子程序还需要一些特别的考虑
eg #define Cube(a) ((a)*(a)*(a))
把含有多条语句的宏用大括号括起来;
* 除非必要,否则还是应该避免使用这种技术
6 用给子程序命名的方法来给展开后代码形同子程序的宏命名,以便在需要时可以用子程序来代替宏
Const可以用于定义常量
Inline可以用于定义可被编译为内嵌的代码的函数
Template可以用于以类型安全的方式定义各种标准操作,如min,max等
Enum可以用于定义枚举类型
Typedef可以用于定义简单的类型替换
7 內联子程序
Inline子程序要求在调用子程序的每个地方都生成该子程序的全部代码,这样无论inline子程序是长是短都会增加整体代码的长度