首页>参考读物>计算机科学与技术>综合

重构(Ruby版)
作者 : (美)Jay Fields,Shane Harvie,Martin Fowler 著
译者 : 徐旭铭 译
出版日期 : 2010-04-21
ISBN : 978-7-111-30078-6
定价 : 49.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 310
开本 : 16
原书名 : Refactoring: Ruby Edition
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是一本专门为职业Ruby程序员编写的重构指导。它的目标是向你展示如何以一种既受到严格控制又高效的方式进行重构。你将学习到不在代码中引入bug并能按部就班改进结构的重构方式。本书的主要内容:第1章指出重构是什么;第2章讨论进行重构的理由;第3章指出需要进行重构的信号;第4章讨论测试在重构中扮演的重要角色;第5章~第12章介绍了重构花名册,它包含了在重构领域里到目前为止的成果。当需要进行某项任务时,这份花名册可以手把手地提醒我们安全的做法。

图书特色

经典图书新版 以Ruby语言为实例
重构(Ruby版)
(美)Jay Fields
Shane Harvie
Martin Fowler 等著
徐旭铭 译

本书是对Martin Fowler的经典权威著作《重构》的重大更新版,并以Ruby为例彻底重写——并非只是把代码从Java版中搬过来而已。
书中给出了一份详细的重构花名册,包含超过70条经过锤炼的Ruby重构技术,每一条都有详细指引、使用细节和范例代码。其中很多重构技术都用到了Ruby专有的强大特性,你可以从华章网站下载到全部代码。
作者借用Fowler最初的想法,展示了如何以一种受控、高效以及迭代的方式进行重构,帮助你有条不紊地改善代码的质量而不会引入新的bug。不论是编写还是维护Ruby代码,本书都将是不可或缺的重要参考。

本书内容
理解重构的核心原则,以及进行重构的原因
发现Ruby代码中的“坏味道”
逐步将糟糕的设计转变成设计精良的代码
构建测试以便保证重构正确进行
理解重构中的难点以及克服的办法
编写正确包装代码的方法
在对象之间移动特性,将其放在最适合的地方
将数据组织成更容易处理的形式
简化条件表达式,更高效地利用多态
创建更易于理解和使用的接口
进行大型重构,这将可能影响整个软件系统数月乃至数年
成功重构Ruby on Rails代码

作者简介
Jay Fields 是DRW Trading公司的一名软件程序员,也是一位研讨会的常客。Jay对发现和成熟化创新式解决方案总是抱有激情。Jay的个人网站是:www.jayfields.com。
Shane Harvie 在美国、印度和澳大利亚等国的敏捷公司中从事软件开发工作。他现在位于芝加哥的DRW Trading公司工作,个人网站是:www.shaneharvie.com。
Martin Fowler 是ThoughtWorks公司的首席科学家,他是一位作家、演说家和咨询师,经常在软件开发活动中发表演讲。他关注的是企业软件设计——诸如什么能产生良好的设计,而良好的设计又需要哪些实践等。他是面向对象技术、重构、模式、敏捷方法论、领域建模、统一建模语言(UML)和极限编程的先行者。近十年来他一直在ThoughtWorks公司工作,这是一家非常出色的系统开发和咨询公司。

图书前言

差不多十年前,我(Martin)曾经和Kent Beck一起做过一个项目。这个项目的名字叫C3,它后来成为极限编程诞生的标志性项目,并帮助我们看清了敏捷软件运动的方向。
  我们从那个项目里学到了很多东西,不过真正震撼到我的是Kent那种有条不紊、持续不断改进系统设计的风格。一直以来我对编写干净的代码都抱有极大的热情,坚信花时间去清理有问题的代码,以便让团队能更快捷地开发功能是非常有价值的事情。而Kent向我介绍了一种很多顶尖Smalltalk程序员使用的技术,它能让我的工作效率成倍提升。这是一种他们称之为重构的技术,我很快就变得想要在任何场合下都把它介绍给别人。但是市面上没有任何出版物或是类似的资源可以让我指引人们去自己学习这项技术。既然Kent和其他Smalltalk程序员都没意愿要写一本,所以我就决定自己动手了。
  结果我的那本《重构》大受欢迎,在重构成为主流技术的过程中看起来还扮演了相当重要的角色。随着近年来Ruby的兴起,给这本书写一本Ruby版是很有意义的,为此我拉来了Jay和Shane。
什么是重构
  重构是改变软件系统的过程,它不会改变代码的外部行为,但是可以改善其内部结构。它清理代码的严谨方式能把引入bug的风险降至最低。基本上当你进行重构的时候,就意味着代码的设计在完成时会得到改善。
  很多人觉得“代码的设计在完成时会得到改善”这种说法相当古怪。多年来大多数人都相信设计第一、编码第二的原则。而随着时间的推移,不断修改代码以及系统的完整性后,原本设计的结构也会慢慢变得模糊。代码逐渐从一项工程活动沦落为敲敲打打的修补工作。
  重构与此正好相反。有了重构,你可以把一个糟糕甚至混乱的设计,逐渐转变成设计良好的代码。每一个步骤都非常简单,甚至有点过分简单了。比如把一个实例变量从一个类移到另一个类,从一个方法里抽出一些代码单独放到一个方法里去,以及在层次体系之间移动一些代码等。但是这些小改动累积起来却能够彻底改进设计。这和通常认为的软件衰败论的观念是完全相反的。
  在重构的时候你会发现工作的重心发生了变化。设计不再是最先进行,而是在开发过程中不断进行的。你会从构建系统中学习到如何改进设计。这种交互能让程序的设计随着开发工作的进行一直保持在较好的水准上。
本书的内容
  本书是一本专门为职业Ruby程序员编写的重构指导。我们的目标是要向你展示怎样以一种受到严格控制同时又高效的方式来进行重构。你会学习到不在代码里引入bug并能按部就班地改进结构的重构方式。
  通常一本书都是以介绍来开头的。虽然我对此并无异议,但是我发现要用泛泛而谈或是抽象的定义来介绍重构并不容易。所以我们还是先举个例子吧。第1章会给出一个包含了常见设计错误的小程序,然后将它重构成一个比较能让人接受的面向对象程序。我们会看到重构过程以及好几种重构技术的应用。如果你想要理解重构究竟是什么,那就绝对不能错过这一章。
  在第2章里,我们讨论了重构中一些普遍的原则、定义,以及进行重构的理由。我们还会讲到重构里存在的一些问题。在第3章里,Kent Beck会讲解如何在代码里寻找坏味道,以及如何通过重构来清理它们。测试在重构中扮演着非常重要的角色,因此第4章会讨论如何通过一个简单的测试框架将测试织入代码中去。
  第5章~第12章覆盖了重构的花名册,这也是本书的精华所在。这并非一份完整的花名册,只能说是花名册的一部分。它包含了我们在重构这个领域里到目前为止的成果。当我们需要进行某项任务,比如说用多态替换条件逻辑的时候,这份花名册可以手把手地提醒我们安全的做法。我们希望你经常回来翻阅这些章节。
Ruby中的重构
  在编写《重构》第1版的时候,我选择了Java来展示这项技术,这主要是因为当时Java是一门非常热门的语言。其实绝大多数重构技术并不局限于任何语言,所以很多人读过第1版以后将重构带到了Java以外的世界。
  不过使用最顺手的语言来学习重构显然是非常有帮助的。现在有很多人都在学习Ruby语言,而重构又是Ruby文化中的一个核心部分,所以我们觉得有必要为Ruby爱好者提供一种学习重构的方法——特别是对那些没有使用大括号语言背景的人。


此处指Java/C/C++系的语言。——译者注

  Jay和Shane承担了这项工作,从头到尾审阅本书的第1版,并把它改成Ruby的风格。他们仔细阅读了原文,去掉所有Java风格的东西,然后用Ruby的方式重新组织上下文。他们都是资深的Ruby程序员,同时又有深厚的Java和C#背景,因此这项工作由他们来做真是再适合不过了。
  他们还添加了一些Ruby特有的重构技术。虽然我们在前面说过:绝大多数情况下,重构对任何面向对象语言来说都是一样的,但是仍然会有一些特别的东西是某些语言专有的情况。
谁该阅读本书
  本书的目标读者是专业程序员,也就是那些靠写软件吃饭的人。书中的例子和讨论包含了大量需要阅读和理解的代码。
  虽然重构的焦点是代码,但是它对系统的设计也会产生巨大的影响。因此资深设计师和架构师也有必要理解重构的理念并且在项目中使用它们。重构最好是由有威望的资深开发人员来进行。这样的开发人员能够更好地理解重构背后的思想,并将它们应用于具体的工作场景。
  如果不想通读,这里列出了本书的大纲。
  ■ 如果你想知道什么是重构,请阅读第1章;其中的例子应该能让你了解它的流程。
  ■ 如果你想知道为什么要进行重构,请阅读前两章。它们会告诉你什么是重构,以及为什么应该进行重构。
  ■ 如果你想知道应该在哪里进行重构,请阅读第3章。它会告诉你哪些是提示你需要进行重构的标志。
  ■ 如果你想要实际进行重构,请完整地阅读前4章。然后浏览花名册,只要了解它的大概内容即可,你不用理解所有的细节。当你真的需要进行重构的时候,再去仔细阅读相关的内容也不迟。花名册是一份参考目录,所以用不着一口气读完。
  我们在编写本书时假设你从来没有遇到过重构,也没有读过本书的第1版,因此你可以把本书当做是对这个主题的完整介绍。你可以凭自己的语言喜好,选择本书或是原书第1版。
我有第1版——还需要再买这本吗
  大概用不着。如果你对第1版很熟悉,那么本书不会给你提供多少新内容。虽然在使用这些重构技术的时候需要转换到Ruby语言上来,但要是你和我们一样,这应该不算什么太困难的事情。
  但是基于以下两点原因,我们觉得第1版的拥有者可以考虑买下这本Ruby版。第一个原因是你不太熟悉Java语言,而又觉得这种陌生让你在阅读第1版的时候觉得很吃力。如果这样,我们希望这本Ruby版会稍微简单一点。其次就是如果你正在领导一个Ruby团队,而团队里有人不适应第1版里的Java,在这种情况下,这本专为Ruby编写的书可能更能帮助你们理解重构。
站在前人的肩膀上
  有时候别人会称我(Martin)为“重构之父”。这时我总是会婉拒这个称谓,虽然我的书确实帮助重构流行了起来,但是它绝对不是我的发明创造。我的工作主要都是构建在那些来自Smalltalk社区的顶尖高手之上的。
  重构社区里的两位顶尖程序员是Ward Cunningham和Kent Beck。他们很早就将重构视为开发过程中的一个核心组成部分,并将它们运用到自己的工作中。特别是和Kent的合作真正让我领略到了重构的重要性,这也直接激发了我编写本书的灵感。
  Ralph Johnson在伊利诺伊大学香槟分校领导的一支团队以其对对象技术做出的一系列实际贡献而久负盛名。Ralph很早就是重构的拥护者,他的几个学生也一直致力于研究这个课题。Bill Opdyke在他的博士论文里第一次详细论述了重构技术。John Brant和Don Roberts则开发出了全世界第一款自动化重构工具:Smalltalk重构浏览器。
  自从我的书出版以来,很多人发展出了各种重构技术。工具领域更是出现了爆炸性的成长。任何专业的IDE现在都得有一个“重构”菜单才像样,而很多人现在也已经把重构当成是他们开发工具里必不可少的一个部分了。这里我们要着重说明的是,虽然工具会让重构变得更简单,但是就算没有工具你也一样可以有效地进行重构。
Ruby版制作花絮
  人们总是想知道一本书是怎么制作出来的,特别是多人合著的时候。
  Martin在1997年初就开始了《重构》第1版的编写工作。他记录下编程时进行重构的情况,这样一来这些笔记就可以提醒他如何高效地进行某种重构(这也是本书的主干)。这本书自1999年出版以来,销售成绩一直都很稳定——每年都能卖出一万五千多本。
  2006年的时候Jay找到了Martin,说是想写一本Ruby版。Jay找了不少人来帮忙,其中Shane的贡献最大,并很快就成为了主要作者之一。Martin的写作重心当时在别的项目上,因此他在这一版里没有太多地参与,不过我们还是把他的名字留在了封面上,毕竟第一稿是由他提供的,其中很多内容都在这一版里保留了下来。
作者简介
  Jay Fields是DRW Trading的一名软件程序员,也是一位研讨会的常客。Jay对发现和成熟化创新式解决方案总是抱有激情。Jay的个人网站是wwwjayfieldscom。
  Shane Harvie在美国、印度和澳大利亚等地的敏捷环境里开发了很多软件。他现在位于芝加哥的DRW Trading公司工作,博客网址是wwwshaneharviecom。
  Martin Fowler是ThoughtWorks的首席科学家,他是一位作家、演说家和咨询师,在软件开发活动中经常发表演讲。他关注的是企业软件设计——诸如什么能产生良好的设计,而良好的设计又需要哪些实践等。他是面向对象技术、重构、模式、敏捷方法论、领域建模、统一建模语言(UML)和极限编程的先行者。过去十年来他一直在为ThoughtWorks工作,这是一家非常出色的系统开发和咨询公司。

上架指导

计算机\程序设计

封底文字

本书是对Martin Fowler的经典权威著作《重构》的重大更新版本,并以Ruby为例彻底重写——并非只是把代码从Java版中搬过来而已。
书中给出了一份详细的重构花名册,包含超过70条经过锤炼的Ruby重构技术,每一条都有详细指引,使用细节和范例代码。其中很多重构技术都用到了Ruby专有的强大特性,你可以从网站下载到全部代码。
作者借用了Fowler最初的想法,展示了如何以一种受控、高效以及迭代的方式进行重构,帮助你有条不紊地改善代码的质量而不会引入新的bug。不论是编写还是维护Ruby代码,本书都将是不可或缺的重要参考。

本书可以帮助你:
q 理解重构的核心原则,以及进行重构的原因
q 发现Ruby代码中的“坏味道”
q 逐步将糟糕的设计转变成设计精良的代码
q 构建测试以便保证重构正确进行
q 理解重构中的难点以及克服的办法
q 编写正确包装代码的方法
q 在对象之间移动特性,将其放在最适合的地方
q 将数据组织成更容易处理的形式
q 简化条件表达式,更高效地利用多态
q 创建更易于理解和使用的接口
q 进行大型重构,这将可能影响整个软件系统数月乃至数年
q 成功重构Ruby on Rails代码

作者简介

(美)Jay Fields,Shane Harvie,Martin Fowler 著:Jay Fields是DRW Trading公司的一名软件程序员,也是一位研讨会的常客。Jay对发现和成熟化创新式解决方案总是抱有激情。Jay的个人网站是:www.jayfields.com。 Shane Harvie在美国、印度和澳大利亚等国的敏捷公司中从事软件开发工作。他现在位于芝加哥的DRW Trading公司工作,个人网站是:www.shaneharvie.com。 Martin Fowler是ThoughtWorks公司的首席科学家,他自称是“一位作家、演说家和咨询师,经常在软件开发活动中发表演讲。我关注的是企业软件设计——诸如什么能产生良好的设计,而良好的设计又需要哪些实践等。我是面向对象技术、重构、模式、敏捷方法论、领域建模、统一建模语言(UML)和极限编程的先行者。近十年来我一直在为ThoughtWorks公司工作,这是一家非常出色的系统开发和咨询公司。”

译者简介

徐旭铭 译:暂无简介

译者序

本书英文版的出版距离第一本《重构》出版已经有十年了,即使是中文版也有六年之久。侯捷和熊节的译本质量很高,只是当时我还在大学里懵懵懂懂,读了几页就扔掉了,知道它在讲什么,但是不知道要怎么用。另一本让我有这种感觉的则是《设计模式》。这样的书并不难读,作者能以非常浅显的方式把问题讲解出来,但是要真正读懂其中的内容,却不是一朝一夕可以做到的。正如书中最后提到的,本书中所讲解的只是基本技术,它们彼此之间是相对孤立的,要做到融会贯通还需要大量的实践经验。正所谓“学而不思则罔,思而不学则殆”。
  工作以后渐渐接触到一些大型系统,有些代码甚至比我的年龄还要长,当时看起来聪明的设计已经不太适合现在的要求了,这时再读它们的感觉自然大不一样。前辈们总结了多年的经验,让我们可以不必摸着石头过河。好的软件不是写出来的,而是改出来的。设计模式能让你保持在大方向上不会脱轨,而重构则能让你在面对变化时不至于手足无措。
  这本书是为Ruby而写,所有的示例都替换成了Ruby。作为一门灵活的动态语言,Ruby很多时候都不需要像在Java里重构那样束手束脚。另外,很多现代的IDE都已经具备了基本的重构能力,可以让你避免一些烦琐的复制粘贴。因此在第1版中有些显得相当繁复的步骤在Ruby里变得十分简练,这就让我们可以更加关注重构的本质,不会陷入语言的细枝末节。因此,虽然在这本书里针对十年来重构技术的进步进行了相应的更新,并且添加了一些针对Ruby的内容,但是页数并没有超出第1版。
  前面说到,《重构》第1版的中译本水平很高,在翻译本书的过程中,我自然倍感压力,不敢砸了前人的招牌。在此感谢陈冀康老师给我这个成为本书译者的机会。由于水平所限,错误和不妥之处在所难免。恳请专家和同行批评指正,也希望使用本书的读者给予批评和建议,不胜感激。

徐旭铭
2010年初

图书目录

译者序

前言
致谢
第1章重构初体验
11起点
111Movie
112Rental
113Customer
114对起始程序的评价
12重构第一步
13Statement方法的分解和再组合
131移动Amount的计算
132提炼常客积分的计算
133移除临时变量
14用多态替换价格代码中的条件逻辑
15小结
第2章重构的基本原理
21重构的起源
22重构的定义
23重构的理由
231重构可以改进软件的设计
232重构让软件变得易于理解
233重构可以帮助你发现bug
234重构可以帮助你更快地编程
24重构的时机
241事不过三
242在添加功能时重构
243在需要修复bug时重构
244在进行代码复审时重构
245为了更好地理解而重构(或者说,向着同一个目标进行重构)
25为什么重构能起作用
26我怎么跟经理说
27抽象和重构
28重构的问题
281改变接口
282数据库
283难以重构的设计变化
284什么时候不应该重构
29重构和设计
210竹篮打水一场空
211重构和性能
212优化薪资系统
第3章代码里的坏味道
31重复代码
32方法过长
33类太大
34参数列表太长
35发散型变化
36霰弹型修改
37特性依赖
38数据泥团
39基本类型偏执
310case语句
311平行继承体系
312冗赘类
313纯臆测的泛化
314临时字段
315消息链
316中间人
317过分亲密
318异曲同工的类
319不完善的类库
320数据类
321被拒绝的遗赠
322注释
323狂热的元编程
324脱节的API
325不断重复的样板文本
第4章构建测试
41自我测试代码的价值
42Test∷Unit测试框架
43程序员测试和质量保证测试
44添加更多的测试
第5章重构花名册
51重构的格式
52查找引用
第6章组织方法
61提炼方法
611动机
612手法
613示例:没有局部变量
614示例:使用局部变量
615示例:重新给局部变量赋值
62内联化方法
621动机
622手法
63内联化临时变量
631动机
632手法
64使用查询替换临时变量
641动机
642手法
643示例
65使用链式调用替换临时变量
651动机
652手法
653示例
66引入解释性变量
661动机
662手法
663示例
664采用提炼方法的手法
67分解临时变量
671动机
672手法
673示例
68移除对参数赋值
681动机
682手法
683示例
69使用方法对象替换方法
691动机
692手法
693示例
610替换算法
6101动机
6102手法
611使用集合闭包方法替换循环
6111动机
6112手法
6113示例
612提炼环绕方法
6121动机
6122手法
6123示例
613引入类标注
6131动机
6132手法
6133示例
614引入命名参数
6141动机
6142手法
6143示例1:命名全部参数
6144示例2:只命名可选参数
615移除命名参数
6151动机
6152手法
6153示例
616移除未使用的默认参数
6161动机
6162手法
6163示例
617动态方法定义
6171动机
6172手法
6173示例:通过def_each来定义
相似的方法
6174instance_exec方法
6175示例:用类标注来定义
实例方法
6176示例:通过扩展一个动态
定义的模块来定义方法
618使用动态方法定义替换
动态接收器
6181动机
6182手法
6183示例:不用method_missing
进行动态委托
6184示例:使用自定义数据来
定义方法
619隔离动态接收器
6191动机
6192手法
6193示例
620把计算从运行时移到解析时
6201动机
6202手法
第7章在对象之间移动特性
71移动方法
711动机
712手法
713示例
72移动字段
721动机
722手法
723示例
724示例:使用自封装
73提炼类
731动机
732手法
733示例
74内联化类
741动机
742手法
743示例
75隐藏委托
751动机
752手法
753示例
76移除中间人
761动机
762手法
763示例
第8章组织数据
81自封装字段
811动机
812手法
813示例
82使用对象替换数据值
821动机
822手法
823示例
83将值对象改为引用对象
831动机
832手法
833示例
84将引用对象改为值对象
841动机
842手法
843示例
85使用对象替换数组
851动机
852手法
853示例
854使用Deprecation进行重构
86使用对象替换Hash
861动机
862手法
863示例
87将单向关联改为双向关联
871动机
872手法
873示例
88将双向关联改为单向关联
881动机
882手法
883示例
89使用符号常数代替魔法数
891动机
892手法
810封装集合
8101动机
8102手法
8103示例
8104将行为移入类里
811使用数据类替换记录
8111动机
8112手法
812使用多态替换类型码
8121动机
8122移除条件逻辑
8123手法
8124示例
813使用模块扩展替换类型码
8131动机
8132手法
8133示例
814使用状态或策略模式替换类型码
8141动机
8142手法
8143示例
815使用字段替换子类
8151动机
8152手法
8153示例
816惰性初始化的属性
8161动机
8162手法
8163以||=为例
8164以instance_variable_defined
为例
817及早初始化的属性
8171动机
8172讨论
8173手法
8174示例
第9章简化条件表达式
91分解条件语句
911动机
912手法
913示例
92重组条件语句
921动机
922示例:使用“Or”赋值替换三元操作符
923示例:使用显式返回替换条件语句
93合并条件表达式
931动机
932手法
933示例:Ors
934示例:Ands
94合并重复的条件片段
941动机
942手法
943示例
95移除控制位
951动机
952手法
953示例:使用break替换简单的控制位
954示例:返回控制位的结果
96使用守卫子句替换嵌套条件语句
961动机
962手法
963示例
964示例:逆转条件
97使用多态替换条件语句
971动机
972手法
973示例
98引入null对象
981动机
982手法
983示例
984示例:测试接口
985其他特殊情况
99引入断言
991动机
992手法
993示例
第10章简化方法调用
101重命名方法
1011动机
1012手法
1013示例
102添加参数
1021动机
1022手法
103移除参数
1031动机
1032手法
104分离查询方法和修改方法
1041动机
1042手法
1043示例
1044并发问题
105参数化方法
1051动机
1052手法
1053示例
106使用显式方法替换参数
1061动机
1062手法
1063示例
107保留完整对象
1071动机
1072手法
1073示例
108使用方法替换参数
1081动机
1082手法
1083示例
109引入参数对象
1091动机
1092手法
1093示例
1010移除设值方法
10101动机
10102手法
10103示例
1011隐藏方法
10111动机
10112手法
1012使用工厂方法替换构造函数
10121动机
10122手法
10123示例
1013使用异常替换错误码
10131动机
10132手法
10133示例
10134示例:在调用之前检查条件
10135示例:调用方捕捉异常
1014使用检测替换异常
10141动机
10142手法
10143示例
1015引入网关
10151动机
10152手法
10153示例
1016引入表达式构造器
10161动机
10162手法
10163示例
第11章处理通用化
111方法上移
1111动机
1112手法
1113示例
112方法下移
1121动机
1122手法
113提炼模块
1131动机
1132手法
1133示例
114内联化模块
1141动机
1142手法
115提炼子类
1151动机
1152手法
1153示例
116引入继承
1161动机
1162手法
1163示例
117削减层次
1171动机
1172手法
118构造模板方法
1181动机
1182手法
1183示例1:使用继承的模板方法
1184示例2:使用模块扩展的模板方法
119使用委托替换继承
1191动机
1192手法
1193示例
1110使用层次替换委托
11101动机
11102手法
11103示例
1111使用模块替换抽象父类
11111动机
11112手法
11113示例
第12章大型重构
121重构的本质
122为什么大型重构很重要
123四种大型重构
124解开纠缠的继承
1241动机
1242手法
1243示例
125将过程设计转换成对象设计
1251动机
1252手法
1253示例
126将领域和表现分开
1261动机
1262手法
1263示例
127提炼层次
1271动机
1272手法
1273示例
第13章总结
参考文献
重构手法列表

教学资源推荐
作者: (美)Jeffrey D. Ullman 斯坦福大学Jennifer Widom 著斯坦福大学岳丽华 金培权 万寿红 等译
作者: 曹先彬,陈香兰 编著
作者: 赵绪辉
作者: 孙华志 主编 杨连贺 副主编 孙济洲 主审 孙华志 主编    杨连贺 副主编    孙济洲 主审
参考读物推荐
作者: (美)Suzanne Ginsburg 著
作者: 王红卫 等编著
作者: (美)Christian Crumlish