高质量的子程序

高质量的子程序

子程序的意义:

  • 减低重复代码,使得整体代码不臃肿
  • 提高改善代码效率,局部功能改善子程序即可
  • 促进了现代化编程的发展

创建子程序的理由:

  • 降低复杂度。可以利用子程序隐藏一些信息,缩小代码规模,提高正确性等

  • 引入中间、易懂的抽象。根据良好的命名,可以见名知义

  • 避免代码重复。提高相同功能代码一致性

  • 支持子类化。降低犯错的几率

  • 隐藏顺序。子程序相互独立,开发没有顺序限制

  • 隐藏指针操作。精力集中在主要意图上

  • 提高可移植性。区别不可移植的代码,降低裁剪移植工作量

  • 简化复杂的布尔判断。使得主流程更加清晰

  • 改善性能。通过修改一个子程序性能,可以提高整体程序的性能

  • 子程序长短根据实际情况决定

    … …

  • 便于重构

子程序的设计:

  • 功能上的内聚性。体现为单一职责原则,每个子程序只做一件事情,更可靠

子程序名字原则:

  • 描述子程序所做的事情。名字应当描述其所有的结果以及副作用,但不能又长又笨
  • 避免使用无意义,模糊或表述不清的动词。
  • 不要仅通过数字来形成不同的子程序名字。
  • 根据需要确定子程序名字的长度。最佳长度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关键字,需要节制使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本道自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值