标题：经典代码大全
基本信息
原书名：CODE COMPLETE, Second Edition
原出版社： Microsoft Press
作者：（美）Steve McConnell  
译者：金戈 汤凌 陈硕 张菲
出版社：电子工业出版社
ISBN：7121022982
出版日期：2006 年3月
开本：16开
页码：960
版次：2-3
编辑推荐
被china-pub会员评为“2007年我最喜爱的十大技术图书”之一
被《程序员》等机构评选为2006年最受读者喜爱的十大IT图书之一
是著名IT畅销书作者Steve McConnell十一年前的经典著作的全新演绎，该作者是两届Software Development Magzine Jolt Award震撼大奖得主
内容简介
代码大全（第二版）是著名it畅销书作者steve mcconnell十一年前的经典著作的全新演绎：第二版不是第一版的简单修订增补，而是完全进行了重写；增加了很多与时俱进的内容。这也是一本完整的软件构建手册，涵盖了软件构建过程中的所有细节。它从软件质量和编程思想等方面论述了软件构建的各个问题，并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念，还含有丰富而典型的程序示例。本书中所论述的技术不仅填补 了初级与高级编程技术之间的空白，而且也为程序员们提供了一个有关编程技巧的信息来源。本书对经验丰富的程序员、技术带头人、自学的程序员及几乎不懂太多编程技巧的学生们都是大有裨益的。可以说，无论你是什么背景，阅读本书都会让你在更短的时间内、更容易地写出更好的程序。
代码大全是我早在好几年前便已经阅读过的好书。这几年来我不知买过多少书籍，也清理过许多因为书房再也放不下的书籍，但是代码大全这本书始终占据着我书架上重要的位置而不曾移开过，因为好书是经得起时光考验的。
—— borland公司大中华首席技术官（cto） 李维
在众多的编程类书籍中，如果只让我挑一本书来阅读，那我一定选择《代码大全》，因为它是最不可或缺的。
—— 《c++ primer中文版（第三版）》译者 潘爱民
作译者
Steve McConnell是Construx公司首席软件工程师，在公司里监督软件工程实施。他是软件工程知识体(SWEBOK) 项目构建知识领域的领导。Steve曾为微软公司、波音公司和西雅图地区的公司工作过。
Steve McConnell是以下著作的作者：1996年的《快速软件开发（Rapid Development）》、1998年的《软件项目长存之道（Software Project Survival Guide）》和2004年的《专业软件开发（Professional Software Development）》。他的书由于杰出，曾两度获得当年的《软件开发（Software Development）》杂志的优秀震撼大奖
目录
第1章 欢迎进入软件构建的世界 3
1 1 什么是软件构建？ 3
1 2 软件构建为何如此重要？ 6
1 3 如何阅读本书 8
关键点 8
第2章 用隐喻来更充分地理解软件开发 9
2 1 隐喻的重要性 9
2 2 如何使用软件隐喻 11
2 3 常见的软件隐喻 13
软件中的书法：写作代码 13
软件的耕作法：培植系统 14
软件的牡蛎养殖观点：系统生长 15
软件构建：建造软件 16
应用软件技术：智慧工具箱 20
组合各个隐喻 20
更多资源 20
关键点 21
第3章 三思而后行：前期准备 23
3 1 前期准备的重要性 24
前期准备适用于现代软件项目吗？ 25
准备不周全的诱因 25
关于开始构建之前要做前期准备的绝对有力且简明的论据 27
3 2 辨明你所从事的软件的类型 31
迭代开发法对前期准备的影响 33
在序列式开发法和迭代式开发法之间做出选择 35
3 3 问题定义的先决条件 36
3 4 需求的先决条件 38
为什么要有正式的需求？ 38
稳定需求的神话 39
在构建期间处理需求变更 40
3 5 架构的先决条件 43
架构的典型组成部分 45
3 6 花费在前期准备上的时间长度 55
更多资源 56
关键点 59
第4章 关键的“构建”决策 61
4 1 选择编程语言 61
语言描述 63
4 2 编程约定 66
4 3 你在技术浪潮中的位置 66
“深入一种语言去编程”的例子 68
4 4 选择主要的构建实践方法 69
关键点 70
第5章 软件构建中的设计 73
5 1 设计中的挑战 74
设计是一个险恶的问题 74
设计是个了无章法的过程（即使它能得出清爽的成果） 75
设计就是确定取舍和调整顺序的过程 76
设计受到诸多限制 76
设计是不确定的 76
设计是一个启发式过程 76
设计是自然而然形成的 76
5 2 关键的设计概念 77
软件的首要技术任务：管理复杂度 77
理想的设计特征 80
设计的层次 82
5 3 设计构造块：启发式方法 87
寻找现实世界中的对象 87
形成一致的抽象 89
封装实现细节 90
当继承能简化设计时就继承 91
隐藏秘密（信息隐藏） 92
找出容易改变的区域 97
保持松散耦合 100
查阅常用的设计模式 103
其他的启发式方法 105
关于设计启发的总结***** 108
使用启发式方法的原则 109
5 4 设计实践 110
迭代 110
分而治之 111
自上而下和自下而上的设计方法 111
建立试验性原型 114
合作设计 115
要做多少设计才够？ 115
记录你的设计成果 117
5 5 对流行的设计方法的评论 118
更多资源 119
软件设计，一般性问题 119
软件设计理论 120
设计模式 120
广义的设计 121
标准 122
关键点 122
第6章 可以工作的类 125
6 1 类的基础：抽象数据类型 126
需要用到adt的例子 126
使用adt的益处 127
更多的adt示例 129
在非面向对象环境中用adt处理多份数据实例 131
adt和类 133
6 2 良好的类接口 133
好的抽象 133
良好的封装 139
6 3 有关设计和实现的问题 143
包含（“有一个……”的关系） 143
继承（“是一个……”关系） 144
成员函数和数据成员 150
构造函数 151
6 4 创建类的原因 152
应该避免的类 155
总结：创建类的理由 155
与具体编程语言相关的问题 156
6 6 超越类：包 156
更多资源 159
关键点 160
第7章 高质量的子程序 161
7 1 创建子程序的正当理由 164
似乎过于简单而没必要写成子程序的操作 166
总结：创建子程序的理由 167
7 2 在子程序层上设计 168
7 3 好的子程序名字 171
7 4 子程序可以写多长 173
7 5 如何使用子程序参数 174
7 6 使用函数时要特别考虑的问题 181
什么时候使用函数，什么时候使用过程 181
设置函数的返回值 182
7 7 宏子程序和内联子程序 182
宏子程序在使用上的限制 184
内联子程序 184
关键点 186
第8章 防范式编程 187
8 1 保护程序免遭无效输入数据的破坏 188
8 2 断言 189
建立自己的断言机制 191
使用断言的指导建议 191
8 3 错误处理技术 194
健壮性与正确性 197
高层次设计对错误处理方式的影响 197
8 4 异常 198
8 5 隔离程序以免遭由错误造成的损害 203
隔离区与断言的关系 205
8 6 辅助调试代码 205
不要自动地把产品版本的限制强加于开发版本之上 205
尽早引入辅助调试的手段 206
采用冒进式编程 206
计划移除调试辅助代码 206
8 7 确定在产品代码中该保留多少防范式代码 209
8 8 防范式编程时保持防范 210
其他资源 212
关键点 213
第9章 伪代码编程过程 215
9 1 创建类和子程序的步骤概述 216
创建一个类的步骤 216
创建子程序的步骤 217
9 2 伪代码 218
9 3 通过伪代码编程过程创建子程序 220
设计子程序 225
编写子程序 225
检查代码 230
收尾工作 232
根据需要重复上述步骤 232
9 4 伪代码编程过程之外的其他方案 232
关键点 234
第10章 使用变量的一般事项 237
10 1 数据认知 238
数据认知测试 238
有关数据类型的其他资源 239
10 2 轻松掌握变量定义 239
隐式声明 239
10 3 变量初始化原则 240
10 4 作用域 244
使变量引用局部化 245
尽可能缩短变量的“存活”时间 246
减小作用域的一般原则 249
有关缩小变量作用域的说明 250
10 5 持续性 251
10 6 绑定时间 252
10 7 数据类型和控制结构之间的关系 254
10 8 为变量指定单一用途 255
关键点 258
第11章 变量名的力量 259
11 1 选择好变量名的注意事项 259
最重要的命名注意事项 260
以问题为导向 261
最适当的名字长度 262
变量名字的效果范围 262
变量名字中的计算值限定词 263
变量名字中的常用反义词 264
11 2 为特定类型的数据命名 264
为循环索引命名 265
为状态变量命名 266
为临时变量命名 267
为布尔变量命名 268
为枚举类型命名 269
为常量命名 270
11 3 命名规则的力量 270
为什么要有规则？ 270
何时采用命名规则 271
正式程度 271
11 4 非正式命名规则 272
语言无关规则的指导原则 272
语言相关规则的指导原则 275
混合语言编程的注意事项 276
命名规则示例 276
11 5 标准前缀 279
用户自定义类型缩写 279
语义前缀 280
标准前缀的优点 281
11 6 创建具备可读性的短名称 282
一般的缩写指导原则 282
语音缩写 282
有关缩写的评论 282
11 7 应该避免的名称 285
关键点 289
第12章 基本数据类型 291
12 1 使用数的普遍规则 292
12 2 整数 293
12 3 浮点数 295
12 4 字符和字符串 297
c中的字符串 299
12 5 布尔变量 301
12 6 枚举类型 303
如果你的语言里没有枚举类型 307
12 7 命名常量 307
12 8 数组 310
12 9 创建你自己的类型（类型别名） 311
为什么创建自己的类型的示例是用pascal和ada写的？ 314
创建自定义数据类型的指导原则 315
关键点 318
第13章 不常见的数据类型 319
13 1 结构 319
13 2 指针 323
用来理解指针的例子 323
使用指针的一般技巧 325
c++指针 332
c指针 334
13 3 全局数据 335
与全局数据有关的常见问题 335
使用全局数据的理由 338
只有万不得已时才使用全局数据 339
用访问子程序来取代全局数据 339
如何降低使用全局数据的风险 342
其他资源 343
关键点 344
第14章 组织直线型代码 347
14 1 必须有明确顺序的语句 347
14 2 顺序无关的语句 351
使代码易于自上而下的阅读 351
把相关的语句组织在一起 352
关键点 353
第15章 使用条件语句 355
15 1 if语句 355
简单if-then语句 355
if-then-else语句串 358
15 2 case语句 361
为case选择最有效的排序 361
使用case语句的提示 361
关键点 366
第16章 控制循环 367
16 1 选择循环的种类 367
什么时候使用while循环 368
什么时候用带退出的循环 369
何时使用for循环 372
何时使用foreach循环 372
16 2 循环控制 373
进入循环 373
处理好循环体 375
退出循环 377
检查端点 381
使用循环变量 382
循环应该有多长？ 385
16 3 轻松创建循环——由内而外 385
16 4 循环和数组的关系 387
关键点 389
第17章 不常见的控制结构 391
17 1 子程序中的多个返回 392
17 2 递归 393
递归的例子 394
使用递归的技巧 396
17 3 goto 398
反对goto的论点 398
支持goto的观点 399
关于goto的虚假辩论 400
错误处理和goto 401
goto和在else子句中的共享代码 406
goto使用原则总结 407
17 4 对不常见控制结构的看法 408
其他资源 408
关键点 410
第18章 表驱动方法 411
18 1 表驱动方法使用总则 411
使用表驱动方法的两个问题 412
18 2 直接访问表 413
示例：一个月中的天数（days-in-month） 413
示例：保险费率 415
例子：灵活的消息格式（flexible-message-format） 416
构造查询键值 423
18 3 索引表访问（indexed access tables） 425
18 4 阶梯访问表 426
18 5 表查询的其他示例 429
关键点 430
第19章 一般控制问题 431
19 1 布尔表达式 432
用true和false做布尔判断 432
简化复杂的表达式 434
编写肯定形式的布尔表达式 436
用括号使布尔表达式更清晰 438
理解布尔表达式是如何求值的 439
writing numeric expressions in number-line order 441
按照数轴的顺序编写数值表达式 441
guidelines for comparisons to 0 442
与0比较的指导原则 442
common problems with boolean expressions 443
布尔表达式的常见问题 443
19 2 compound statements (blocks) 444
19 2 复合语句（块） 444
19 3 null statements 445
19 3 空语句 445
19 4 taming dangerously deep nesting 446
19 4 驯服危险的深层嵌套 446
summary of techniques for reducing deep nesting 454
对减少嵌套层次的技术的总结 454
19 5 a programming foundation: structured programming 455
19 5 编程基础：结构化编程 455
the three components of structured programming 455
结构化编程的三个组成部分 455
19 6 control structures and complexity 457
19 6 控制结构与复杂度 457
how important is complexity? 458
复杂度的重要性 458
general guidelines for reducing complexity 458
降低复杂度的一般原则 458
other kinds of complexity 460
其它类型的复杂度 460
checklist: control-structure issues 460
检查表：控制结构相关事宜 460
key points 461
关键点 461
译者序
这本书讲什么
《经典代码大全》这本书的原名叫《Classic Code Complete》，那么Classic Code Complete 在这里是何含义呢？首先，它不代表现代集成开发环境（IDE）中的代码自动补全功能，本书也不打算向您讲解Eclipse 或Visual Studio 2005 中的代码自动补全功能是如何实现的?。其次，Classic Code Complete 也不是真正的软件源代码“大全”的意思??，这本书既没有列出连接各种数据库的代码、也没有列出网页中常用的各种JavaScript 代码。书中的代码示例恐怕也不能直接copy&paste 代码到您自己的项目中。
那么Classic Code Complete 到底是什么意思？中译本为什么又要取名为“代码大全”呢？虽然从网上讨论的情况看，各位网友对书名含义的理解有出入，但是译者有充分的理由相信，Classic Code Complete 是“编码完成”的意思，是一个软件项目开发过程中的重要里程碑（milestone）。
软件项目进行到这里，表明已经完成了所有的编码工作，即将开始系统测试。
这本书讲的正是为了到达“编码完成”这一重要里程碑所必需的软件构建技术，确切地说，就是如何编写高质量的代码。作者认为，应该首先为人编写代码，其次才是为机器（第34 3 节）；代码主要是供人阅读的。遍布全书的提高代码质量的实实在在的技术和诀窍，是本书最有价值的部分。事实上，我们认为第6、7、10 至19 章这300 多页的内容是本书的精华内容，在其他书里恐怕很难找到如此详尽的对变量、语句、子程序等编程基本要素的讨论。
十多年前，本书第1 版以《代码大全》为名翻译出版，在过去的10 余年中，这本书影响了整整一代程序员，“代码大全”四个字已成为一个响当当的名字。鉴于此，本书第2版决定保留这个无伤大雅的“错误”，沿用“代码大全”作为书名，也借此向原书第1 版各位译者、修订者们的辛勤劳动表示我们的敬意。无论如何，对Classic Code Complete 的理解不会影响对整本书的理解。
本书除了讲如何构建高质量的软件，还讲如何成为一名优秀的程序员（第33 章“个人性格”、第4 3 节“你在技术浪潮中的位置”、第34 4 节“深入一门语言去编程”）。
前言
普通的软件工程实践与最优秀的软件实践差距巨大——多半比其他工程学科中的这种差距都要大。因此，传播优秀实践经验的工具是十分重要的。
—— Fred Brooks
我写这本书的首要目的，就是希望缩小本行业中一般商业实践与大师级人物及专家们之间的知识差距。许多强大的编程技术在被编程领域的大众接触之前，都已在学术论文和期刊里尘封了多年。
虽然近年来前卫的软件开发实践迅速发展，但普通的实践手段并没有太大变化。
很多程序的开发仍然是漏洞百出、迟于交付并且超出预算，还有很多根本就无法满足用户的需求。软件业界以及学术界的研究人员已经发现了不少行之有效的实践经验，足以解决自20 世纪70 年代以来编程领域中日益蔓延的大多数问题。可是这些实践经验很少在高度专业化的技术期刊之外对外发表，所以时至今日大多数编程的机构和组织还没能用上这些技术。有研究表明，一项研发成果从其诞生之日起，到进入商业实践阶段，通常要经历5 到15 年甚至更长的时间（Raghavan and Chand 1989；Rogers 1995；Parnas 1999）。这本手册就是想缩短这一漫长的过程，让那些关键性的研发成果现在就能为更多编程人员所用。
Who Should Read This Book
谁应当阅读本书
本书中所汇集的研究成果和编程经验，将帮助你创建更高质量的软件，使你能更快速地进行开发，遇到的问题更少。本书将帮你弄明白过去为什么会遇到那些问题，并告诉你如何在将来避免它们。这里所描述的编程实践将帮助你掌控更大型的项目，还能在项目的需求发生变动时帮助你成功地维护并修改已经开发出来的软件。
Experienced Programmers
经验丰富的程序员
对于经验丰富的程序员而言，本书正是他们想要的一本翔实、易用的软件开发指南。
本书关注的是“构建（construction）”，即整个软件生命周期中最为人熟知的部分；本书把强大的软件开发技术写得让自学的程序员和参加过正规训练的程序员都能读懂。