标签:
第七章 高质量的子程序
7.1 创建子程序的正当理由
1.降低复杂度
2.引入中间、易懂的抽象:把一段代码放入一个命名恰当的子程序内,是说明这段代码用意最好的方法之一
3.避免代码重复
4.支持子类化
5.隐藏顺序
6.隐藏指针操作
7.提高可移植性
8.简化复杂的布尔判断
9.改善性能
10.确保所有子程序都很小
有些操作似乎过于简单而没有必要写成子程序,但有时考虑到后期扩展和可读性,应该写成子程序
7.2 在子程序上设计
对子程序而言,内聚性是指子程序中各种操作之间联系的紧密程度,我们的目标是让每个子程序只把一件事做好,不再做任何事。
功能的内聚性是最强也是最好的一种内聚性,也就是说让一个子程序仅执行一项操作。当然以这种方式评估内聚性,前提是子程序所执行的操作
与其名字相符。
编写具有功能上的内聚性的子程序几乎总是可能的,因此把注意力集中于功能上的内聚性,从而得到最大的收获。
7.3 好的子程序名字
1. 描述子程序所做的所有事情
2. 避免使用无意义的、模糊或表述不清的动词
3. 不要仅通过数字来形成不同的子程序名字
4.根据需要确定子程序名字的长度:研究表明,变量名的最佳长度为9-15,子程序通常比变量更复杂,也更长些
5.给函数命名时要对返回值有所描述
6.给过程起名时使用语气强烈的动词加宾语的形式
7.准确使用对仗词
8.为常用操作确立命名规则
7.4 子程序可以多长
理论上认为的子程序最佳长度通常是一屏代码或打印出来一到两页的代码,也就是约50-150行代码。如果超过200行,就要小心了。
7.5 如何使用子程序参数
程序中有39%的错误都是属于内部接口错误,也就是子程序间互相通信时所发生的错误。
1.按照输入--修改--输出的顺序排列参数
先列出作为输入用途的参数,然后是既作为输入又作为输出用途的参数,最后才是仅作为输出用途的参数
2.考虑自己创建in和out关键词
3.如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致
4.使用所有的参数
5.把状态或出错变量放在最后
6.不要把子程序的参数用作工作变量:这很危险,应该明确引入一些工作变量,从而避免当前或日后的麻烦。
7.在接口中对参数的假定加以说明
在子程序内部和调用子程序的地方同时对所做的假定进行说明,不要等到把子程序写完再回过头去写注释。
你是记不住所有这些假定,一种比用注释还好的方法,在代码中使用断言(assertions)。
8.把子程序的参数个数限制在大约7个以内
9.考虑对参数采用某种表示输入、修改、输出的命名规则
10.为子程序传递用以维持其接口抽象的变量或对象
11.使用具名参数
12.确保实参和形参匹配
请养成好的习惯,总要检查参数表中的参数的类型,同时留意编译器给出的关于参数类型不匹配的警告。
7.6使用函数时要特别考虑的问题
函数:指有返回值的子程序;过程:没有返回值的子程序。
函数和过程更多的是语义的区别,而不是语法的区别。以语义为准。
一种常用的编程实践是让函数像过程一样执行并返回状态值,代替它的一种方法是写一个用状态变量作为显式参数的过程
简而言之,如果一个子程序的主要用途就死返回由其名字所指明的返回值,那么就该使用函数,否则使用过程。
设置函数的返回值:
1.检查所有可能的返回路径:
在函数开头用一个默认值来初始化返回值是个很好的做法,这种方法能够在未正确设置返回值时提供一张保险网
2.不要返回指向局部数据的引用或指针
7.7 宏子程序和内联子程序
1.要把宏整个包含在括号内
2.把含有多条语句的宏用大括号括起来
通常认为,用宏代替函数调用的做法具有风险,而且不易理解,这是一种很糟糕的编程实践。因此,除非必要,否则还是应该避免使用此种技术。
用给子程序命名的方法来给展开后代码形同子程序的宏命名,以便在需要时可以用子程序来替换宏。
宏对于支持条件编译--非常有用,但对于细心的程序员来说,除非万不得已,否则是不会宏来代替子程序。
标签:
原文地址:http://www.cnblogs.com/live-and-learn077/p/5048703.html