第九章 伪代码编程过程

本章从微观上关注编程过程——也就是关注创建单独的类及其子程序的特定步骤。本章还将讲述伪代码编程过程,这种编程有助于减少设计和编写文档所需的工作量,同时提高这两项的工作质量。

创建类和子程序的步骤概述

先对一个类做总体设计,列出这个类内部的特定子程序,创建这些子程序,然后从整体上复查这个类的创建结果。

创建一个类的步骤

创建一个类的关键步骤如下:

  1. 创建类的总体设计;
  2. 创建类中的子程序;
  3. 复审并测试整个类。

创建子程序的步骤

创建子程序涉及到的活动:

  1. 设计子程序;
  2. 检查设计;
  3. 编写子程序的代码;
  4. 检查代码。

伪代码

有效使用伪代码的指导原则:

  • 用类似英语的语句来精确描述特定的步骤;
  • 避免使用目标编程语言中的语法元素;
  • 在本意层面上编写伪代码;
  • 在一个足够低的层次上编写伪代码,以便可以近乎自动地从它生成代码。

一段不好的伪代码示例

increment resource number by 1
allocate a dlg struct using malloc
if malloc() returns NULL then return 1
invoke OSrsrc_init to initialize a resource for the operating system
*hRsrePtr = resource number
return 0

一段好的伪代码

keep track of current number of resource in use
	if another resource is available
		allocate a dialig box struture
		if a dialog box struture could be allocted
			note that one more resource is in use
			initialize the resource
			store the resource number at the location provided by the caller
		endif
	endif
return ture if a new resource was created; else return false

使用好的伪代码风格可以可到如下好处:

  • 使得评审更加容易;
  • 支持反复迭代精化的思想;
  • 使变更变得更加容易;
  • 减少给代码做注释的工作量;
  • 比其他形式的设计文档更容易维护。

通过伪代码编程过程创建子程序

与创建子程序有关的活动:

  • 设计子程序;
  • 编写子程序代码;
  • 检查代码;
  • 收尾工作;
  • 按照需要重复上述步骤。

设计子程序

涉及子程序的工作:

  1. 检查先决条件;
  2. 定义子程序要解决的问题;
    • 这一子程序将要隐藏的信息;
    • 传给这个子程序的各项输入;
    • 从该子程序得到的输出;
    • 在调用程序之前确保有关的条件成立;
    • 在子程序将控制权交回调用方程序之前,确保其后条件的成立。
  3. 为子程序命名;
  4. 决定如何测试子程序;
  5. 在标准库中搜寻可用的功能;
  6. 考虑错误处理;
  7. 考虑效率问题;
  8. 研究算法和数据类型;
  9. 编写伪代码;
  10. 考虑数据;
  11. 检查伪代码;
  12. 在为代码中验证一些想法,留下最好的想法。

编写子程序的代码

构建子程序的步骤如下图;

具体步骤如下:

  1. 写出子程序的声明;
  2. 把伪代码转变为高层次的注释;
  3. 在每条注释下面填充代码;
  4. 检查代码是否需要进一步分解;
    • 将这段注释下面的代码重构成一个新的子程序;
    • 递归地应用伪代码编程过程;
  5. 在脑海里检查程序中的错误;
  6. 编译子程序;
  7. 在调试器中逐行执行代码;
  8. 测试代码;
  9. 消除程序中的错误

根据需要重复上述步骤。

伪代码编程过程的替代方案

伪代码编程过程是创建类和子程序的最佳方法,下面还有其他的一些方法:

  • 测试先行开发;
  • 重构;
  • 契约式设计;
  • 东拼西凑。

核对表:伪代码编程过程

  • [ ] 是否检查过已满足所有的先决条件?
  • [ ] 定义好这个类要解决的问题了吗?
  • [ ] 高层次的设计是否足够清晰?能给这个类和其中每一个子程序起一个好的名字吗?
  • [ ] 考虑过该如何测试这个类及其中每一个子程序吗?
  • [ ] 关于效率的问题,你主要从稳定的接口和可读的实现这两个角度考虑吗?还是主要从满足资源和速度的预期目标的角度考虑过呢?
  • [ ] 在标准库函数或其他代码库中寻找过可用的子程序或者组建了吗?
  • [ ] 在参考书籍中查找过有用的算法了吗?
  • [ ] 是否用详尽的伪代码设计好每一个子程序?
  • [ ] 你在脑海里检查过伪代码吗?这些伪代码容易理解吗?
  • [ ] 关注过那些可能会让你重返设计的警告信息了吗?
  • [ ] 是否把伪代码正确翻译成代码了?
  • [ ] 你反复使用伪代码编程过程了吗?有没有根据需要把一些子程序分成更小的子程序?
  • [ ] 在作出假定的时候有没有对他们加以说明?
  • [ ] 已经删除掉那些冗余的注释了吗?
  • [ ] 你是否采取了几次迭代中最好的那个结果?还是在第一次迭代之后就停止了?
  • [ ] 你完全理解你的代码了吗?这些代码是否容易理解?

要点

  • 创建类和子程序通常都是一个迭代过程。在创建子程序的过程中获得的认识常常会反过来影响类的设计;
  • 编写好的伪代码需要使用易懂的英语,要避免使用特定的编程语言中才有的特性,同时要在意图层面上编写伪代码(即描述做什么,而不是怎么去做);
  • 伪代码编程过程是一个行之有效的做详细设计的工具,它同时让编码工作更容易。伪代码会直接转化为注释,从而确保了注释的准确性和实用性;
  • 不要只停留在你所想到的第一个设计方案上。反复使用伪代码做出多种方案,然后选出其中最佳的一种方案再开始编码;
  • 每一步完成后都要检查你的工作成果,还要鼓励其他人来帮你检查。这样你就会在投入精力最少的时候,用最低的成本发现错误。
原文地址:https://www.cnblogs.com/liam-ji/p/11512662.html