具体描述
重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。
本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构本身,业界对重构的理解,还是开发工具对重构的支持力度,都与本书最初出版时不可同日而语,但书中所蕴涵的意味和精华,依然值得反复咀嚼,而且往往能够常读常新。
作者简介
Martin Fowler 世界软件开发大师,在面向对象分析设计、UML、模式、XP和重构等领域都有卓越贡献,现为著名软件开发咨询公司ThoughtWorks的首席科学家。他的多部著作《分析模式》、《UML精粹》和《企业应用架构模式》等都已经成为脍炙人口的经典。
其他参编者
Kent Beck 软件开发方法学的泰斗,极限编程的创始人。他是Three Rivers Institute公司总裁,也是Agitar Software的成员。
John Brant和Don Roberts The Refactory公司的创始人,Refactoring Browser http://st-www.cs.illinois.edu/users/brant/Refactory/)的开发者,多年来一直从事研究重构的实践与理论。
William Opdyke 目前在朗讯贝尔实验室工作,他写的关于面向对象框架的博士论文是重构方面的第一篇著名文章。
目录信息
The Starting Point 1
The First Step in Refactoring 7
Decomposing and Redistributing the Statement Method 8
Replacing the Conditional Logic on Price Code with Polymorphism 34
Final Thoughts 52
Chapter 2: Principles in Refactoring 53
Defining Refactoring 53
Why Should You Refactor 55
When Should You Refactor 57
What Do I Tell My Manager 60
Problems with Refactoring 62
Refactoring and Design 66
Refactoring and Performance 69
Where Did Refactoring Come From 71
Chapter 3: Bad Smells in Code (by Kent Beck and Martin Fowler) 75
Duplicated Code 76
Long Method 76
Large Class 78
Long Parameter List 78
Divergent Change 79
Shotgun Surgery 80
Feature Envy 80
Data Clumps 81
Primitive Obsession 81
Switch Statements 82
Parallel Inheritance Hierarchies 83
Lazy Class 83
Speculative Generality 83
Temporary Field 84
Message Chains 84
Middle Man 85
Inappropriate Intimacy 85
Alternative Classes with Different Interfaces 85
Incomplete Library Class86
Data Class 86
Refused Bequest 87
Comments 87
Chapter 4: Building Tests 89
The Value of Self-testing Code 89
The JUnit Testing Framework 91
Adding More Tests 97
Chapter 5: Toward a Catalog of Refactorings
Format of the Refactorings~103
Finding References 105
How Mature Are These Refactorings 106
Chapter 6: Composing Methods 109
Extract Method 110
Inline Method 117
Inline Temp 119
Replace Temp with Query 120
Introduce Explaining Variable 124
Split Temporary Variable 128
Remove Assignments to Parameters 131
Replace Method with Method Object 135
Substitute Algorithm 139
Chapter 7: Moving Features Between Objects 141
Move Method 142
Move Field 146
Extract Class 149
Inline Class 154
Hide Delegate 157
Remove Middle Man 160
Introduce Foreign Method 162
Introduce Local Extension 164
Chapter 8: Organizing Data 169
Self Encapsulate Field 171
Replace Data Value with Object 175
Change Value to Reference 179
Change Reference to Value 183
Replace Array with Object 186
Duplicate Observed Data 189
Change Unidirectional Association to Bidirectional 197
Change Bidirectional Association to Unidirectional 200
Replace Magic Number with Symbolic Constant 204
Encapsulate Field 206
Encapsulate Collection 208
Replace Record with Data Class 217
Replace Type Code with Class 218
Replace Type Code with Subclasses 223
Replace Type Code with State/Strategy 227
Replace Subclass with Fields 232
Chapter 9: Simplifying Conditional Expressions .237
Decompose Conditional 238
Consolidate Conditional Expression 240
Consolidate Duplicate Conditional Fragments 243
Remove Control Flag 245
Replace Nested Conditional with Guard Clauses 250
Replace Conditional with Polymorphism 255
Introduce Null Object 260
Introduce Assertion 267
Chapter 10: Making Method Calls Simpler 271
Rename Method 273
Add Parameter 275
Remove Parameter 277
Separate Query from Modifier 279
Parameterize Method 283
Replace Parameter with Explicit Methods 285
Preserve Whole Object 288
Replace Parameter with Method 292
Introduce Parameter Object 295
Remove Setting Method 300
Hide Method 303
Replace Constructor with Factory Method 304
Encapsulate Downcast 308
Replace Error Code with Exception 310
Replace Exception with Test 315
Chapter 11: Dealing with Generalization319
Pull Up Field 320
Pull Up Method 322
Pull Up Constructor Body 325
Push Down Method 328
Push Down Field 329
Extract Subclass 330
Extract Superclass 336
Extract Interface 341
Collapse Hierarchy 344
Form Template Method 345
Replace Inheritance with Delegation 352
Replace Delegation with Inheritance 355
Chapter 12: Big Refactorings (by Kent Beck and Martin Fowler) 359
Tease Apart Inheritance 362
Convert Procedural Design to Objects 368
Separate Domain from Presentation 370
Extract Hierarchy 375
Chapter 13: Refactoring, Reuse, and Reality (by William Opdyke) 379
A Reality Check 380
Why Are Developers Reluctant to Refactor
Their Programs 381
A Reality Check (Revisited) 394
Resources and References for Refactoring 394
Implications Regarding Software Reuse and Technology Transfer 395
A Final Note397
References 397
Chapter 14: Refactoring Tools (by Don Roberts and John Brant) 401
Refactoring with a Tool 401
Technical Criteria for a Refactoring Tool 403
Practical Criteria for a Refactoring Tool 405
Wrap Up 407
Chapter 15: Putting It All Together (by Kent Beck) 409
References 413
List of Soundbites 417
Index 419
· · · · · · (收起)
读后感
《重构》第二版来了! 很高兴有机会能够提前阅读这本神奇的书籍!很多年前就已经阅读过第一版《重构》!那时候就给我很大的冲击!说实话,开始并没有对这一版抱有太大的希望!但是当翻开书卷的那一刻,我还是很庆幸没有因为自己的执念而放弃掉这样一本真心重构了的好书! 可以...
2009年,在为《重构》第一版的中译本再版整理译稿时,我已经隐约察觉行业中对“重构”这个概念的矛盾张力。一方面,在这个“VUCA”(易变、不确定、复杂、模糊)横行的年代,有能力调整系统的内部结构,使其更具长期生命力,这是一个令人神往的期许。另一方面,重构的扎实工夫...
第一次看有网友极力推荐这本书,就买了一本英文的来看,一下子就被吸引住了。 原来觉得编码可以天马行空,总想看看那些高手是怎么写代码的,现在觉得自己好像也是高手了,至少可以看得出哪些代码好,哪些代码差。真是感谢Martin Flower。 现在自己做项目经理了,对于新来的有一...
这本书一开始读的是英文,不过Martin Fowler本身好像就不是一个Native的英语国家的人。所以他的英文写的也是比较容易懂的。 这个书第一章是一个完整的重构的例子,虽然现实中不可能如此完美而孜孜不倦的重构,不过作为一个例子,是非常的好的,让你能为重构的力量所震...
无容置疑,这是一本经典的书,正如推荐所说,是这本书让重构这个看似高深莫测的话题走进了寻常程序员的世界。 可是我们不得不注意这本书的出版日期,是七八年前,和设计模式一样,当年的设计模式那是高手的工具,开口闭口带那么一两句,工厂,单例,会让人对你崇拜至死。可是...
用户评价
读完这本关于软件结构优化的书,我最大的感受是,它提供了一种全新的思维框架,来审视我们日常工作中那些看似理所当然的“妥协”。过去,为了赶进度,我们常常把一些明显不合理的结构暂时搁置,美其名曰“技术债”,然后就指望未来有时间去偿还。然而,这本书却用大量的实例证明,技术债如果不及时处理,它会以指数级的速度侵蚀掉项目的可维护性和开发者的士气。作者的叙述风格非常冷静且客观,没有过度的煽情,而是用一系列具体的“重构手法”作为论据。比如,那个关于如何拆分巨大类的章节,我对照着自己正在维护的一个有着几百行的类,简直是茅塞顿开。书中提出的那些具体的、可命名的操作——“提取方法”、“用参数列表取代临时变量”、“保持一致的命名”——这些都是工具,但更重要的,是它背后的哲学:让代码的意图清晰可见,让未来接手的任何人都能够快速理解作者的逻辑,而不需要花费数天时间去反向工程。这种对清晰度和意图表达的强调,让我开始重新思考,代码写完那一刻的工作,才仅仅是开始,让它易于被理解和修改,才是真正的交付。
这本书给我的最大的启发,在于它教会了我如何与“复杂性”共存,而不是一味地与之对抗。在软件工程领域,我们经常被教导要“简化设计”,但现实是,业务需求本身就是复杂且不断变化的,不可能永远停留在教科书上的简单模型里。这本书的伟大之处在于,它承认了这种复杂性的存在,并提供了一套“渐进式应对策略”。它没有鼓吹推翻一切重来,因为在大多数商业项目中,这根本不现实。相反,它鼓励你“从小处着手”,每次只解决一个局部的问题,通过无数次小而无痛的改进,最终实现整体结构的优化。这种“嘀嗒嘀嗒”式的进步,比那种试图用一次宏大的“架构重写”来解决所有问题的做法,要安全、可靠得多。我开始在工作中运用书中提到的“弃用旧代码并观察一段时间”的策略,而不是急于删除任何看起来不再被调用的部分,这种谨慎和尊重历史代码的态度,真的让我避免了一些不必要的麻烦。
说实话,一开始拿到这本砖头厚的书,我对它的实用性是持怀疑态度的。我以为它会是那种只适合架构师或者资深专家才能消化的理论大部头,但实际阅读体验却完全出乎意料。它的结构设计得极其巧妙,就像一个精密的工具箱,每一个工具都有明确的标签和使用场景。我尤其欣赏它对“测试先行”的强调。没有坚实的测试作为安全网,任何重构都无异于走钢丝,随时可能导致灾难性的后果。这本书把测试的重要性提升到了一个前所未有的高度,它不是将测试视为可选的附加项,而是将编写可测试的代码本身,视为重构流程中不可分割的一部分。通过阅读书中关于如何“隔离依赖”的章节,我学会了如何构建那些更容易被单元测试覆盖的模块。这改变了我写代码的顺序——不再是先堆砌功能,而是先思考如何能够验证这个功能。这种视角上的转移,使得后续的维护工作变得从容不迫,因为你知道,每一次小的改动,都有一个自动化的卫兵为你把关。
这本书的标题是《重构》,我最近读完后,心里久久不能平静。它给我的震撼,就好比一个经验丰富的老木匠,拿着一把看似普通的刨子,却能将一块粗粝的原木,打磨成一件光滑细腻的艺术品。这本书的精髓,不在于那些炫技的复杂算法或者晦涩难懂的理论,而在于它那种近乎于禅意的对代码“干净”的执着追求。我一直以为,只要程序能跑起来,功能实现就行了,但这本书彻底颠覆了我的观念。它细致入微地剖析了“坏味道”代码的各种形态,那些我过去习以为常、甚至自认为是“高效”的写法,在作者的笔下,都成了需要被清除的痼疾。特别是关于如何逐步、安全地进行大段代码的修改,那种如同外科手术般精细的步骤分解,让我这个长期在遗留系统里摸爬滚打的开发者,看到了希望的曙光。它不是教你如何写出完美的初始代码,而是教你如何在面对一个已经“生病”的代码库时,如何有条不紊地、不打断现有功能的前提下,进行系统的修复和优化。这种实操性极强的指导,远比那些纸上谈兵的“最佳实践”来得有力量。每一次小的重构,都像是在给自己的代码库做一次体检和保养,让原本令人望而生畏的复杂度,变得可以管理和控制。
这本书的语言风格,用一个词来形容,就是“老道的经验谈”。它不像最新的技术书籍那样追逐时髦的框架和工具,反而深入挖掘了软件设计领域那些跨越时间周期的核心原则。它像一位坐在你身边的资深导师,用他多年踩过的坑,来为你指明方向。读起来,你能感受到那种厚重的历史感,仿佛它集合了过去几十年优秀工程师们的集体智慧。它没有太多花哨的图表或引人注目的市场营销语言,而是用最朴素的文字,阐述最深刻的道理。我记得其中一段关于“纯函数”和“副作用”的讨论,寥寥数语,却清晰地勾勒出了函数式编程的核心魅力,并将其与面向对象的设计原则巧妙地结合了起来。这本书的价值在于它能让你在面对代码迷宫时,不再感到迷茫和无助,而是能清晰地看到一条条通往出口的小径,只要你愿意拿起书中的工具,一步一个脚印地去疏通和清理那些被遗忘和堆砌的“垃圾”。
主要是代码层次的经验,大牛间逐渐形成的一些无形规范,读的很快,有时间可以再翻下,回头对照自己的代码。
主要是代码层次的经验,大牛间逐渐形成的一些无形规范,读的很快,有时间可以再翻下,回头对照自己的代码。
主要是代码层次的经验,大牛间逐渐形成的一些无形规范,读的很快,有时间可以再翻下,回头对照自己的代码。
2013-07-20断断续续终于看完一遍了,后面就放到桌子上当作参考手册了,需要的时候翻翻//淘宝买的,很久没买书了。纸质的有点臭,在桌子上摊开有段时间了,没气味了。
主要是代码层次的经验,大牛间逐渐形成的一些无形规范,读的很快,有时间可以再翻下,回头对照自己的代码。