Writing Clean Code 共 185 页 第 1 页
编程精粹
─── Microsoft 编写优质无错 C 程序秘诀
Writing Clean Code
─── Microsoft Techniques for Developing Bug-free C
Programs
Steve Maguire 著
姜静波 佟金荣 译
麦中凡 校
电子工业出版社
Writing Clean Code 共 185 页 第 2 页
目录
序 ......................................................................................................................................................3
某些背景...........................................................................................................................................5
命名约定...........................................................................................................................................6
引言 ..................................................................................................................................................8
第 1 章 假想的编译程序.............................................................................................................12
第 2 章 自己设计并使用断言.....................................................................................................20
第 3 章 为子系统设防.................................................................................................................45
第 4 章 对程序进行逐条跟踪.....................................................................................................68
第 5 章 糖果机界面.....................................................................................................................76
第 6 章 风险事业.........................................................................................................................92
第 7 章 编码中的假象...............................................................................................................117
第 8 章 剩下来的就是态度问题...............................................................................................135
后记 走向何方.........................................................................................................................150
附录B 内存登录例程................................................................................................................154
附录C 练习答案........................................................................................................................162
参考文献.......................................................................................................................................185
Writing Clean Code 共 185 页 第 3 页
献给我的妻子 Beth,
以及我的双亲 Joseph 和 Julia Maguire
────为了他们的爱和支持
序
1986 年,在为几家小公司咨询和工作了 10 年之后为了获得编写 Macintosh 应用程序的
经验,我特意到 Microsoft 公司工作,参加了 Macintosh 开发小组。这个小组负责 Microsoft
的图形电子表格应用程序的开发。
当时,我还不能肯定想象的代码是什么样子的,我想也许应该既引入入胜又雅致吧!但
我看到的代码却很平常,与我以往见到的其它代码没有什么不同。要知道,Excel 有一个相
当漂亮的用户界面 ─── 它比当时其它基于字符的电子表格软件更容易使用,更加直观。
但使我感受更深的是产品中包含的一个多功能调试系统。
该系统旨在自动地问程序员和测试者进行错误报警。其工作方式非常象波音 747 驾驶仓
内向驾驶员报告故障的报警灯。该调试系统主要用来对代码进行监视,它并不过多地对代码
进行测试。虽然现在该调试系统采用的概念已不再新鲜了,但当时它们的广泛使用程度以及
该系统有效的查错能力还是吸引了我,使我深受启发。没过多久,我就发现 Microsoft 的大
部分项目都有多功能的内部调试系统,而 Microsoft 的程序员都高度重视代码中的错误及其
产生原因。
在做了两年 Macintosh Excel 之后,我离开了该开发小组,去帮助另一个代码错误数目
超常的小组。在开发 Excel 的两年中,我发现 Microsoft 虽然壮大了两倍,但许多老项目组
熟知的概念并没有随着公司的壮大而传到新项目组。新程序员不象我加入 Microsoft 之前时
的老程序员一样对容易引起错误的编码习惯特别重视,而只有一般的注意。
在我转到新项目组六个月之后,有一次我对一个程序员伙伴提到:“应该把编写无错代
码的某些概念写成文字,使那些原理能在新项目组传开”。这时另一位程序员对我说:“你不
要总是想着写文档,为什么你不把这一切都写下来?为什么你不写本书,问问 Microsoft
出版社是否愿意出版呢?毕竟这些信息不是谁的专利,其作用不过是为了使程序员更加重视
错误。”
当时我对这个建议并没有多想,主要原因是没有时间,而且以前我也没有写过书。以前
我所做过与写书最有关系的事情,不过是在 80 年代初协助别人主办 Hi-Res 杂志的程序设计
专栏,这与写书毕竟不是一回事。
正如您所见到的,这本书还是写出来了。理由很简单:1990 年,由于错误越来越多,
Microsoft 取消了一个尚未公布的产品。现在,错误越来越多已经不是什么新鲜事情,
Writing Clean Code 共 185 页 第 4 页
Microsoft 的几个竞争者都因此取消过一些项目。但 Microsoft 因为这种原因取消项目,还
是头一次。最近,随着接连不断地出现产品错误。管理人员终于开始叫嚷“受不了啦”,并
采取了一系列的措施企图将错误率下降到原先的水平。尽管如此,仍然没有人将这些错误因
由记录下来。
现在,Microsoft 已经比我刚进公司时大了九倍。很难设想,倘若没有准确的指南,公司怎
样才能将出错率降低到原来的水平。尤其是在 Windows 和 Macintosh 的应用越来越复杂的情
况下,更是如此。
以上就是我最终决定写这本书的原因
Microsoft 出版社已经同意出版这本书。
情况就是这样。
我希望您会喜欢这本书,我力图使本书不那么枯燥并尽量有趣。
Steve Maguire
西雅图,华盛顿
1992.10.22
致谢
我要感谢 Microsoft 出版社中帮助本书问世的所有人,尤其是在我写作过程中始终手把
手地教我的两个人。首先我要感谢我的约稿编辑 Mike Halvorson,他使我能够按照自己的
进度完成了这本书,并且耐心地解答了我这个新作者提出的许多问题。我还要特别感谢我的
责任编辑 Erin O’Connor 女士,她用了许多额外时间及早地对我写出的章节提出了反馈意
见。没有他们的帮助,就不会有这本书。Erin 还鼓励我以幽默的风格写这本书。她对文中
的小俏皮话发笑当然不会使我不快。
我还要感谢我的父亲 Joseph Maguire 是他在 70 年代中期把我引入早期的微机世界:
Altair、IMSAI 和 Sol-20,使我与这一行结缘。我要感谢我于 1981~83 年在 Valpar
International 工作时的伙伴 Evan Rosen,他是对我职业生涯最有影响的几个人之一,他的
知识以及洞察力在本书中都有所体现。还有 Paul Davis,在过去的 10 年里,我与他在全国
各地的许多项目中都有过愉快的合作,他也无疑的塑造了我的思维方式。
最后感谢花时间阅读本书草稿,并提供技术反馈意见的所有人。他们是:Mark Gerber、
Melissa Glerum、Chris Mason、Dave Moore、John Rae-Grant 和 Alex Tilles。特别感谢
Eric Schlegel 和 Paul Davis,他们不仅是本书草稿的评审者,而且在本书内容的构思上对
我很有帮助。
Writing Clean Code 共 185 页 第 5 页
某些背景
本书用到了一些读者可能不太熟悉的软件和硬件系统的名称。下面对其中最常见的几个
系统给出简单的描述
Macintosh Macintosh 是 Apple 公司的图形窗口计算机,公布于 1984 年。它是
最先支持“所见即所得”拥户界面的流行最广的计算机。
Windows Windows 是 Microsoft 公司的图形窗口操作系统。Microsoft 公司
1990 年公布了 Windows 3.0,该版本明显好于其早期版本。
Excel Excel 是 Microsoft 公司的图形电子表格软件,1985 年首次在
Macintosh 上公布,随后在进行了大量的重写和排错工作后,被移植
到 Windows 上。多年来 Macintosh Excel 和 Windows Excel 共用一个
名字,但程序所用的代码并不相同。
在本书中,找多次提到曾经当过 Macintosh Excel 程序员这一经
历。但应该说明的是,我的大部分工作是将 Windows Excel 的代码移
到 Macintosh Excel 上或者是实现与 Windows Excel 相似的特征。我
与该产品现在的惊人成功并没有特别的关系。
我为 Macintosh Excel 所做的唯一真正重要的贡献是说服
Microsft 放弃掉 Macintosh Excel,而直接利用 Windows Excel 的源
代码构造 Macintosh 的产品。Macintosh 2.2 版是第一个基于 Windows
Excel 的版本,它享用了 Windows Excel 80%的源代码。这对 Macintosh
Excel 的用户意义重大,因为用了 2.2 版以后他们会感至 Macintosh
Excel 的功能和质量都有了一个很大的飞跃。
Word Word 是 Microsoft 公司的字处理应用软件。实际上,Word 有三种版
本:基于字符并在 MS-DOS 上运行的 DOS 版;Macintosh 版;Windows
版。到目前为止,这三种版本的产品虽然是用不同的源代码做出的,
但它们非常相象,用户改用任何一个都不会有什么困难。由于 Excel
利用共享代码获得了成功,Microsoft 已经决定 Word 的高版本也将
采用共享代码进行开发。
80x86 80x86 是 MS-DOS 和 Windows 机器常用的 Intel CPU 系列。
680x0 680x0 是各种 Macintosh 所用的 Motorola CPU 系列。