高质量的子程序
子程序的意义:
- 减低重复代码,使得整体代码不臃肿
- 提高改善代码效率,局部功能改善子程序即可
- 促进了现代化编程的发展
创建子程序的理由:
-
降低复杂度。可以利用子程序隐藏一些信息,缩小代码规模,提高正确性等
-
引入中间、易懂的抽象。根据良好的命名,可以见名知义
-
避免代码重复。提高相同功能代码一致性
-
支持子类化。降低犯错的几率
-
隐藏顺序。子程序相互独立,开发没有顺序限制
-
隐藏指针操作。精力集中在主要意图上
-
提高可移植性。区别不可移植的代码,降低裁剪移植工作量
-
简化复杂的布尔判断。使得主流程更加清晰
-
改善性能。通过修改一个子程序性能,可以提高整体程序的性能
-
子程序长短根据实际情况决定
… …
-
便于重构
子程序的设计:
- 功能上的内聚性。体现为单一职责原则,每个子程序只做一件事情,更可靠
子程序名字原则:
- 描述子程序所做的事情。名字应当描述其所有的结果以及副作用,但不能又长又笨
- 避免使用无意义,模糊或表述不清的动词。
- 不要仅通过数字来形成不同的子程序名字。
- 根据需要确定子程序名字的长度。最佳长度9 – 15个字符
- 函数命名时要对返回值有所描述。
- 给过程起名时使用语气强烈的动宾结构。
- 准确使用对仗词。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TCVuHaSq-1656143363450)(Personal export_20220516.assets/image-20220623175407902.png)] - 为常用操作确立命名规则。
子程序可以写多长
- 根据嵌套性,层次,决策点数量等因素而定
如何使用子程序参数
- 按照输入-修改-输出的顺序排列参数。
- 考虑创建IN 和OUT关键字。
- 如果几个子程序都用来类似的一些参数,应该保持一致。
- 不要有使用不到的参数。
- 把状态和出错变量放在最后
- 不要把子程序的参数用于工作变量
- 接口中使用参数的假定加以说明。使用断言
- 参数个数限制在7个以内
- 为子程序传递用以维持其接口抽象的变量或对象
- 使用具名参数
- 确保实际参数与形式参数相匹配
使用函数时要特别考虑的问题:
- 函数&过程。有返回值的是函数,没有返回值的是过程。返回值是 void 的也算是过程。如果一个子程序的主要用途就是返回由其名字所指明的返回值,就应该返回函数,否则应该使用过程。
设置返回函数的返回值,建议
- 检查所有可能的返回路径。在函数开头用一个默认值来初始化返回值。
- 不要返回指向局部数据的引用或指针。
宏子程序和内联子程序
-
把宏表达式整个包含在括号内
#define Cube(a) a*a*a // error demo e.g. Cube(x+1) x+1*x+1*x+1 #define Cube(a) (a)*(a)*(a) // error demo #define Cube(a) ((a)*(a)*(a)) // right demo
-
把含有多条语句的宏用大括号括起来。用宏来代替函数调用的做法具有风险,而且不易理解,除非必要,建议避免使用这种方式。
-
用给子程序命名的方法来给展开后代码形同子程序的宏命名,以便在需要时可以用子程序来替换宏。
- 副作用在于++和–运算符,容易误把宏当作子程序使用
宏子程序在使用上的限制,C++
- const可以用于定义常量
- inline 定义内嵌代码
- template 以类型安全的方式定义各种标准操作
- enum可用于定义枚举类型
- typedef用于定义简单的类型替换
- 尽量不要使用宏来代替子程序,因为难以使用调试器发现问题
内联子程序
- inline关键字,需要节制使用