第九章 伪代码编程过程
9.1 创建类和子程序的步骤概述
类的创建方式有很多,一般而言都是一个迭代过程
创建一个类的步骤
- 创建类的总体设计:抽象概念,定义接口,类隐藏的属性,是否派生等等,不要指望一下就全部做好,迭代 很重要
- 创建类的子程序
- 复审并测试整个类
创建子程序的过程
9.2 伪代码
我个人的做法呢,每要实现一个功能就添加一句概括性的注释,然后用函数来实现这个注释,完成代码之时,注释也完成了,所谓的伪代码也就有了,自己回顾代码的时候也有所依据;我觉得这种做法比较适合小程序,总体架构的东西有软件任务书来完成;
9.3 通过伪代码编程过程创建子程序
设计子程序
-
检查先决条件:其实就是检查子程序功能是否单一
-
定义子程序要解决的问题:
① 这一子程序要隐藏的信息
② 传给这个子程序的各项输入
③ 从该子程序得到的输出
④ 在调用程序之前确保有关的前条件成立
⑤ 在子程序将控制权交给调用方之前,确保后条件成立 -
为子程序命名
-
决定测试子程序
-
在标准库中搜寻可用的功能:代码重用
-
考虑错误处理
-
考虑效率问题:首先设计好接口以备后期优化;其次在性能特别重要的情况下,就需要调校了;不过通常情况下,都是在整个架构上来考虑效率的问题,然后再找细节性的子函数;
-
研究算法和数据类型
-
编写伪代码
-
考虑数据
-
检查伪代码
-
在伪代码中实验一些想法,留下最好的想法(迭代来实现)
编写子程序的代码
检查代码
- 在脑海里检查程序中的错误:在头脑中过一遍程序,确保检查到所有可能的执行路径、断电和所有异常条件;如果你发现自己经常华裔某些错误时有编译器或硬件造成的,那么你就仍然处于迷信的阶段;研究表明只有月5%的错误时有硬件、编译器或操作系统的原因造成的;理解每一行代码所起的作用,理解为什么需要这行代码;也就是你必须知道它为什么工作,不能模棱两可,那样你就不知道为什么它不能工作,你就不能检查到错误
- 编译子程序:不要寄希望于用编译器帮你找错误,如果你一直急于编译,那就可能形成催促自己编写代码的习惯,一定不能形成东拼西措然后通过运行来检查代码是否工作的习惯;发挥编译子程序所产生的功效的指导建议:
① 把编译器的警告级别调到最高;
② 使用验证工具,可以通过使用类似lint这样的工具来对c语言这类语言的编译器所做的检查结果进行补充检查;
③ 消除产生错误消息和警告的所有根源; - 在调试器中逐行执行代码:程序编译通过之后,要在调试器中逐行执行,以确保每行代码都在按照你所期望的方式执行(我觉得这样挺好,我之前就是执行一遍,看结果对了的话,就不去看过程了,那么你对你的过程不了解,同时你对过程的隐藏错误不清楚,所以出现问题,也不好去查找问题)
- 测试代码:使用你在开发该子程序期间计划写的或已写成的测试用例来测试代码;记得为了达到测试的目的,你可能需要加入一些辅助功能,因此在设计代码的时候,需要想到测试的问题
- 消除程序中的错误:如果你发现一段程序的毛病不是一般的多,那么就重头来吧!首先,重头写比修修补补更容易;其次,由于错误太多,你可能不能全面理解程序,而导致修改会导致其他错误
收尾工作
- 检查子程序的接口:确认所有的输入、输出数据都参与了计算,并且所有的参数也都用到了
- 检查整体的设计质量:这个子程序只干了一件事情,并且把这件事情做得很好;子程序之间是松散耦合的;子程序采用了防御式设计
- 检查子程序中的变量:检查是否存在不准确的变量名称、未被用到的对象、未经声明的变量,以及未经正确初始化的对象等
- 检查子程序的语句和逻辑:检查是否存在“偏差1”(off-by-one)这样的错误、死循环、错误的嵌套以及资源泄露
- 检查子程序的布局:确认你正确地使用了空白来明确子程序、表达式及参数列表的逻辑结构
- 检查子程序的文档
- 除去冗余的注释
根据需要重复上述步骤
高质量的代码是一个迭代的过程