出版社: 人民邮电出版社
出品方: 异步图书
副标题: 改善既有代码的设计
原作名: Refactoring: Improving the Design of Existing Code,Second Edition
译者: 熊节 / 林从羽
出版年: 2019-3
页数: 422
定价: 168.00元
装帧: 精装
丛书: 异步图书-程序员必读经典系列
ISBN: 9787115508645
内容简介 · · · · · ·
本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员一次一小步地修改代码,从而减少了开发过程中的风险。
本书适合软件开发人员、项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物。
作者简介 · · · · · ·
作者 | Martin Fowler
世界软件开发大师,ThoughtWorks的首席科学家。他是一位作家、演说者、咨询师和泛软件开发领域的意见领袖。他致力于改善企业级的软件设计,对优秀的设计以及支撑优秀设计的工程实践孜孜以求。他在重构、面向对象分析设计、模式、XP和UML等领域都有卓越贡献。著有《重构》《分析模式》《领域特定语言》等经典著作。
译者 | 熊节
在IT行业已经打拼了18年,在金融、零售、政府、电信、制造业等行业的信息化建设方面有着丰富经验,是中国IT业敏捷浪潮的领军人物。熊节拥有利物浦大学MBA学位。
译者 | 林从羽
ThoughtWorks软件开发工程师,曾服务于国内外多家大型企业,致力于为团队更快更好地交付可工作的软件。拥抱敏捷精神,TDD爱好者,纯键盘工作者。
目录 · · · · · ·
1.1 起点 1
1.2 对此起始程序的评价 3
1.3 重构的第一步 5
1.4 分解statement函数 6
1.5 进展:大量嵌套函数 22
· · · · · · (更多)
1.1 起点 1
1.2 对此起始程序的评价 3
1.3 重构的第一步 5
1.4 分解statement函数 6
1.5 进展:大量嵌套函数 22
1.6 拆分计算阶段与格式化阶段 24
1.7 进展:分离到两个文件(和两个阶段) 31
1.8 按类型重组计算过程 34
1.9 进展:使用多态计算器来提供数据 41
1.10 结语 43
第2章 重构的原则 45
2.1 何谓重构 45
2.2 两顶帽子 46
2.3 为何重构 47
2.4 何时重构 50
2.5 重构的挑战 55
2.6 重构、架构和YAGNI 62
2.7 重构与软件开发过程 63
2.8 重构与性能 64
2.9 重构起源何处 67
2.10 自动化重构 68
2.11 延展阅读 70
第3章 代码的坏味道 71
3.1 神秘命名(Mysterious Name) 72
3.2 重复代码(Duplicated Code) 72
3.3 过长函数(Long Function) 73
3.4 过长参数列表(Long Parameter List) 74
3.5 全局数据(Global Data) 74
3.6 可变数据(Mutable Data) 75
3.7 发散式变化(Divergent Change) 76
3.8 霰弹式修改(Shotgun Surgery) 76
3.9 依恋情结(Feature Envy) 77
3.10 数据泥团(Data Clumps) 78
3.11 基本类型偏执(Primitive Obsession) 78
3.12 重复的switch(Repeated Switches) 79
3.13 循环语句(Loops) 79
3.14 冗赘的元素(Lazy Element) 80
3.15 夸夸其谈通用性(Speculative Generality) 80
3.16 临时字段(Temporary Field) 80
3.17 过长的消息链(Message Chains) 81
3.18 中间人(Middle Man) 81
3.19 内幕交易(Insider Trading) 82
3.20 过大的类(Large Class) 82
3.21 异曲同工的类(Alternative Classes with Different Interfaces) 83
3.22 纯数据类(Data Class) 83
3.23 被拒绝的遗赠(Refused Bequest) 83
3.24 注释(Comments) 84
第4章 构筑测试体系 85
4.1 自测试代码的价值 85
4.2 待测的示例代码 87
4.3 第一个测试 90
4.4 再添加一个测试 93
4.5 修改测试夹具 95
4.6 探测边界条件 96
4.7 测试远不止如此 99
第5章 介绍重构名录 101
5.1 重构的记录格式 101
5.2 挑选重构的依据 102
第6章 第一组重构 105
6.1 提炼函数(Extract Function) 106
6.2 内联函数(Inline Function) 115
6.3 提炼变量(Extract Variable) 119
6.4 内联变量(Inline Variable) 123
6.5 改变函数声明(Change Function Declaration) 124
6.6 封装变量(Encapsulate Variable) 132
6.7 变量改名(Rename Variable) 137
6.8 引入参数对象(Introduce Parameter Object) 140
6.9 函数组合成类(Combine Functions into Class) 144
6.10 函数组合成变换(Combine Functions into Transform) 149
6.11 拆分阶段(Split Phase) 154
第7章 封装 161
7.1 封装记录(Encapsulate Record) 162
7.2 封装集合(Encapsulate Collection) 170
7.3 以对象取代基本类型(Replace Primitive with Object) 174
7.4 以查询取代临时变量(Replace Temp with Query) 178
7.5 提炼类(Extract Class) 182
7.6 内联类(Inline Class) 186
7.7 隐藏委托关系(Hide Delegate) 189
7.8 移除中间人(Remove Middle Man) 192
7.9 替换算法(Substitute Algorithm) 195
第8章 搬移特性 197
8.1 搬移函数 198
8.2 搬移字段(Move Field) 207
8.3 搬移语句到函数(Move Statements into Function) 213
8.4 搬移语句到调用者(Move Statements to Callers) 217
8.5 以函数调用取代内联代码(Replace Inline Code with Function Call) 222
8.6 移动语句(Slide Statements) 223
8.7 拆分循环(Split Loop) 227
8.8 以管道取代循环(Replace Loop with Pipeline) 231
8.9 移除死代码(Remove Dead Code) 237
第9章 重新组织数据 239
9.1 拆分变量(Split Variable) 240
9.2 字段改名(Rename Field) 244
9.3 以查询取代派生变量(Replace Derived Variable with Query) 248
9.4 将引用对象改为值对象(Change Reference to Value) 252
9.5 将值对象改为引用对象(Change Value to Reference) 256
第10章 简化条件逻辑 259
10.1 分解条件表达式(Decompose Conditional) 260
10.2 合并条件表达式(Consolidate Conditional Expression) 263
10.3 以卫语句取代嵌套条件表达式(Replace Nested Conditional with Guard Clauses) 266
10.4 以多态取代条件表达式(Replace Conditional with Polymorphism) 272
10.5 引入特例(Introduce Special Case) 289
10.6 引入断言(Introduce Assertion) 302
第11章 重构API 305
11.1 将查询函数和修改函数分离(Separate Query from Modifier) 306
11.2 函数参数化(Parameterize Function) 310
11.3 移除标记参数(Remove Flag Argument) 314
11.4 保持对象完整(Preserve Whole Object) 319
11.5 以查询取代参数(Replace Parameter with Query) 324
11.6 以参数取代查询(Replace Query with Parameter) 327
11.7 移除设值函数(Remove Setting Method) 331
11.8 以工厂函数取代构造函数(Replace Constructor with Factory Function) 334
11.9 以命令取代函数(Replace Function with Command) 337
11.10 以函数取代命令(Replace Command with Function) 344
第12章 处理继承关系 349
12.1 函数上移(Pull Up Method) 350
12.2 字段上移(Pull Up Field) 353
12.3 构造函数本体上移(Pull Up Constructor Body) 355
12.4 函数下移(Push Down Method) 359
12.5 字段下移(Push Down Field) 361
12.6 以子类取代类型码(Replace Type Code with Subclasses) 362
12.7 移除子类(Remove Subclass) 369
12.8 提炼超类(Extract Superclass) 375
12.9 折叠继承体系(Collapse Hierarchy) 380
12.10 以委托取代子类(Replace Subclass with Delegate) 381
12.11 以委托取代超类(Replace Superclass with Delegate) 399
参考文献 405
索引 409
· · · · · · (收起)
原文摘录 · · · · · · ( 全部 )
-
to make the software easier to understand and modify. (查看原文) —— 引自第44页 -
refactoring does not change the observable behavior of the software Why Should You Refactor? Refactoring Improves the Design of Software Refactoring Makes Software Easier to Understand Refactoring Helps You Find Bugs Refactoring Helps You Program Faster 即使在开发过程中,当你发现重复或相似的代码时,也应该立刻重构;当变化发生时,如果该变化影响不止一处,重构就应该粉墨登场。经常的重构可以保证代码常拭常新,如利刃一般锋利。“不要容忍破窗户” 如果两个或更多的地方实现同一职责,则改变时会带来麻烦。所以要遵循DRY原则,单一职责。 When Should You Refactor? The Rule of Three(Three strikes and you refactor) Refactor When You Add Function Refactor When You Need to Fix a Bug Refactor As You Do a Code Review The most common time to refactor is when I want to add a new feature to some software. Reasons:1.refactoring helps me understand some code I need to modify.2.another driver of refactoring is a design that does not help me add a fe... (查看原文) —— 引自第44页
> 全部原文摘录
丛书信息
喜欢读"重构(第2版)"的人也喜欢的电子书 · · · · · ·
喜欢读"重构(第2版)"的人也喜欢 · · · · · ·
重构(第2版)的书评 · · · · · · ( 全部 134 条 )
-
在逃的貓 (「知我如此,不如无生」)
作为程序员,我们的职责就是设计出结构一致、抽象合宜的程序,而程序抽象能力的源泉正是来自函数。与其他抽象机制的设计一样,我们并非总能平衡好抽象的边界。随着系统能力发生演进(通常只要是有用的系统,功能都会演进),原先设定的抽象边界总会悄无声息地发生偏移。对于函数来说,这样的边界偏移意味着曾经视为一个整体、一个单元的行为,如今可能已经分化出两个甚至是多个不同的关注点。2022-04-23 21:43:59 2人喜欢
-
在逃的貓 (「知我如此,不如无生」)
养成重构后即运行测试的习惯非常重要。犯错误是很容易的——至少我知道我是很容易犯错的。做完一次修改就运行测试,这样在我真的犯了错时,只需要考虑一个很小的改动范围,这使得查错与修复问题易如反掌。这就是重构过程的精髓所在:小步修改,每次修改后就运行测试。如果我改动了太多东西,犯错时就可能陷入麻烦的调试,并为此耗费大把时间。小步修改,以及它带来的频繁反馈,正是防止混乱的关键。2022-03-11 07:50:36 2人喜欢
-
在逃的貓 (「知我如此,不如无生」)
每当我要进行重构的时候,第一个步骤永远相同:我得确保即将修改的代码拥有一组可靠的测试。这些测试必不可少,因为尽管遵重构手法可以使我避免绝大多数引入bug的情形,但我毕竟是人,毕竟有可能犯错。程序越大,我的修改不小心破坏其他代码的可能性就越大——在数字时代,软件的名字就是脆弱。2022-03-11 07:22:51 2人喜欢
-
在逃的貓 (「知我如此,不如无生」)
明确表现出“有副作用”与“无副作用”两种函数之间的差异,是个很好的想法。下面是一条好规则:任何有返回值的函数,都不应该有看得到的副作用——命令与查询分离(Command-Query Separation)。2022-04-23 21:55:33 1人喜欢
-
在逃的貓 (「知我如此,不如无生」)
事实上,我们部署到生产环境甚至是用户设备上的代码,从来未因代码量太大而产生额外费用。就算有几行用不上的代码,似乎也不会因此拖慢系统速度,或者占用过多的内存,大多数现代的编译器还会自动将无用的代码移除。但当你尝试阅读代码、理解软件的运作原理时,无用代码确实会带来很多额外的思维负担。它们周围没有任何警示或标记告诉程序员,让他们能够放心忽略这段函数,因为已经没有任何地方使用它了。当程序员花费了许多时...2022-04-23 21:47:54 1人喜欢
-
在逃的貓 (「知我如此,不如无生」)
明确表现出“有副作用”与“无副作用”两种函数之间的差异,是个很好的想法。下面是一条好规则:任何有返回值的函数,都不应该有看得到的副作用——命令与查询分离(Command-Query Separation)。2022-04-23 21:55:33 1人喜欢
-
在逃的貓 (「知我如此,不如无生」)
事实上,我们部署到生产环境甚至是用户设备上的代码,从来未因代码量太大而产生额外费用。就算有几行用不上的代码,似乎也不会因此拖慢系统速度,或者占用过多的内存,大多数现代的编译器还会自动将无用的代码移除。但当你尝试阅读代码、理解软件的运作原理时,无用代码确实会带来很多额外的思维负担。它们周围没有任何警示或标记告诉程序员,让他们能够放心忽略这段函数,因为已经没有任何地方使用它了。当程序员花费了许多时...2022-04-23 21:47:54 1人喜欢
论坛 · · · · · ·
<重构 改善既有代码的设计 第2版>读后的个人感受 | 来自Leo | 2019-03-12 17:13:55 | |
重构(第2版)阅读感悟 | 来自Datura | 2019-03-12 01:06:22 |
这本书的其他版本 · · · · · · ( 全部13 )
-
人民邮电出版社 (2010)9.0分 2228人读过
-
Addison-Wesley Professional (1999)9.1分 257人读过
-
中国电力出版社 (2003)9.0分 2862人读过
-
中国电力出版社 (2003)9.1分 312人读过
以下书单推荐 · · · · · · ( 全部 )
- 豆瓣高分书籍是否名实相符 (无心恋战)
- 10x 程序员工作法 (dreamhead)
- IT 三级 Java程序设计语言、框架技术(实用性) 1.1.1.1.2 (ajian005)
- ThoughtWorks读书雷达(2019) (张凯峰)
- 评分9分以上的计算机图书 (子苓)
谁读这本书?
二手市场
订阅关于重构(第2版)的评论:
feed: rss 2.0
0 有用 迷糊蛋儿 2021-11-05 22:56:29
图示
0 有用 那人很像一条狗 2022-02-15 07:49:29
最近在重构团队中最复杂的项目,再次翻出这本书读一读希望这次能设计得尽量有扩展性一些。
0 有用 东子 2022-03-29 19:06:27
重构
0 有用 allan 2022-07-03 22:34:57
适合有基础阅读
0 有用 wending 2022-05-04 15:15:31
发现这些技法已经在使用了
0 有用 GAVIN 2022-07-30 11:55:56
很幸运这本书的二版改用了JavaScript来写,对我来说简直是福音。作为一个开发者,我们有时候太过关注于应用级别的内容,以至于忽略掉最底层的开发。本书带来了很多纯粹的开发层面的知识,干货满满,是每位开发者必读的作品。
0 有用 allan 2022-07-03 22:34:57
适合有基础阅读
0 有用 2020年继续呱呱 2022-06-20 18:52:02
花了两周时间看完,最大的收获就是:随着自己的代码量增加,阅读软件设计相关的内容变得越来越流畅,思考的过程更加丰富了。
0 有用 leoZhang 2022-06-19 13:52:55
真的经典,按照里面来实践能让coding能力提升几个档次
0 有用 open92 2022-06-18 11:39:18
翻了下,其实就是我平时在做的。 我感觉有些人天生会,不会的人看了也会觉得太抽象