
最 低 价:¥63.75
| Pete Goodliffe是一位软件开发专家,他在软件“食物链”上从未驻足不前。他在各种各样的项目中使用过许多种语言。他还在教授和指导程序员方面有着丰富的经验,并且常年为ACCU的C Vu杂志(www.accu.org)撰写栏目“编程的职业化”。Pete痴迷于编写出色的、没有错误的代码,这使得他有更多的时间与自己的孩子共度美好时光。 .. << 查看详细 |
| 《编程匠艺—编写卓越的代码》 第1篇 代码表面第一部分 第1章 善于防守:健壮代码的防御性编程技巧3 1.1 向优秀的代码前进3 1.2 设想:最坏的选择4 1.3 什么是防御性编程?6 1.4 又大又坏的世界8 1.5 防御性编程技巧9 1.5.1 使用好的编码风格和合理的设计9 1.5.2 不要仓促地编写代码9 1.5.3 不要相信任何人10 1.5.4 编码的目标是清晰,而不是简洁11 1.5.5 不要让任何人做他们不该做的修补工作11 1.5.6 编译时打开所有警告开关12 1.5.7 使用静态分析工具13 1.5.8 使用安全的数据结构13 1.5.9 检查所有的返回值14 1.5.10 审慎地处理内存(和其他宝贵的资源)14 1.5.11 在声明位置初始化所有变量15 1.5.12 尽可能推迟一些声明变量15 .1.5.13 使用标准语言工具15 1.5.14 使用好的诊断信息日志工具16 1.5.15 审慎地进行强制转换16 1.5.16 细则16 1.6 约束17 1.6.1 约束的内容19 1.6.2 移除约束19 1.7 总结22 1.8 另请参见22 1.9 思考24 1.9.1 深入思考24 1.9.2 结合自己24 第2章 精心布局:源代码的版面和样式26 2.1 什么是关键27 2.2 了解你的读者27 2.3 什么是好的样式29 2.4 使用括号30 2.4.1 k&r括号风格30 2.4.2 悬挂式的括号风格31 2.4.3 缩进的括号风格32 2.4.4 其他的括号风格33 2.5 主宰一切的风格33 2.6 内部风格(以及在哪里使用它们)35 2.7 设立标准37 2.8 正义的战争39 2.9 总结40 2.10 另请参见42 2.11 思考42 2.11.1 深入思考42 2.11.2 结合自己43 第3章 名正言顺:为有意义的事物起有意义的名称45 3.1 为什么我们应该恰当地命名呢47 3.2 我们对什么进行命名47 3.3 名字游戏48 3.3.1 描述性48 3.3.2 技术上正确48 3.3.3 符合语言习惯49 3.3.4 恰当49 3.4 具体细节50 3.4.1 命名变量51 3.4.2 命名函数52 3.4.3 命名类型53 3.4.4 命名名字空间54 3.4.5 命名宏55 3.4.6 命名文件56 3.5 玫瑰不叫玫瑰57 3.5.1 保持前后一致58 3.5.2 利用上下文58 3.5.3 使用对你有利的名称59 3.6 总结59 3.7 另请参见61 3.8 思考62 3.8.1 深入思考62 3.8.2 结合自己63 第4章 不言自明:编写“自文档化”代码的技巧64 4.1 自文档化的代码66 4.2 编写自文档化代码的技术69 4.2.1 使用好的样式编写简单的代码69 4.2.2 选择有意义的名称70 4.2.3 分解为原子函数70 4.2.4 选择描述性的类型71 4.2.5 命名常量71 4.2.6 强调重要的代码72 4.2.7 分组相关信息72 4.2.8 提供文件头72 4.2.9 恰当地处理错误73 4.2.10 编写有意义的注释73 4.3 实用的自文档化方法74 4.3.1 文学性编程74 4.3.2 文档化工具76 4.4 总结78 4.5 另请参见79 4.6 思考79 4.6.1 深入思考79 4.6.2 结合自己81 第5章 随篇注释:如何编写代码注释82 5.1 什么是代码注释83 5.2 注释看上去是什么样的84 5.3 多少注释是恰当的84 5.4 注释中应该有些什么85 5.4.1 解释为什么,而不是怎么样85 5.4.2 不要描述代码86 5.4.3 不要取代代码86 5.4.4 确保注释有用86 5.4.5 避免分心88 5.5 实践88 5.6 从审美的角度看注释89 5.6.1 一致性89 5.6.2 清晰的块注释90 5.6.3 缩进的注释90 5.6.4 行尾注释91 5.6.5 帮助你阅读代码91 5.6.6 选择一种维护成本较低的风格92 5.6.7 分隔板92 5.6.8 标志92 5.6.9 文件头注释93 5.7 使用注释94 5.7.1 帮助你编写例行程序94 5.7.2 错误修正通告95 5.7.3 注释过时95 5.7.4 维护和空洞无物的注释96 5.8 总结97 5.9 另请参见98 5.10 思考98 5.10.1 深入思考98 5.10.2 结合自己99 第6章 人非圣贤:处理不可避免的情况——代码中 的错误情形100 6.1 从何而来101 6.2 错误报告机制102 6.2.1 不报告103 6.2.2 返回值103 6.2.3 错误状态变量104 6.2.4 异常104 6.2.5 信号106 6.3 检测错误107 6.4 处理错误108 6.4.1 何时处理错误109 6.4.2 可能的反应110 6.4.3 代码示例112 6.5 使地狱浮现116 6.6 管理错误118 6.7 总结119 6.8 另请参见119 6.9 思考120 6.9.1 深入思考120 6.9.2 结合自己121 第2篇 代码的神秘生命第一部分 第7章 欲善其事,先利其器:使用工具构建软件125 7.1 什么是软件工具126 7.2 为什么要在意工具128 7.3 使工具发挥作用129 7.3.1 了解它能做些什么130 7.3.2 学习如何驾驭它130 7.3.3 了解它适合什么任务131 7.3.4 检查它是否可用131 7.3.5 找到了解更多信息的途径131 7.3.6 查明新版本何时出现132 7.4 哪个工具132 7.4.1 源代码编辑工具133 7.4.2 代码构建工具136 7.4.3 调试和调查工具138 7.4.4 语言支持工具140 7.4.5 其他工具141 7.5 总结142 7.6 另请参见143 7.7 思考144 7.7.1 深入思考144 7.7.2 结合自己145 第8章 测试时代:测试代码的魔术146 8.1 反思现实148 8.2 谁、是什么、何时以及为什么149 8.2.1 我们为什么要测试149 8.2.2 谁来进行测试150 8.2.3 测试的内容有些什么150 8.2.4 何时进行测试151 8.3 测试并不难……152 8.4 测试的类型156 8.5 选择单元测试用例160 8.6 为测试而设计163 8.7 看!不要用手164 8.8 面对故障该怎么办165 8.9 你能管理它吗166 8.9.1 缺陷跟踪系统166 8.9.2 bug审查168 8.10 总结169 8.11 另请参见169 8.12 思考170 8.12.1 深入思考170 8.12.2 结合自己171 第9章 寻找缺陷(调试):当事情进展得不顺利 时该怎么办172 9.1 生活的真相173 9.2 bug的种类174 9.2.1 从远处看174 9.2.2 从近处看175 9.2.3 从更近处看178 9.3 消灭害虫180 9.3.1 地下之路181 9.3.2 地上之路181 9.4 搜寻bug182 9.4.1 编译时错误182 9.4.2 运行时错误184 9.5 如何修正缺陷188 9.6 预防190 9.7 除蜂剂、驱虫剂、捕蝇纸190 9.7.1 调试器190 9.7.2 内存访问校验器191 9.7.3 系统调用跟踪191 9.7.4 内核转储191 9.7.5 日志191 9.8 总结192 9.9 另请参见193 9.10 思考194 9.10.1 深入思考194 9.10.2 结合自己194 第10章 代码构建:将源代码转换为可执行代码的过程196 10.1 语言障碍197 10.1.1 解释型语言198 10.1.2 编译型语言199 10.1.3 字节编译型语言200 10.2 小题大做201 10.3 构建软件版本203 10.4 怎样才算是一个优秀的构建系统206 10.4.1 简洁206 10.4.2 一致207 10.4.3 可重复和可靠207 10.4.4 原子性208 10.4.5 能够应付错误209 10.5 技术细节210 10.5.1 目标的选择210 10.5.2 内务处理212 10.5.3 依赖关系212 10.5.4 自动构建213 10.5.5 构建配置214 10.5.6 递归地使用make215 10.6 请发布我吧215 10.7 构建大师是全能的吗218 10.8 总结218 10.9 另请参见219 10.10 思考219 10.10.1 深入思考220 10.10.2 结合自己220 第11章 追求速度:优化程序和编写高效的代码222 11.1 优化是什么223 11.2 是什么使代码不尽如人意224 11.3 为什么不进行优化呢225 11.4 为什么要进行优化228 11.5 优化的具体细节229 11.5.1 证明你需要进行优化230 11.5.2 找出运行得最慢的代码230 11.5.3 测试代码232 11.5.4 优化代码233 11.5.5 优化之后233 11.6 优化的技术233 11.6.1 设计更改234 11.6.2 代码更改237 11.7 编写高效的代码241 11.8 总结243 11.9 另请参见244 11.10 思考244 11.10.1 深入思考244 11.10.2 结合自己245 第12章 不安全感综合征:编写安全的程序247 12.1 危险248 12.2 敌人250 12.3 借口,都是借口252 12.4 感到很脆弱253 12.4.1 不安全的设计和体系结构253 12.4.2 缓冲溢出254 12.4.3 嵌入的查询字符串255 12.4.4 竞争状况255 12.4.5 整数溢出256 12.5 防范措施257 12.5.1 系统安装技术258 12.5.2 软件设计技术258 12.5.3 代码实现技术260 12.5.4 规程技术261 12.6 总结261 12.7 另请参见262 12.8 思考263 12.8.1 深入思考263 12.8.2 结合自己263 第3篇 代码的形成过程第一部分 第13章 崇尚设计:如何创作出优秀的软件设计267 13.1 边设计边编程268 13.2 我们要设计什么269 13.3 为什么这么忙乱270 13.4 良好的软件设计271 13.4.1 简洁272 13.4.2 优雅273 13.4.3 模块化274 13.4.4 良好的接口275 13.4.5 可扩展性278 13.4.6 避免重复278 13.4.7 可移植性279 13.4.8 符合语言习惯280 13.4.9 良好地文档化280 13.5 如何设计代码280 13.5.1 设计方法和过程281 13.5.2 设计工具282 13.6 总结285 13.7 另请参见285 13.8 思考286 13.8.1 深入思考286 13.8.2 结合自己287 第14章 软件体系结构:奠定软件设计的基础288 14.1 什么是软件体系结构289 14.1.1 软件蓝图289 14.1.2 视图290 14.1.3 在何时和何处进行体系结构设计292 14.1.4 用体系结构来做什么293 14.1.5 关于组件和连接294 14.2 什么是良好的体系结构295 14.3 体系结构风格297 14.3.1 没有体系结构297 14.3.2 分层的体系结构298 14.3.3 管道和过滤器体系结构299 14.3.4 客户端/服务器体系结构299 14.3.5 基于组件的体系结构302 14.3.6 框架303 14.4 总结303 14.5 另请参见304 14.6 思考305 14.6.1 深入思考305 14.6.2 结合自己305 第15章 改良与革命:代码是如何成长的307 15.1 软件腐烂308 15.2 警告信号310 15.3 代码是如何成长的312 15.4 相信不可能之事315 15.5 对此我们可以做些什么?316 15.5.1 编写新代码316 15.5.2 维护现有代码317 15.6 总结319 15.7 另请参见319 15.8 思考320 15.8.1 深入思考321 15.8.2 结合自己321 第4篇 “一群”程序员第一部分 第16章 代码猴子:培养正确的编程态度和方法325 16.1 各种各样的猴子326 16.1.1 卖力工作的程序员327 16.1.2 代码猴子328 16.1.3 权威329 16.1.4 半权威330 16.1.5 傲慢的天才331 16.1.6 牛仔333 16.1.7 规划者334 16.1.8 老前辈335 16.1.9 狂热者336 16.1.10 单线条程序员337 16.1.11 拖沓者338 16.1.12 勉强的团队领导339 16.1.13 你340 16.2 理想的程序员340 16.3 那么该怎么办341 16.4 最愚蠢的人342 16.5 总结343 16.6 另请参见343 16.7 行为表格344 16.8 思考345 16.8.1 深入思考345 16.8.2 结合自己345 第17章 团结就是力量:团队合作与个人程序员347 17.1 我们的团队——概览348 17.2 团队组织350 17.2.1 管理方法350 17.2.2 责任划分350 17.2.3 组织和代码结构352 17.3 团队合作工具352 17.4 团队疾病354 17.4.1 巴别塔354 17.4.2 独裁制356 17.4.3 民主制357 17.4.4 卫星站359 17.4.5 大峡谷361 17.4.6 流沙363 17.4.7 旅鼠365 17.5 良好团队合作的个人技巧和特点366 17.5.1 沟通366 17.5.2 谦虚367 17.5.3 处理冲突367 17.5.4 学习和适应能力369 17.5.5 了解你的不足之处369 17.6 团队合作原则370 17.6.1 集体代码所有制370 17.6.2 尊重别人的代码371 17.6.3 编码准则371 17.6.4 定义成功371 17.6.5 定义责任372 17.6.6 避免倦怠372 17.7 团队的生命周期372 17.7.1 团队的创建373 17.7.2 团队的成长375 17.7.3 团队合作377 17.7.4 团队结束377 17.8 总结380 17.9 另请参见381 17.10 行为表格382 17.11 思考383 17.11.1 深入思考383 17.11.2 结合自己383 第18章 安全措施:源代码控制与自我控制385 18.1 我们的责任386 18.2 源代码控制387 18.2.1 修订控制388 18.2.2 访问控制390 18.2.3 处理代码库390 18.2.4 在代码树上创建分支391 18.2.5 源代码控制简史393 18.3 配置管理393 18.4 备份395 18.5 发布源代码396 18.6 应该将源代码放在哪里397 18.7 总结398 18.8 另请参见399 18.9 思考400 18.9.1 深入思考400 18.9.2 结合自己400 第5篇 开发过程的组成部分第一部分 第19章 注意细节:编写软件规范403 19.1 规范到底是什么404 19.2 规范的类型405 19.2.1 需求规范407 19.2.2 功能规范409 19.2.3 系统体系结构规范410 19.2.4 用户界面规范410 19.2.5 设计规范411 19.2.6 测试规范412 19.3 规范应当包含哪些内容413 19.4 规范编写过程415 19.5 我们为什么会不编写规范418 19.6 总结420 19.7 另请参见420 19.8 思考421 19.8.1 深入思考421 19.8.2 结合自己421 第20章 代码审查:执行代码审查423 20.1 什么是代码审查424 20.2 何时进行审查425 20.2.1 是否要进行审查426 20.2.2 审查哪些代码427 20.3 执行代码审查427 20.3.1 代码审查会议428 20.3.2 集成审查431 20.4 审查你的态度432 20.4.1 作者的态度432 20.4.2 审查人员的态度433 20.5 完美的代码434 20.6 代码审查之外435 20.7 总结436 20.8 另请参见436 20.9 清单437 20.10 思考438 20.10.1 深入思考438 20.10.2 结合自己438 第21章 时间估计:软件时间范围估计的魔术439 21.1 在黑暗中摸索440 21.2 为什么估计这么困难441 21.3 压力之下443 21.4 实用的估计方法444 21.5 计划游戏447 21.6 坚持451 21.7 总结454 21.8 另请参见454 21.9 思考455 21.9.1 深入思考455 21.9.2 结合自己455 第6篇 从高处鸟瞰第一部分 第22章 程序秘方:代码开发的方法和过程459 22.1 编程风格460 22.1.1 结构化编程461 22.1.2 面向对象的程序设计462 22.1.3 函数式编程463 22.1.4 逻辑编程464 22.2 烹饪方法:做什么与怎样做464 22.3 开发过程465 22.3.1 混乱466 22.3.2 瀑布模型468 22.2.3 ssadm和prince470 22.3.4 v模型470 22.3.5 原型设计471 22.3.6 迭代和增量开发472 22.3.7 螺旋模型473 22.3.8 敏捷的方法474 22.3.9 其他开发过程475 22.4 已经够了476 22.5 选择一种过程477 22.6 总结478 22.7 另请参见478 22.8 思考479 22.8.1 深入思考479 22.8.2 结合自己479 第23章 编程领域大观:不同的编程分支481 23.1 应用程序编程482 23.1.1 塑装软件483 23.1.2 定制应用程序484 23.2 游戏编程485 23.3 系统编程486 23.4 嵌入式编程488 23.5 分布式编程490 23.6 网络应用程序编程492 23.7 企业编程494 23.8 数字编程495 23.9 那又怎样497 23.10 总结497 23.11 另请参见498 23.12 思考498 23.12.1 深入思考499 23.12.2 结合自己499 第24章 下一步呢:结果好就一切都好500 但下一步该做什么呢?501 答案和讨论504 参考书目607 |
商品评论(0条)