This topic is written in Chinese, keep updating…
第九章 伪代码编程过程
9.2 伪代码编写原则
- 避免使用编程语言中的语法元素,伪代码能让我们在比代码本身略高的层次上进行设计。
- 用伪代码描述解决问题的方法的意图,而不是描述怎么使用某种编程语言。
- 伪代码在精华过程中应该有越来越多细节, 可以近乎自动的生成代码。
使用伪代码的好处
- 可以让code review更容易。
- 可以减少代码注释的工作量。
- 伪代码比其他形式的设计文档更容易维护。因为伪代码需要与code保持一致。
9.3 通过伪代码编程创建子程序
在编写子程序和他的伪代码之前,我们先要做以下准备工作: - 检查先决条件 子程序是否与整体设计相匹配,子程序是否符合项目需求
- 定义子程序要解决的问题 在高层设计中应该已经有子程序的设计说明,这些说明需要描述出子程序将要解决的问题,并且包含下面信息:
- 子程序隐藏的信息
- 子程序的输入
- 子程序的输出
- 调用子程序前必须成立的条件
- 调用子程序后,程序继续成立的条件
- 如何测试子程序
- 在库中寻找可用的资源 查找代码库中是否有可复用的代码
- 考虑可能的错误处理
- 考虑效率问题 对大多数系统来说,只需查看子程序接口是否经过好的抽象,代码是否易读,是否易于扩展和改进。在子程序上不应该考虑太多效率问题,效率问题在高层设计上会得到更好的优化。
完成了这些准备工作后,可以开始编写伪代码。
从头部注释开始编写伪代码,在头文件中应该总结此子程序的目的。
- 定义关键数据类型
- 检查伪代码 可以让他人review你的伪代码,在伪代码中高层次错误会更加明显,这样做可以节省开发之后发现设计错误再修正的时间。
- 在伪代码中尝试更多的实验想法
分解伪代码很重要,写伪代码时应该做到可以把伪代码转换为code,如果伪代码的层次太高,无法做到轻易的转换为code,应该继续分解伪代码,直到觉得再写伪代码是浪费时间。
开始创建子程序
原书第228页举了一个c++的ReportErrorMessage class的例子。概括来说,首先编写header comment, 在这段comment里面应该描述这个class用来解决的问题,他的输出和输入,他返回的类型。
第二步进行class的声明和伪代码编写。伪代码的编写应符合上面提到的标准,尽可能地细化。
第三步检查代码是否需要进一步分解。如果几行伪代码展开后形成了大量代码,应该考虑将伪代码进一步细化,或者重构成一个新的子程序。
检查代码
- 检查的方式:desk checking,peer review,walk-through,inspection
- 编译 本书希望在整个架构的后期才开始编译,至少在头脑中确定你的程序可以运行,脱离hacking-and-compling的思维。
- 发挥编译器的优势,将警告调到最高,使用validator,消除warning
- 错误 如果检测到太多错误,推荐重写而不是修修补补。
收尾工作
- 检查子程序接口
- 检查整体设计质量,此程序只干一件事
- 检查变量名称,未被用到的对象,未经过声明的变量
- 检查逻辑和语句,是否存在资源泄露,14-19章 todo:如何检查
- 检查子程序布局,31章详细描述 todo:如何检查
- 检查文档,算法描述,难以理解的部分,32章详细描述
替代伪代码编程的方案
- 测试先行
- 重构,不太理解这个方案
- 契约式设计
- hacking!
原书非常有用的checklist: