编辑推荐
适读人群:《重构 改善既有代码的设计(第2版 平装版)》适合软件开发人员、项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物。
1.软件开发大师的不朽经典
2.生动阐述重构原理和具体做法
3.普通程序员进阶到编程高手必须修炼的秘笈
重构,一言以蔽之,是在不改变外部行为的前提下,有条不紊地改善代码。20多年前,正是《重构:改善既有代码的设计》第1版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。如今,MartinFowler的《重构:改善既有代码的设计》一书已经成为全球有经验的程序员手中的利器,既可用来改善既有代码的设计、提升软件的可维护性,又可用于使既有代码更易理解、焕发出新的活力。
这本备受关注的第2版在第1版的基础上做了全面修订,反映了编程领域业已发生的许多变化。第2版中介绍的重构列表更加内聚,并用JavaScript语言重写了代码范例。此外,第2版中还新增了与函数式编程相关的重构范例,旨在教会读者如何在没有类的环境下开展重构。
新版沿袭了第1版的结构,依次解释什么是重构,为什么要重构,如何通过“坏味道”识别出需要重构的代码,以及如何在实践中成功实施重构(无论用的是什么编程语言)。
●理解重构的过程和重构的基本原则;
●快速有效地应用各种重构手法,提升程序的表达力和可维护性;
●识别代码中能指示出需要重构的地方的“坏味道”;
●深入了解各种重构手法,每个手法都包含解释、动机、做法和范例4个部分;
●构建稳固的测试,以支持重构工作的开展;
●理解重构过程的权衡取舍以及重构存在的挑战等。
《重构 改善既有代码的设计(第2版 平装版)》凝聚了软件开发社区专家多年摸索而获得的宝贵经验,书中所蕴涵的思想和精华,值得反复咀嚼,而且往往能够常读常新。内容简介
《重构 改善既有代码的设计(第2版 平装版)》是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。《重构 改善既有代码的设计(第2版 平装版)》提出的重构准则将帮助开发人员一次一小步地修改代码,从而减少了开发过程中的风险。
《重构 改善既有代码的设计(第2版 平装版)》适合软件开发人员、项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物。作者简介
作者简介
马丁·福勒(MartinFowler)软件开发大师,ThoughtWorks科学家。他是一位作家、演说者、咨询师。他致力于改善企业级的软件设计,对设计以及支撑设计的工程实践孜孜以求。他在重构、面向对象分析设计、模式、XP和UML等领域都有贡献,著有《重构》《分析模式》《领域特定语言》等经典著作。
译者简介
熊节 在IT行业已经打拼了18年,在金融、零售、政府、电信、制造业等行业的信息化建设方面有着丰富经验,是中国IT业敏捷浪潮的领军人物。熊节拥有利物浦大学MBA学位。
林从羽 ThoughtWorks软件开发工程师,曾服务于国内外多家大型企业,致力于帮助团队更快更好地交付可工作的软件。拥抱敏捷精神,TDD爱好者,纯键盘工作者。目录
第1章 重构,第一个示例1
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 重构、架构和YAGNI62
2.7 重构与软件开发过程63
2.8 重构与性能64
2.9 重构起源何处67
2.10 自动化重构68
2.11 延展阅读70
第3章 代码的坏味道71
3.1 神秘命名(MysteriousName)72
3.2 重复代码(DuplicatedCode)72
3.3 过长函数(LongFunction)73
3.4 过长参数列表(LongParameterList)74
3.5 全局数据(GlobalData)74
3.6 可变数据(MutableData)75
3.7 发散式变化(DivergentChange)76
3.8 霰弹式修改(ShotgunSurgery)76
3.9 依恋情结(FeatureEnvy)77
3.10 数据泥团(DataClumps)78
3.11 基本类型偏执(PrimitiveObsession)78
3.12 重复的switch(RepeatedSwitches)79
3.13 循环语句(Loops)79
3.14 冗赘的元素(LazyElement)80
3.15 夸夸其谈通用性(SpeculativeGenerality)80
3.16 临时字段(TemporaryField)80
3.17 过长的消息链(MessageChains)81
3.18 中间人(MiddleMan)81
3.19 内幕交易(InsiderTrading)82
3.20 过大的类(LargeClass)82
3.21 异曲同工的类(AlternativeClasseswithDifferentInterfaces)83
3.22 纯数据类(DataClass)83
3.23 被拒绝的遗赠(RefusedBequest)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 提炼函数(ExtractFunction)106
6.2 内联函数(InlineFunction)115
6.3 提炼变量(ExtractVariable)119
6.4 内联变量(InlineVariable)123
6.5 改变函数声明(ChangeFunctionDeclaration)124
6.6 封装变量(EncapsulateVariable)132
6.7 变量改名(RenameVariable)137
6.8 引入参数对象(IntroduceParameterObject)140
6.9 函数组合成类(CombineFunctionsintoClass)144
6.10 函数组合成变换(CombineFunctionsintoTransform)149
6.11 拆分阶段(SplitPhase)154
第7章 封装161
7.1 封装记录(EncapsulateRecord)162
7.2 封装集合(EncapsulateCollection)170
7.3 以对象取代基本类型(ReplacePrimitivewithObject)174
7.4 以查询取代临时变量(ReplaceTempwithQuery)178
7.5 提炼类(ExtractClass)182
7.6 内联类(InlineClass)186
7.7 隐藏委托关系(HideDelegate)189
7.8 移除中间人(RemoveMiddleMan)192
7.9 替换算法(SubstituteAlgorithm)195
第8章 搬移特性197
8.1 搬移函数(MoveFunction)198
8.2 搬移字段(MoveField)207
8.3 搬移语句到函数(MoveStatementsintoFunction)213
8.4 搬移语句到调用者(MoveStatementstoCallers)217
8.5 以函数调用取代内联代码(ReplaceInlineCodewithFunctionCall)222
8.6 移动语句(SlideStatements)223
8.7 拆分循环(SplitLoop)227
8.8 以管道取代循环(ReplaceLoopwithPipeline)231
8.9 移除死代码(RemoveDeadCode)237
第9章 重新组织数据239
9.1 拆分变量(SplitVariable)240
9.2 字段改名(RenameField)244
9.3 以查询取代派生变量(ReplaceDerivedVariablewithQuery)248
9.4 将引用对象改为值对象(ChangeReferencetoValue)252
9.5 将值对象改为引用对象(ChangeValuetoReference)256
第10章 简化条件逻辑259
10.1 分解条件表达式(DecomposeConditional)260
10.2 合并条件表达式(ConsolidateConditionalExpression)263
10.3 以卫语句取代嵌套条件表达式(ReplaceNestedConditionalwithGuardClauses)266
10.4 以多态取代条件表达式(ReplaceConditionalwithPolymorphism)272
10.5 引入特例(IntroduceSpecialCase)289
10.6 引入断言(IntroduceAssertion)302
第11章 重构API305
11.1 将查询函数和修改函数分离(SeparateQueryfromModifier)306
11.2 函数参数化(ParameterizeFunction)310
11.3 移除标记参数(RemoveFlagArgument)314
11.4 保持对象完整(PreserveWholeObject)319
11.5 以查询取代参数(ReplaceParameterwithQuery)324
11.6 以参数取代查询(ReplaceQuerywithParameter)327
11.7 移除设值函数(RemoveSettingMethod)331
11.8 以工厂函数取代构造函数(ReplaceConstructorwithFactoryFunction)334
11.9 以命令取代函数(ReplaceFunctionwithCommand)337
11.10 以函数取代命令(ReplaceCommandwithFunction)344
第12章 处理继承关系349
12.1 函数上移(PullUpMethod)350
12.2 字段上移(PullUpField)353
12.3 构造函数本体上移(PullUpConstructorBody)355
12.4 函数下移(PushDownMethod)359
12.5 字段下移(PushDownField)361
12.6 以子类取代类型码(ReplaceTypeCodewithSubclasses)362
12.7 移除子类(RemoveSubclass)369
12.8 提炼超类(ExtractSuperclass)375
12.9 折叠继承体系(CollapseHierarchy)380
12.10 以委托取代子类(ReplaceSubclasswithDelegate)381
12.11 以委托取代超类(ReplaceSuperclasswithDelegate)399
参考文献405
索引409