高质量的子程序
子程序是为实现一个特定的目的而编写的一个可被调用的方法或过程
创建子程序的理由
- 管理复杂度
- 引入中间易懂的抽象
- 避免代码重复
- 支持子类化
- 隐藏顺序
- 隐藏指针操作
- 提高可移植性
- 简化复杂的布尔判断
- 改善性能
- 隔离复杂度
- 隐藏实现细节
- 隐藏全局数据
子程序设计的目标:只把一件事情做好,不再去做其他的事情,即子程序要尽可能的具有高内聚。
子程序要有良好的名字,好的子程序的名字能够清晰的描述子程序所做的一切,避免使用无意义的名字。
子程序的长度尽量控制在 200 行以内。在这个范围内,代码长度不是子程序的关键因素,其他的降低复杂度的因素才是关键的。
防范式编程
主要思想:子程序不应该因为传入错误的数据而被破坏,哪怕是由其他子程序产生的错误数据。
断言
断言的目的:非常肯定某个条件表达式是成立的,否则就是出错了。
关于使用断言的建议:
- 用错误处理代码来处理预期会发生的情况,而用断言来处理绝对不应该发生的状况
- 避免把执行代码放到断言中,因为这样会导致关闭断言时,编译器很可能就把这些代码排除在外,正确的做法是先将执行代码的结果在断言外用变量存起来
- 用断言来注解并验证前条件和后条件。简单来说,前条件就是在执行函数前需要为函数准备好的条件,后条件则是在函数执行后要完成的任务
错误处理技术
- 返回中立值
- 返回下一个正确的数据
- 返回与前一次相同的数据
- 使用最接近的合法值
- 把警告信息加到日志文件中,然后继续执行
- 返回一个错误码
异常
异常是把代码中的错误或异常事件传递给调用代码的一种特殊手段。异常的基本结构是:子程序使用 throw 跑出一个异常对象,再被调用链上层其他子程序的 try-catch 语句捕获。
使用异常的建议:
- 只有在真正例外的情况下才抛出异常。也就是说假如子程序局部能够处理这个错误就不要抛出异常;因为异常虽然能够增加程序的鲁棒性,但是会使程序的复杂性增加。
- 避免在构造函数和析构函数中抛出异常
- 在合适的抽象层次抛出异常
伪代码编程
伪代码编程是创建单独类及其子程序的一种系统性方法。创建一个类一般而言是一个迭代过程。先对一个类做总体设计,列出这个类内部的特定子程序,创建这些子程序;然后从整体上复审这个类的构建结果。
伪代码指导原则
- 用类似英语的语句来精确描述特定的操作;
- 避免使用目标编程语言中的语法元素;
- 去描述解决问题的方法的意图,而不是去写如何在目标语言中实现这个语法;
- 要不断的细化精化伪代码,直到看起来很容易直接写出代码为止;
伪代码写好后,还可以直接变成代码中的注释。通过伪代码编程过程创建子程序需要:一,先设计这个子程序;二,用高层次的伪代码来写程序,可以由一段头部注释开始。描述这段程序应该做些什么,首先简要地用一句话来写出该程序的目的。然后就可以为这个子程序编写高层次的伪代码,持续地精化和分解伪代码,直到你满意为止;三,在伪代码的基础上编写子程序代码:写出子程序的声明;编写首尾语句;将伪代码转换成高层次的注释;填充代码;检查代码。用伪代码编程的方法可以让你脱离那种先东拼西凑,然后通过编译运行来看代码是否能工作的怪圈。此外还存在一些其他的可以替代伪代码编程的方案:测试先行开发;重构;契约式设计和试图通过东拼西凑来写出能工作的代码等。