重构:改善既有代码的设计
8推荐 收藏
11.6K阅读
图灵程序设计丛书

重构:改善既有代码的设计

Martin Fowler (作者) 熊节 (译者)
终止销售
本书清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了 70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。
本书适合软件开发人员、项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物。

出版信息

同系列书

  • JavaScript高级程序设计(第4版)

    [美]马特·弗里斯比(Matt Frisbie)   李松峰   译

    本书是JavaScript经典图书的新版。第4版涵盖ECMAScript 2019,全面、深入地介绍了Java...

  • HTTP权威指南

    David Gourley   Brian Totty   Marjorie Sayer   Sailu Reddy   Anshu Aggarwal   陈涓   赵振平   译

    本书是HTTP及其相关核心Web技术方面的权威著作,主要介绍了Web应用程序是如何工作的,核心的因特网协议如何...

  • JavaScript高级程序设计(第3版)

    Nicholas C.Zakas   李松峰   曹力   译

    本书是JavaScript超级畅销书的新版。ECMAScript 5 和HTML5在标准之争中双双胜出,使大量...

  • 计算机科学的基础

    Al Aho   Jeff Ullman   傅尔也   译

    本书全面而详细地阐述了计算机科学的理论基础,从抽象概念的机械化到各种数据模型的建立,用算法、数据抽象等核心思想...

  • Java技术手册(第6版)

    Benjamin J Evans   David Flanagan   安道   译

    通过学习本书,你将能够: 掌握最新的语言细节,包括Java 8的变化 使用基本的Java句法学习面向对...

本书特色

软件开发的不朽经典
生动阐述重构原理和具体做法
普通程序员进阶到编程高手必须修炼的秘笈

目录

第1章 重构,第一个案例 1
1.1 起点 1
1.2 重构的第一步 7
1.3 分解并重组statement() 8
1.4 运用多态取代与价格相关的条件逻辑 34
1.5 结语 52
第2章 重构原则 53
2.1 何谓重构 53
2.2 为何重构 55
2.3 何时重构 57
2.4 怎么对经理说 60
2.5 重构的难题 62
2.6 重构与设计 66
2.7 重构与性能 69
2.8 重构起源何处 71
第3章 代码的坏味道 75
3.1 Duplicated Code(重复代码) 76
3.2 Long Method(过长函数) 76
3.3 Large Class(过大的类) 78
3.4 Long Parameter List(过长参数列) 78
3.5 Divergent Change(发散式变化) 79
3.6 Shotgun Surgery(霰弹式修改) 80
3.7 Feature Envy(依恋情结) 80
3.8 Data Clumps(数据泥团) 81
3.9 Primitive Obsession(基本类型偏执) 81
3.10 Switch Statements(switch惊悚现身) 82
3.11 Parallel InheritanceHierarchies(平行继承体系) 83
3.12 Lazy Class(冗赘类) 83
3.13 Speculative Generality(夸夸其谈未来性) 83
3.14 Temporary Field(令人迷惑的暂时字段) 84
3.15 Message Chains(过度耦合的消息链) 84
3.16 Middle Man(中间人) 85
3.17 Inappropriate Intimacy(狎昵关系) 85
3.18 Alternative Classes with Different Interfaces(异曲同工的类) 85
3.19 Incomplete Library Class(不完美的库类) 86
3.20 Data Class(纯稚的数据类) 86
3.21 Refused Bequest(被拒绝的遗赠) 87
3.22 Comments(过多的注释) 87
第4章 构筑测试体系 89
4.1 自测试代码的价值 89
4.2 JUnit测试框架 91
4.3 添加更多测试 97
第5章 重构列表 103
5.1 重构的记录格式 103
5.2 寻找引用点 105
5.3 这些重构手法有多成熟 106
第6章 重新组织函数 109
6.1 Extract Method(提炼函数) 110
6.2 Inline Method(内联函数) 117
6.3 Inline Temp(内联临时变量) 119
6.4 Replace Temp with Query(以查询取代临时变量) 120
6.5 Introduce Explaining Variable(引入解释性变量) 124
6.6 Split Temporary Variable(分解临时变量) 128
6.7 Remove Assignments to Parameters(移除对参数的赋值) 131
6.8 Replace Method with Method Object(以函数对象取代函数) 135
6.9 Substitute Algorithm(替换算法) 139
第7章 在对象之间搬移特性 141
7.1 Move Method(搬移函数) 142
7.2 Move Field(搬移字段) 146
7.3 Extract Class(提炼类) 149
7.4 Inline Class(将类内联化) 154
7.5 Hide Delegate(隐藏“委托关系”) 157
7.6 Remove Middle Man(移除中间人) 160
7.7 Introduce Foreign Method(引入外加函数) 162
7.8 Introduce Local Extension(引入本地扩展) 164
第8章 重新组织数据 169
8.1 Self Encapsulate Field(自封装字段) 171
8.2 Replace Data Value with Object(以对象取代数据值) 175
8.3 Change Value to Reference(将值对象改为引用对象) 179
8.4 Change Reference to Value(将引用对象改为值对象) 183
8.5 Replace Array with Object(以对象取代数组) 186
8.6 Duplicate Observed Data(复制“被监视数据”) 189
8.7 Change Unidirectional Association to Bidirectional(将单向关联改为双向关联) 197
8.8 Change Bidirectional Association to Unidirectional(将双向关联改为单向关联) 200
8.9 Replace Magic Number with Symbolic Constant(以字面常量取代魔法数) 204
8.10 Encapsulate Field(封装字段) 206
8.11 Encapsulate Collection(封装集合) 208
8.12 Replace Record with Data Class(以数据类取代记录) 217
8.13 Replace Type Code with Class(以类取代类型码) 218
8.14 Replace Type Code with Subclasses(以子类取代类型码) 223
8.15 Replace Type Code with State/Strategy(以State/Strategy取代类型码) 227
8.16 Replace Subclass with Fields(以字段取代子类) 232
第9章 简化条件表达式 237
9.1 Decompose Conditional(分解条件表达式) 238
9.2 Consolidate Conditional Expression(合并条件表达式) 240
9.3 Consolidate Duplicate Conditional Fragments(合并重复的条件片段) 243
9.4 Remove Control Flag(移除控制标记) 245
9.5 Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式) 250
9.6 Replace Conditional with Polymorphism(以多态取代条件表达式) 255
9.7 Introduce Null Object(引入Null对象) 260
9.8 Introduce Assertion(引入断言) 267
第10章 简化函数调用 271
10.1 Rename Method(函数改名) 273
10.2 Add Parameter(添加参数) 275
10.3 Remove Parameter(移除参数) 277
10.4 Separate Query from Modifier(将查询函数和修改函数分离) 279
10.5 Parameterize Method(令函数携带参数) 283
10.6 Replace Parameter with Explicit Methods(以明确函数取代参数) 285
10.7 Preserve Whole Object(保持对象完整) 288
10.8 Replace Parameter with Methods(以函数取代参数) 292
10.9 Introduce Parameter Object(引入参数对象) 295
10.10 Remove Setting Method(移除设值函数) 300
10.11 Hide Method(隐藏函数) 303
10.12 Replace Constructor with Factory Method(以工厂函数取代构造函数) 304
10.13 Encapsulate Downcast(封装向下转型) 308
10.14 Replace Error Code with Exception(以异常取代错误码) 310
10.15 Replace Exception with Test(以测试取代异常) 315
第11章 处理概括关系 319
11.1 Pull Up Field(字段上移) 320
11.2 Pull Up Method(函数上移) 322
11.3 Pull Up Constructor Body(构造函数本体上移) 325
11.4 Push Down Method(函数下移) 328
11.5 Push Down Field(字段下移) 329
11.6 Extract Subclass(提炼子类) 330
11.7 Extract Superclass(提炼超类) 336
11.8 Extract Interface(提炼接口) 341
11.9 Collapse Hierarchy(折叠继承体系) 344
11.10 Form Tem Plate Method(塑造模板函数) 345
11.11 Replace Inheritance with Delegation(以委托取代继承) 352
11.12 Replace Delegation with Inheritance(以继承取代委托) 355
第12章 大型重构 359
12.1 Tease Apart Inheritance(梳理并分解继承体系) 362
12.2 Convert Procedural Design to Objects(将过程化设计转化为对象设计) 368
12.3 Separate Domain from Presentation(将领域和表述/显示分离) 370
12.4 Extract Hierarchy(提炼继承体系) 375
第13章 重构,复用与现实 379
13.1 现实的检验 380
13.2 为什么开发者不愿意重构他们的程序 381
13.3 再论现实的检验 394
13.4 重构的资源和参考资料 394
13.5 从重构联想到软件复用和技术传播 395
13.6 小结 397
13.7 参考文献 397
第14章 重构工具 401
14.1 使用工具进行重构 401
14.2 重构工具的技术标准 403
14.3 重构工具的实用标准 405
14.4 小结 407
第15章 总结 409
参考书目 413
要点列表 417
索引 419

相关文章

  • 高翌翔 10推荐

    好书妙评之《重构:改善既有代码的设计》

    作为程序员,对于《重构》一定并不陌生。尽管许多人把它奉为经典,例如有“改善代码的济世良方”、“隐藏的宝藏”等等好评如潮,但也不乏对它言词犀利的差评,有些甚至尖酸刻薄,例如“内容虽好但是写得太烂”、“肤浅、冗长、且好高骛远”等等。为何读者的评论会出现如此巨大反差?真相到底是什么…...

  • 盼盼姐 9推荐

    对话马丁•福勒——问题征集

    在程序员的世界里,Martin Fowler被同行称为“大师”、“教父”,比起这些高高在上的称谓,他更喜欢自己被视为一名实实在在的Coder、喜欢写字的作家、愿意教学相长的咨询师和普普通通的美国人。他喜欢专注于企业级软件设计的研究——探索究竟是什么造就了优秀的设计,以及什么技术…...

  • 盼盼姐 26推荐

    [视频]Martin Fowler:我希望可以创造永恒的价值(图灵访谈)

    图灵访谈之二十六:专访敏捷之父Martin Fowler Martin是一个看起来有些严厉的人,他会在他演讲时和窃窃私语的人说:“Very distracting.”也会用“I have no idea”回答很多问题。但是我在他身上看到的是作为一个科学家的专注和严谨,在激情…...

  • 盼盼姐 6推荐

    敏捷之父Martin Fowler采访问题有奖征集

    在程序员的世界里,Martin Fowler被同行称为“大师”、“教父”,比起这些高高在上的称谓,他更喜欢自己被视为一名实实在在的Coder、喜欢写字的作家、愿意教学相长的咨询师和普普通通的美国人。他喜欢专注于企业级软件设计的研究——探索究竟是什么造就了优秀的设计,以及什么技术…...

  • 零拾 6推荐

    2016 年程序员最值得读的一本书

    两个月前「简寻」在 V站 上发起了#2016 年程序员最值得读的一本书#的活动,活动的初衷是,我们每年都会写下自己的新年计划,但是每到年底却发现还有那么多的“不圆满”。尤其是作为程序员,想要快速进阶免不了看书充电,活动结束后根据 V 站大神们的回复整理了一份程序员充电必备的书单…...

  • 出个电子版吧
    whbb  发表于 2015-04-19 17:27:22
    推荐
    • 外方还没有授权

      傅志红  发表于 2015-04-20 12:05:16
  • 转自:豆瓣 作者:WadeFelix (流浪者幸运)
    代码的坏味道章节描述了常见的不良代码,而且基本上流行于各种编程语言。
      第6~11章概括了一些java中的重构手法,是作者在实际操作过程中重构笔记的基础上总结而成,对于我们非Java程序员来说选择性阅读即可。
      重构手法中包含了不少譬如提炼函数和内联函数这样的相反的操作,这可能会使人迷惑,究竟是遵循什么呢?恭喜你,你注意到了这一点,说明咱不是 书呆子。你所要做的就是更进一步,找出为什么要提炼函数?又为什么内联函数?实践中你可能在这两种相反的操作中来回的徘徊,你确定不了哪个是好,其实 fowler也给你说不准,事物是发展的,代码的环境在不断的变化,代码也只好因时而变。这些重构手法你只需阅读到有印象,然后碰见飘着坏味道的代码能想 起来好像这本书上某个地方有说即可。
      
      什么是重构? What
      ——第二章
      为什么重构? Why
      ——第二章
      哪些地方重构?Where
      ——第三章
      什么时候重构?When
      ——第二章
      如何重构? HOW
      ——4~14章
      谁来重构? Who
      ——You
      
      大胆重构,无时无处不重构。
      
      代码需要重构,就像人需要锻炼身体一样。身体不锻炼,当然还能活,但是要想活的好、活得久、活的有激情,锻炼身体必不可少。
      重构除了能是代码活的好外,还能干什么?说不定你的某一次重构孕育着一个新的伟大的功能,可能重构时尚不觉察,但是重构着重构着或者重构后豁 然一亮,这个功能不错嘛,甚至渐渐成了一个主要功能特点,在甚至改变了软件前进方向,改变同类软件竞技规则也不一定哦。Firefox是怎么引入扩展功能 的,咱不知,但现如今没有扩展功能都不意思叫浏览器啦。
    熊猫夜未眠  发表于 2011-09-06 15:55:58
    推荐
  • 转自:豆瓣 作者:王实
    利用春节的假期读完的这本书。
      上学的时候比较迷恋设计模式,还记得在微软实习的时候自作聪明的给自己写的代码套上了很多模式,结果mentor手起刀落,通过简单的继承, 接口就把所有模式给干掉了,让我着实汗颜。我想初接触软件设计模式的同学可能最容易犯的就是这类过度设计的错误,以学习为目的多使用设计模式无可厚非,但 在实践在不加分析地套模式就是杯具了,很多时候,设计模式只会引入不必要的复杂性。
      这本书已经被列入程序员必读书籍,展示了代码维护和重构的技巧,一个特点是全书提到的重构技巧很少涉及复杂的设计模式,实用性很强。此外,作 者对于每种重构技巧展示了如何判断是否需要重构,如何重构,并配以实际的代码,可读性非常强。至于缺点,感觉对于一些简单的重构方法花费了过多的篇幅,略 显拖沓。
      推荐程序员小盆友可以花几天时间快速阅读,去掉代码中的“坏味道”。
    熊猫夜未眠  发表于 2011-09-06 15:56:36
    推荐
  • 转自:豆瓣 作者:飞林沙
    无容置疑,这是一本经典的书,正如推荐所说,是这本书让重构这个看似高深莫测的话题走进了寻常程序员的世界。
      
      可是我们不得不注意这本书的出版日期,是七八年前,和设计模式一样,当年的设计模式那是高手的工具,开口闭口带那么一两句,工厂,单例,会让人对你崇拜至死。可是现在开口闭口不说出点中介者,访问者,你都不好意思说你学过Java,学过C#。
      
      同样,随着时代的变迁,这本书的很多观点早已被人们所潜移默化的接受。而且书中所提供的很多解决办法也早已被现在的IDE,被现在的类库,语法(例如扩展方法)变得有些过时。
      
      所以我在看这本书的时候我并没有详细去看他的做法,而是主要看他的动机和目的,此外略看一下他的范例,我觉得这就足够了。
      
      如果MF能够在现在重出一本《重构》,我想我一定会马上买下来。
      
      此书需要放在桌旁,反复阅读!
    熊猫夜未眠  发表于 2011-09-06 15:57:06
    推荐
  • 转自:豆瓣 作者:蚂蚁
    之前读过好几本关于设计模式的书,总觉得读完之后不知用在何处。
      这本书可以帮助你把设计模式的知识点运用到代码改善当中去。
      此外,写过代码的同学,若是仔细读过此书,应该都会发现原来自己的代码写得多么不合理。因此,吸收此书的精华吧!
      注:
      1、本书的译者均为台湾的前辈,有些字词读起来不那么习惯,建议读《重构(英文注释版)》的,其实一点一点地读下去,不会有太大的坎。而且,它里面更新添加了更多的重构手法,值得!
      2、幸运的是,《重构》的翻译版今年出新版的了,想必会有大大改进,期待着图书馆购入。
    熊猫夜未眠  发表于 2011-09-06 15:57:47
    推荐
  • 转自:http://daihaixiang.blog.163.com/blog/static/3830134201121611372334/
    《重构-改善既有代码的设计》读后感
    系统架构设计 2011-03-16 11:37:02 阅读44 评论0 字号:大中小 订阅
    在《重构》中,Martin Fowler按照重构所针对的代码内容进行了分类,包括对函数的重构、对对象特性的重构、对数据组织的重构、对条件表达式的重构以及对类层次的重构,并按照这种分类组织了章节。
    除了按照重构所针对的代码内容进行分类外,按照采用手法进行分类,我觉得也可以从另一个角度帮助我们更进一步理解重构的进行方式。
    通过整理,按照采用手法分类如下:
    1、提炼
    就是对某个过程的一部分,或某个事物的一部分进行抽象并概念化,以减小所表达的目的(要做什么)和实现(做什么,如何做)之间的语义差距。
    运用提炼的重构手法包括
    Extract Method、
    Split Temporary Variable、
    Extract Class、
    Extract Subclass、
    Extract Superclass、
    Extract Interface等
    2、内联
    就是用其直接实现替换原来的间接调用,通过内联可以去掉意义不大的间接性。
    运用内联的重构手法包括
    Inline Method、
    Inline Temp、
    Inline Class
    3、移动
    在类之间(包括父类和子类之间)移动属性和方法,以使类之间职责更明确更清晰。
    运用移动的重构手法包括
    Move Method、
    Move Field、
    Pull Up Field、
    Pull Up Method、
    Pull Up Constructor Body、
    Push Down Method、
    Push Down Field
    4、替换
    将一种实现方式用另一种实现方式替代,以便于更直接更集中和更灵活
    运用替换的重构手法包括
    Replace Temp with Query、
    Replace Method with Method Object、
    Replace Date Value with Object、
    Replace Array with Object、
    Replace Magic Number with Symbolic Constant、
    Replace Record with Data Class、
    Replace Type Code with Class、
    Replace Type Code with Subclasses、
    Replace Type Code with State/Strategy、
    Replace Subclass with Fields、
    Replace Nested Conditional with Guard Clauses、
    Replace Conditional with Polymorphism、
    Replace Paramether with Explicit Methods、
    Replace Parameter with Method、
    Replace Constructor with Factory Method、
    Replace Error Code with Exception、
    Replace Exception with Test、
    Replace Inheritance with Delegation、
    Replace Delegation with Inheritance
    5、改变
    改变和替换语义上有些类似,其间的差别还不是很清楚
    运用改变的重构手法包括
    Change Value to Reference,
    Change Reference to Value,
    Change Unidirectional Association to Biderectional
    Change Biderectional Association to Unidirectional
    6、其他
    包括增加Add、移除Remove、隐藏Hide、引入Introduce、封装Encapsulate、合并Consolidate等等。
    熊猫夜未眠  发表于 2011-09-06 15:59:52
    推荐
  • 这本什么时候会有电子书卖?纸质书买了好多,搬起来好累。毕业的时候好几箱书。
    91taotao  发表于 2013-12-24 15:15:59
    推荐
  • 希望能有 Ruby 版的重构,然后是电子版。华章好像拿了Ruby重构的电子版权,可是做得实在烂,代码排版居然全部偷懒的用图片。
    邱茂源  发表于 2014-03-31 08:51:43
    推荐
  • 为什么这本书不能用银子兑换呢
    Genesis2011  发表于 2016-05-13 21:37:25
    推荐