Code Complete read note

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: