子程序的优点:
子程序的使用时的程序变得更加易读,更加易于理解。
子程序用以节约空间和提高性能的最重要的手段。
创建子程序的理由:
1.降低复杂度:可以隐藏一些信息;当内部循环或条件判断的嵌套层次很深时,这就需要从子程序中提取新的子程序了。
2.引入中间、易懂的抽象
3.避免代码重复:事实上,如果在两段子程序内有相似的代码,就以为这代码分解有问题,应该把相似的代码提取出来,将其中相同部分放入一个基类,然后再把两段程序中的差异代码放入派生类中。
4.支持子类话:覆盖简短而规整的子程序所需新代码的数量,要比覆盖冗长邋遢的子程序更少。
5.隐藏顺序:把处理事件隐藏起来是一个好主意。
6.隐藏指针:指针操作的可读性通常都很差,而且容易出错。通过把这些操作隔离在子程序内部,就可以把经历集中于操作的意图本身,而不是指针操作机制的细节。
7.提高可移植性:可以用子程序来隔离程序中不可移植的部分,从而明确识别和隔离未来的移植工作。
8.简化复杂的布尔判断
9.改善性能
似乎过于简单而没有必要写成子程序的操作:
对于只有几行代码比较简单的子程序来说,到底有没有必要将它写出来?这个还是得根据代码编写的需求而定,如果其他函数都用到了这些代码,那么最好将其写入一个子函数中,这样在后期如果要修改的话不用到各个其他函数中修改,只要在这个简单的子函数修改即可,这样可以减少工作量。
在子程序层上设计:
对于子程序而言,内聚I型那个是指子程序中各种操作之间联系的紧密程度。而创建子程序的目标就是让一个子程序只把一件事做好,不再做任何其他事->也称为功能的内聚性!
一般来说,其他类型的内聚性都是不可取的。他们都会导致代码组织的混乱、难于调试、不变修改。如果一个子程序具有不良的内聚性,那最好还是花功夫重新编写,使其具有更好的内聚性,而不是再花精力精确地诊断问题所在了。
好的子程序名字:
好的子程序名字能清晰地描述子程序所做到的一切。
1.描述子程序所做的所有事情:子程序名字应当描述其所有的输出结果以及副作用,如果写的有一些副作用的子程序,就会引起很多又长又笨的名字。解决的方法不是使用某个描述性较弱的子程序名,而应该换一种方式编写程序,直接了当地解决问题而不是产生副作用。
2.避免使用无意义的、模糊或表达不清的动词:有时一个子程序中仅有的问题就是其名字表述不清,而子程序本身也许设计的很好;有时动词之所以模糊是由于子程序执行的操作就是含糊不清的。
3.不要仅通过数字来形成不同的子程序名字:如output1,output2,这样很难有区分度
4.根据需要确定子程序名字的长度:研究表明,变量名的最佳长度是9到15个
5.给函数命名时要对返回值有所描述:函数有返回值,因此,函数的命名要应该针对其返回值进行。
6.给过程起名时使用语气强烈的东西加宾语的形式:一个具有功能内聚性的过程通常是针对一个对象执行一种操作。
7.准确使用对仗词
8.为常用操作确立命名规则:防止一个项目中不同编程人员设定自己的函数命名,造成不同编程人员要了解其他人员的函数内部实现细节。
子程序可以写多长?
如果要编写一段超过200行代码的子程序,那就要小心了。对于超过200行代码的子程序来说,没有哪项研究发现他能降低成本和/或降低错误率,而且在超过200行后,迟早会在可读性方面遇到问题。
如何使用子程序参数:
1.按照一定的顺序组织子程序参数排序(输入-修改-输出):不要随机地或按字母顺序排列参数,而应该先列出仅作为输入用途的参数,然后是即作为输入有作为输出用途的参数,最后才是仅作为输出用途的参数。
2.考虑自己创建in和out关键字
3.如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致。
4.使用所有参数:既然往子程序中传递了一个参数,就一定要用到这个参数。
5.把状态或出错变量放在最后
6.不要把子程序的参数用作工作变量:把传入的子程序的参数用作工作变量是很危险的,应该使用局部变量。
7.在接口中对参数的假定加以说明
应该对那些接口参数的假定进行说明呢?
a参数是仅用于输入的、要被修改的、还是仅用于输出的
b表示数量的参数的单位
c如果没有枚举类型的话,应该说明状态代码和错误值的含义
d所能接受的数值范围(如32位数据溢出问题)
e不该出现的特定数值(如除数不能为零)
8.把子程序的参数个数限制在大约7个以内
9.考虑对参数采用某种表示输入、修改、输出的命名规则
10.为子程序传递用以维持其接口抽象的变量或对象:
子程序的接口要表达何种抽象?如果要表达的抽象是子程序期望3想的定的数据,但这3项数据只是碰巧由同一对象所提供的,那就应该单独传递这3项数。然而,如果子程序接口要表达的抽象是一直拥有某个特定对象,且该子程序要对这一对象执行这样那样的操作,如果单独传递3项特定的数据,那就是破坏了接口的抽象。
如果采用传递整个对象的做法,并发现自己是创建对象,把被调用子程序所需的3项数据填入该对象,在调用过子程序后又从对象中取出3项数据的值,那就是一个证据,说明应该值传递那3个数据而不是整个对象。
如果发现自己常需要修改程序的参数表,而每次修改的参数都是来自于同一个对象,那就说明应该传递整个对象而不是个别数据项了。
11.使用具名参数
12.确保实际参数与形式参数相匹配:形式参数是指在子程序中声明的变量。实际参数是指在实际的子程序调用中用到的变量、常量或表达式。
关于函数的返回值:
检查所有可能的返回路径
不要返回指向局部数据的引用或指针