目录
1、创建子程序的正当理由
2、在子程序层上的设计
3、好的子程序的名字
4、子程序可以写多长
5、如何使用子程序的参数
6、使用函数时要特别考虑的问题
7、宏子程序和内联子程序
我们常常会遇到一些烂的子程序:烂的命名、没有逻辑、改变传入值、没有单一目的、没有防范错误数据、没有使用传入的部分参数、传入引用却不使用、参数上限超过7个、参数混乱、没有注释等等
一、来看看创建子程序的正当理由
1、降低复杂度:抽象能力让程序更易读
2、引入中间、易懂的抽象
3、避免代码重复
4、支持子类化:可覆盖的程序简单减少犯错的几率
5、隐藏顺序
6、隐藏指针操作
7、提高可移植性
8、简化复杂的布尔判断
9、改善性能
10、确保子程序都很小
二、子程序上的设计
1、功能内聚性
2、顺序内聚性
3、通信上的内聚性
4、临时的内聚性
不可取的内聚性:
过程上的内聚性、
逻辑上的内聚性例如computeAll()、EditAll()、PrintAll()
巧合内聚性
三、好的子程序名字
1、描述子程序所做的所有事情
2、避免使用无意义的、模糊的或表述不清的动词:HandleCalculation()、PerformServices()、OutputUser()、ProcessInput()、 DealWithOutput()
3、不要仅通过数字来形成不同的子程序名字
4、根据需要确定子程序的长度:变量名9-15字符,而子程序要视名字是否清晰易懂
5、给函数命名时要对返回值有所描述
6、给过程起名时使用语气强烈的动词加宾语的形式(verb-plus-object)如:document.print()、orderInfo.check()而 document.documentPrint()就太臃肿
7、准确使用对仗词
8、为常用操作确立命名规则:不要有getid() id()等等的此类方法混乱
四、子程序可以写多长
尽量100-150 不要超过200行(不算空行)
五、如何使用子程序参数
1、 参数应按 输入-修改-输出顺序排列
2、 使用所有的参数
3、 把状态或出错变量放到最后
4、不要把子程序的参数用做工作变量 :最好是inputval 和workval
5、在接口中对参数的假定加以说明:越早越好
6、把子程序的参数限定在7个以内:多于7个尽量的组成一个类
7、考虑对参数采用某种表示输入修改输出的命名规则例如:i_、m_、 o_或者input_ 、 modify_、output_
8、为子程序传递用以位置其接口抽象的变量或对象
9、使用具名参数
10、确保实际参数与形式参数相匹配
六、使用函数时要特别考虑的问题
1、 一个子程序的主要用途就是返回由其名字所指明的返回值那么就应该使用函数,否则就应该使用过程(无返回值的函数)。
2、确保检查所有可能的返回路径,在函数开头设置返回值。
3、不要返回指向局部变量的数据的引用和指针
七、宏子程序和内联子程序
1、把宏表达式整个包含在括号内。#define Cube (a)a*a*a 应该是#define Cube(a)((a)*(a)*(a))
2、多条语句的宏用大括号包含起来{}
3、用给子程序命名的方法来给展开后代码形同子程序的宏命名,以便在需要时可以用子程序来替代宏
替代宏方案:
const 、inline、 template、enum、typedef
把宏尽量的用在条件编译