经典代码大全


经典代码大全

文章插图
经典代码大全【经典代码大全】代码大全(第二版)是着名it畅销书作者steve mcconnell十一年前的经典着作的全新演绎:第二版不是第一版的简单修订增补 , 而是完全进行了重写;增加了很多与时俱进的内容 。
基本介绍书名:经典代码大全
作者:(美)Steve McConnell
原版名称:CODE COMPLETE, Second Edition
译者:金戈 汤凌 陈硕 张菲
ISBN:7121022982
页数:960
出版社:Microsoft Press;电子工业出版社
出版时间:2006 年3月
开本:16开
版次:2-3
编辑推荐被china-pub会员评为“2007年我最喜爱的十大技术图书”之一被《程式设计师》等机构评选为2006年最受读者喜爱的十大IT图书之一是着名IT畅销书作者Steve McConnell十一年前的经典着作的全新演绎 , 该作者是两届Software Development Magzine Jolt Award震撼大奖得主内容简介这也是一本完整的软体构建手册 , 涵盖了软体构建过程中的所有细节 。它从软体质量和编程思想等方面论述了软体构建的各个问题 , 并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念 , 还含有丰富而典型的程式示例 。本书中所论述的技术不仅填补 了初级与高级编程技术之间的空白 , 而且也为程式设计师们提供了一个有关编程技巧的信息来源 。本书对经验丰富的程式设计师、技术带头人、自学的程式设计师及几乎不懂太多编程技巧的学生们都是大有裨益的 。可以说 , 无论你是什幺背景 , 阅读本书都会让你在更短的时间内、更容易地写出更好的程式 。代码大全是我早在好几年前便已经阅读过的好书 。这几年来我不知买过多少书籍 , 也清理过许多因为书房再也放不下的书籍 , 但是代码大全这本书始终占据着我书架上重要的位置而不曾移开过 , 因为好书是经得起时光考验的 。—— 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章 欢迎进入软体构建的世界 31 1 什幺是软体构建? 31 2 软体构建为何如此重要? 61 3 如何阅读本书 8关键点 8第2章 用隐喻来更充分地理解软体开发 92 1 隐喻的重要性 92 2 如何使用软体隐喻 112 3 常见的软体隐喻 13软体中的书法:写作代码 13软体的耕作法:培植系统 14软体的牡蛎养殖观点:系统生长 15软体构建:建造软体 16套用软体技术:智慧工具箱 20组合各个隐喻 20更多资源 20关键点 21第3章 三思而后行:前期準备 233 1 前期準备的重要性 24前期準备适用于现代软体项目吗? 25準备不周全的诱因 25关于开始构建之前要做前期準备的绝对有力且简明的论据 273 2 辨明你所从事的软体的类型 31叠代开发法对前期準备的影响 33在序列式开发法和叠代式开发法之间做出选择 353 3 问题定义的先决条件 363 4 需求的先决条件 38为什幺要有正式的需求? 38稳定需求的神话 39在构建期间处理需求变更 403 5 架构的先决条件 43架构的典型组成部分 453 6 花费在前期準备上的时间长度 55更多资源 56关键点 59第4章 关键的“构建”决策 614 1 选择程式语言 61语言描述 634 2 编程约定 664 3 你在技术浪潮中的位置 66“深入一种语言去编程”的例子 684 4 选择主要的构建实践方法 69关键点 70第5章 软体构建中的设计 735 1 设计中的挑战 74设计是一个险恶的问题 74设计是个了无章法的过程(即使它能得出清爽的成果) 75设计就是确定取捨和调整顺序的过程 76设计受到诸多限制 76设计是不确定的 76设计是一个启发式过程 76设计是自然而然形成的 765 2 关键的设计概念 77软体的首要技术任务:管理複杂度 77理想的设计特徵 80设计的层次 825 3 设计构造块:启发式方法 87寻找现实世界中的对象 87形成一致的抽象 89封装实现细节 90当继承能简化设计时就继承 91隐藏秘密(信息隐藏) 92找出容易改变的区域 97保持鬆散耦合 100查阅常用的设计模式 103其他的启发式方法 105关于设计启发的总结***** 108使用启发式方法的原则 1095 4 设计实践 110叠代 110分而治之 111自上而下和自下而上的设计方法 111建立试验性原型 114合作设计 115要做多少设计才够? 115记录你的设计成果 1175 5 对流行的设计方法的评论 118更多资源 119软体设计 , 一般性问题 119软体设计理论 120设计模式 120广义的设计 121标準 122关键点 122第6章 可以工作的类 1256 1 类的基础:抽象数据类型 126需要用到adt的例子 126 使用adt的益处 127更多的adt示例 129在非面向对象环境中用adt处理多份数据实例 131adt和类 1336 2 良好的类接口 133好的抽象 133良好的封装 1396 3 有关设计和实现的问题 143包含(“有一个……”的关係) 143继承(“是一个……”关係) 144成员函式和数据成员 150构造函式 1516 4 创建类的原因 152应该避免的类 155总结:创建类的理由 155与具体程式语言相关的问题 1566 6 超越类:包 156更多资源 159关键点 160第7章 高质量的子程式 1617 1 创建子程式的正当理由 164似乎过于简单而没必要写成子程式的操作 166总结:创建子程式的理由 1677 2 在子程式层上设计 1687 3 好的子程式名字 1717 4 子程式可以写多长 1737 5 如何使用子程式参数 1747 6 使用函式时要特别考虑的问题 181什幺时候使用函式 , 什幺时候使用过程 181设定函式的返回值 1827 7 宏子程式和内联子程式 182宏子程式在使用上的限制 184内联子程式 184关键点 186第8章 防範式编程 1878 1 保护程式免遭无效输入数据的破坏 1888 2 断言 189建立自己的断言机制 191使用断言的指导建议 1918 3 错误处理技术 194健壮性与正确性 197高层次设计对错误处理方式的影响 1978 4 异常 1988 5 隔离程式以免遭由错误造成的损害 203隔离区与断言的关係 2058 6 辅助调试代码 205不要自动地把产品版本的限制强加于开发版本之上 205儘早引入辅助调试的手段 206採用冒进式编程 206计画移除调试辅助代码 2068 7 确定在产品代码中该保留多少防範式代码 2098 8 防範式编程时保持防範 210其他资源 212关键点 213第9章 伪代码编程过程 2159 1 创建类和子程式的步骤概述 216创建一个类的步骤 216创建子程式的步骤 2179 2 伪代码 2189 3 通过伪代码编程过程创建子程式 220设计子程式 225编写子程式 225检查代码 230收尾工作 232根据需要重複上述步骤 2329 4 伪代码编程过程之外的其他方案 232关键点 234第10章 使用变数的一般事项 237 10 1 数据认知 238数据认知测试 238有关数据类型的其他资源 23910 2 轻鬆掌握变数定义 239隐式声明 23910 3 变数初始化原则 24010 4 作用域 244使变数引用局部化 245儘可能缩短变数的“存活”时间 246减小作用域的一般原则 249有关缩小变数作用域的说明 25010 5 持续性 25110 6 绑定时间 25210 7 数据类型和控制结构之间的关係 25410 8 为变数指定单一用途 255关键点 258第11章 变数名的力量 25911 1 选择好变数名的注意事项 259最重要的命名注意事项 260以问题为导向 261最适当的名字长度 262变数名字的效果範围 262变数名字中的计算值限定词 263变数名字中的常用反义词 26411 2 为特定类型的数据命名 264为循环索引命名 265为状态变数命名 266为临时变数命名 267为布尔变数命名 268为枚举类型命名 269为常量命名 27011 3 命名规则的力量 270为什幺要有规则? 270何时採用命名规则 271正式程度 27111 4 非正式命名规则 272语言无关规则的指导原则 272语言相关规则的指导原则 275混合语言编程的注意事项 276命名规则示例 27611 5 标準前缀 279用户自定义类型缩写 279语义前缀 280标準前缀的优点 28111 6 创建具备可读性的短名称 282一般的缩写指导原则 282语音缩写 282有关缩写的评论 28211 7 应该避免的名称 285关键点 289第12章 基本数据类型 29112 1 使用数的普遍规则 29212 2 整数 29312 3 浮点数 29512 4 字元和字元串 297c中的字元串 29912 5 布尔变数 30112 6 枚举类型 303如果你的语言里没有枚举类型 30712 7 命名常量 30712 8 数组 31012 9 创建你自己的类型(类型别名) 311为什幺创建自己的类型的示例是用pascal和ada写的? 314创建自定义数据类型的指导原则 315关键点 318第13章 不常见的数据类型 31913 1 结构 31913 2 指针 323用来理解指针的例子 323使用指针的一般技巧 325c++指针 332c指针 33413 3 全局数据 335与全局数据有关的常见问题 335 使用全局数据的理由 338只有万不得已时才使用全局数据 339用访问子程式来取代全局数据 339如何降低使用全局数据的风险 342其他资源 343关键点 344第14章 组织直线型代码 34714 1 必须有明确顺序的语句 34714 2 顺序无关的语句 351使代码易于自上而下的阅读 351把相关的语句组织在一起 352关键点 353第15章 使用条件语句 35515 1 if语句 355简单if-then语句 355if-then-else语句串 35815 2 case语句 361为case选择最有效的排序 361使用case语句的提示 361关键点 366第16章 控制循环 36716 1 选择循环的种类 367什幺时候使用while循环 368什幺时候用带退出的循环 369何时使用for循环 372何时使用foreach循环 37216 2 循环控制 373进入循环 373处理好循环体 375退出循环 377检查端点 381使用循环变数 382循环应该有多长? 38516 3 轻鬆创建循环——由内而外 38516 4 循环和数组的关係 387关键点 389第17章 不常见的控制结构 39117 1 子程式中的多个返回 39217 2 递归 393递归的例子 394使用递归的技巧 39617 3 goto 398反对goto的论点 398支持goto的观点 399关于goto的虚假辩论 400错误处理和goto 401goto和在else子句中的共享代码 406goto使用原则总结 40717 4 对不常见控制结构的看法 408其他资源 408关键点 410第18章 表驱动方法 41118 1 表驱动方法使用总则 411使用表驱动方法的两个问题 41218 2 直接访问表 413示例:一个月中的天数(days-in-month) 413示例:保险费率 415例子:灵活的讯息格式(flexible-message-format) 416构造查询键值 42318 3 索引表访问(indexed access tables) 42518 4 阶梯访问表 42618 5 表查询的其他示例 429关键点 430第19章 一般控制问题 43119 1 布尔表达式 432用true和false做布尔判断 432简化複杂的表达式 434编写肯定形式的布尔表达式 436用括弧使布尔表达式更清晰 438 理解布尔表达式是如何求值的 439writing numeric expressions in number-line order 441按照数轴的顺序编写数值表达式 441guidelines for comparisons to 0 442与0比较的指导原则 442common problems with boolean expressions 443布尔表达式的常见问题 44319 2 compound statements (blocks) 44419 2 複合语句(块) 44419 3 null statements 44519 3 空语句 44519 4 taming dangerously deep nesting 44619 4 驯服危险的深层嵌套 446summary of techniques for reducing deep nesting 454对减少嵌套层次的技术的总结 45419 5 a programming foundation: structured programming 45519 5 编程基础:结构化编程 455the three components of structured programming 455结构化编程的三个组成部分 45519 6 control structures and complexity 45719 6 控制结构与複杂度 457how important is complexity? 458複杂度的重要性 458general guidelines for reducing complexity 458降低複杂度的一般原则 458other kinds of complexity 460其它类型的複杂度 460checklist: control-structure issues 460检查表:控制结构相关事宜 460key 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)” , 即整个软体生命周期中最为人熟知的部分;本书把强大的软体开发技术写得让自学的程式设计师和参加过正规训练的程式设计师都能读懂 。