商家名称 | 信用等级 | 购买信息 | 订购本书 |
![]() |
Jolt大奖精选丛书:代码阅读(附光盘1张) [平装] | ![]() |
|
![]() |
Jolt大奖精选丛书:代码阅读(附光盘1张) [平装] | ![]() |
《Jolt大奖精选丛书:代码阅读》荣获2003年Jolt世界图书大奖,参阅《代码阅读》对于大专院校相关专业的师生、计算机领域的从业人员或稗序设计爱好者都大有裨益。
作者:(希腊)季奥米季斯?斯宾耐立思(Diomidis Spinellis) 译者:左飞 吴跃 杨宁
季奥米季斯?斯宾耐立思,自1985年开始,开发大量开创性的,并受到极高评价的商业和开源项目的过程中,一直在钻研、发展本书中所提及的各项技术,期间他编写和维护的代码行数超过25万行。他在英国伦敦帝国理工学院获得了软件式程方向的硕士学位及计算机科学博士学位。目前,他是希腊雅典经济与商业大学管理科学与技术系的教授。他曾撰写过多部畅销世界的计算机技术图书,包括《架构之美》、《代码质量》和《代码阅读》等。
左飞,技术作家、译者,著有《代码揭秘》、《数字图像处理原理与实践:基于Visual C++开发》等书。他在CSDN学生大本营上开设的主页非常受欢迎,多篇关于程序设计学习的系列文章在网络上广为流传。
吴跃,国家公务员,开源软件爱好者。他在信息安全方面有丰富的实践经验:他长期同本书原作者保持密切的纯来,深得Spinellis教授之意。除了本书之外,他还翻译了作者的另外一部著作《代码质最》。
原书序言
前言
第1章导论1
1.1为何以及如何阅读代码2
1.1.1将代码作为文献2
1.1.2将代码作为范例5
1.1.3维护6
1.1.4演进6
1.1.5重用8
1.1.6检查8
1.2如何阅读本书9
1.2.1排版约定9
1.2.2图表11
1.2.3练习12
1.2.4辅助材料13
1.2.5工具13
1.2.6提纲13
1.2.7关于“伟大语言”的争论14
进阶阅读15
第2章基本编程元素17
2.1一个完整的程序17
2.2函数和全局变量22
2.3while循环、条件和块26
2.4switch语句29
2.5for循环31
2.6break和continue语句34
2.7字符和布尔表达式36
2.8goto语句39
2.9局部重构41
2.10do循环和整数表达式46
2.11再论控制结构48
进阶阅读55
第3章高级C数据类型57
3.1指针57
3.1.1链式数据结构58
3.1.2数据结构的动态分配58
3.1.3引用调用59
3.1.4数据元素的访问60
3.1.5数组类型的参数和返回结果61
3.1.6函数指针63
3.1.7用做别名的指针65
3.1.8指针和字符串67
3.1.9直接内存访问69
3.2结构体70
3.2.1组合数据元素70
3.2.2从函数中返回多个数据元素71
3.2.3映射数据的组织方式71
3.2.4以面向对象方式编程73
3.3联合体75
3.3.1有效利用内存空间75
3.3.2实现多态76
3.3.3不同内部表征的访问77
3.4动态内存分配79
3.4.1空闲内存管理81
3.4.2包含动态分配数组的结构体83
3.5typedef声明85
进阶阅读87
第4章C数据结构89
4.1向量90
4.2矩阵和表94
4.3栈98
4.4队列100
4.5映射103
4.5.1散列表106
4.6集合108
4.7链表109
4.8树116
4.9图121
4.9.1节点存储122
4.9.2边的表示124
4.9.3边的存储127
4.9.4图的属性128
4.9.5隐含结构129
4.9.6其他表示方法129
进阶阅读130
第5章高级控制流程131
5.1递归131
5.2异常机制137
5.3并行性141
5.3.1硬件和软件的并行性142
5.3.2控制模型143
5.3.3线程实现148
5.4信号151
5.5非局部跳转154
5.6宏替换157
进阶阅读162
第6章应对大型项目163
6.1设计和实现技术163
6.2项目的组织165
6.3编译过程与makefile文件172
6.4配置179
6.5版本控制184
6.6项目专用工具191
6.7测试196
进阶阅读203
第7章编码规范和约定205
7.1文件的名称和组织206
7.2缩进208
7.3格式编排210
7.4命名约定213
7.5编程实践217
7.6过程规范219
进阶阅读220
第8章文档221
8.1文档类型221
8.2阅读文档222
8.3文档中存在的问题234
8.4其他文档来源236
8.5常见的开源文档格式239
进阶阅读245
第9章架构247
9.1系统结构248
9.1.1集中式存储库和分布式方法248
9.1.2数据流架构252
9.1.3面向对象结构254
9.1.4分层架构257
9.1.5层次260
9.1.6切片261
9.2控制模型263
9.2.1事件驱动系统263
9.2.2系统管理器266
9.2.3状态转移268
9.3元素包装270
9.3.1模块270
9.3.2命名空间272
9.3.3对象276
9.3.4泛型实现287
9.3.5抽象数据类型292
9.3.6库292
9.3.7进程和过滤器296
9.3.8组件297
9.3.9数据存储库299
9.4架构重用301
9.4.1框架301
9.4.2代码向导302
9.4.3设计模式303
9.4.4领域专有的架构305
进阶阅读308
第10章代码阅读工具311
10.1正则表达式312
10.2用编辑器浏览代码315
10.3用grep搜索代码317
10.4找出文件的差异325
10.5开发自用工具326
10.6借助编译器阅读代码329
10.7代码浏览器与美化器333
10.8运行时工具338
10.9非软件工具341
可用工具与进阶读物343
第11章完整示例345
11.1概况345
11.2攻克计划347
11.3代码重用348
11.4测试与调试354
11.5文档361
11.6观察报告362
附录A代码概要363
附录B源代码贡献者367
附录C代码阅读的箴言369
参考文献387
版权页:
插图:
在分析一个重要的程序时,最好先找出其最重要的部分。在本例中,这些部分是全局变量(图2—2:1)和函数main(图2—3)、getstops(见图2—5:1)以及usage(见图2—5:8)。
整型变量nstops和整型数组tabstops声明为全局变量,它们的作用域在函数体之外。因此,它们对于所分析文件中的所有函数都是可见的。
紧接着的三个函数声明声明了该文件内之后将出现的函数。由于其中的一些函数可能会在其定义之前使用,因此在C/C++程序中,这些声明允许编译器校验传递给函数的参数以及其返回值,并生成相应的正确代码。如果没有给出前置声明,那么C编译器会依据函数第一次被使用的情形来做出关于函数返回值类型和参数的假设;C++编译器将这种情况标记为错误。如果接下来的函数定义与这些假设不相符,那么编译器将给出一条警告或错误信息。然而,若定义于另一个文件中的函数匹配这个错误的声明,则该通过,程序或许能够编译,但是在运行时会失败。
值得注意的是,两个函数被声明为static,而变量没有。这就是说这两个函数仅仅在该文件中可见,而那些变量则有可能对组成该程序的所有文件都可见。因为expand仅由一个文件组成,所以这一差别在本例中并不重要。多数连接器(用来合并编译后的C文件)都十分原始,对所有程序文件都可见的那些变量(即没有被声明为static的变量),可能会与定义于其他文件中的同名变量进行让人吃惊的交互。因此,在审查代码时,最好确保所有只用于单个文件的变量都声明为static。
下面一起来看一下组成expand的函数。想要了解一个函数(或方法)在做什么,可以采用如下策略之一。
根据函数名猜测。
阅读函数开头的注释。
分析该函数是如何被使用的。
阅读函数体内的代码。
查询外部程序文档。
在本例中,可以很肯定地猜出函数usage将展示有关程序用法的信息然后退出;许多命令行程序都有与之具有同样功能和名称的函数。当你分析大量的代码时,你将会逐渐得出变量和函数的名称以及命名规范。这些将会帮助你正确的猜出它们的用途。然而,你应当做好准备,根据代码阅读过程中必然会出现的一些新证据来随时对最初的猜测做出修改。另外,基于猜测修改代码时,应当设计一个流程来验证最初的假设。这一流程可以包括用编译器检查、引入断言或执行恰当的测试用例。
getsopts的角色比较难于理解。这里没有任何注释,函数体中的代码比较复杂,其名称也可以多种方式解读。注意它被用在程序中一个单独的部分(图2—3:3),这可以帮助我们做进一步的分析。使用到getopt的部分在程序中负责处理程序选项(图2—3:2)。因此,可以肯定地(在本例中也是正确地)认为getopt将处理制表位说明选项。在阅读代码时,这种渐进式的理解较为常见;理解了某一部分的代码可以使得其他部分变得容易理解。基于这种渐进式的理解方式,在理解较为困难的代码时,可以采用类似组合拼图游戏时的策略:从容易的部分开始。
喜欢Jolt大奖精选丛书:代码阅读(附光盘1张) [平装]请与您的朋友分享,由于版权原因,读书人网不提供图书下载服务