• 第1章 重构,第一个案例
    • 1.1 起点1
    • 1.2 重构的第一步7
    • 1.3 分解并重组statement()8
    • 1.4 运用多态取代与价格相关的条件逻辑34
    • 1.5 结语52
    • 第2章 重构原则
    • 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章 代码的坏味道
    • 3.1 DuplicatedCode(重复代码)76
    • 3.2 LongMethod(过长函数)76
    • 3.3 LargeClass(过大的类)78
    • 3.4 LongParameterList(过长参数列)78
    • 3.5 DivergentChange(发散式变化)79
    • 3.6 ShotgunSurgery(霰弹式修改)80
    • 3.7 FeatureEnvy(依恋情结)80
    • 3.8 DataClumps(数据泥团)81
    • 3.9 PrimitiveObsession(基本类型偏执)81
    • 3.10 SwitchStatements(switch惊悚现身)82
    • 3.11 ParallelInheritanceHierarchies(平行继承体系)83
    • 3.12 LazyClass(冗赘类)83
    • 3.13 SpeculativeGenerality(夸夸其谈未来性)83
    • 3.14 TemporaryField(令人迷惑的暂时字段)84
    • 3.15 MessageChains(过度耦合的消息链)84
    • 3.16 MiddleMan(中间人)85
    • 3.17 InappropriateIntimacy(狎昵关系)85
    • 3.18 AlternativeClasseswithDifferentInterfaces(异曲同工的类)85
    • 3.19 IncompleteLibraryClass(不完美的库类)86
    • 3.20 DataClass(纯稚的数据类)86
    • 3.21 RefusedBequest(被拒绝的遗赠)87
    • 3.22 Comments(过多的注释)87
    • 第4章 构筑测试体系
    • 4.1 自测试代码的价值89
    • 4.2 JUnit测试框架91
    • 4.3 添加更多测试97
    • 第5章 重构列表
    • 5.1 重构的记录格式103
    • 5.2 寻找引用点105
    • 5.3 这些重构手法有多成熟106
    • 第6章 重新组织函数
    • 6.1 ExtractMethod(提炼函数)110
    • 6.2 InlineMethod(内联函数)117
    • 6.3 InlineTemp(内联临时变量)119
    • 6.4 ReplaceTempwithQuery(以查询取代临时变量)120
    • 6.5 IntroduceExplainingVariable(引入解释性变量)124
    • 6.6 SplitTemporaryVariable(分解临时变量)128
    • 6.7 RemoveAssignmentstoParameters(移除对参数的赋值)131
    • 6.8 ReplaceMethodwithMethodObject(以函数对象取代函数)135
    • 6.9 SubstituteAlgorithm(替换算法)139
    • 第7章 在对象之间搬移特性
    • 7.1 MoveMethod(搬移函数)142
    • 7.2 MoveField(搬移字段)146
    • 7.3 ExtractClass(提炼类)149
    • 7.4 InlineClass(将类内联化)154
    • 7.5 HideDelegate(隐藏“委托关系”)157
    • 7.6 RemoveMiddleMan(移除中间人)160
    • 7.7 IntroduceForeignMethod(引入外加函数)162
    • 7.8 IntroduceLocalExtension(引入本地扩展)164
    • 第8章 重新组织数据
    • 8.1 SelfEncapsulateField(自封装字段)171
    • 8.2 ReplaceDataValuewithObject(以对象取代数据值)175
    • 8.3 ChangeValuetoReference(将值对象改为引用对象)179
    • 8.4 ChangeReferencetoValue(将引用对象改为值对象)183
    • 8.5 ReplaceArraywithObject(以对象取代数组)186
    • 8.6 DuplicateObservedData(复制“被监视数据”)189
    • 8.7 ChangeUnidirectionalAssociationtoBidirectional(将单向关联改为双向关联)197
    • 8.8 ChangeBidirectionalAssociationtoUnidirectional(将双向关联改为单向关联)200
    • 8.9 ReplaceMagicNumberwithSymbolicConstant(以字面常量取代魔法数)204
    • 8.10 EncapsulateField(封装字段)206
    • 8.11 EncapsulateCollection(封装集合)208
    • 8.12 ReplaceRecordwithDataClass(以数据类取代记录)217
    • 8.13 ReplaceTypeCodewithClass(以类取代类型码)218
    • 8.14 ReplaceTypeCodewithSubclasses(以子类取代类型码)223
    • 8.15 ReplaceTypeCodewithState/Strategy(以State/Strategy取代类型码)227
    • 8.16 ReplaceSubclasswithFields(以字段取代子类)232
    • 第9章 简化条件表达式
    • 9.1 DecomposeConditional(分解条件表达式)238
    • 9.2 ConsolidateConditionalExpression(合并条件表达式)240
    • 9.3 ConsolidateDuplicateConditionalFragments(合并重复的条件片段)243
    • 9.4 RemoveControlFlag(移除控制标记)245
    • 9.5 ReplaceNestedConditionalwithGuardClauses(以卫语句取代嵌套条件表达式)250
    • 9.6 ReplaceConditionalwithPolymorphism(以多态取代条件表达式)255
    • 9.7 IntroduceNullObject(引入Null对象)260
    • 9.8 IntroduceAssertion(引入断言)267
    • 第10章 简化函数调用
    • 10.1 RenameMethod(函数改名)273
    • 10.2 AddParameter(添加参数)275
    • 10.3 RemoveParameter(移除参数)277
    • 10.4 SeparateQueryfromModifier(将查询函数和修改函数分离)279
    • 10.5 ParameterizeMethod(令函数携带参数)283
    • 10.6 ReplaceParameterwithExplicitMethods(以明确函数取代参数)285
    • 10.7 PreserveWholeObject(保持对象完整)288
    • 10.8 ReplaceParameterwithMethods(以函数取代参数)292
    • 10.9 IntroduceParameterObject(引入参数对象)295
    • 10.10 RemoveSettingMethod(移除设值函数)300
    • 10.11 HideMethod(隐藏函数)303
    • 10.12 ReplaceConstructorwithFactoryMethod(以工厂函数取代构造函数)304
    • 10.13 EncapsulateDowncast(封装向下转型)308
    • 10.14 ReplaceErrorCodewithException(以异常取代错误码)310
    • 10.15 ReplaceExceptionwithTest(以测试取代异常)315
    • 第11章 处理概括关系
    • 11.1 PullUpField(字段上移)320
    • 11.2 PullUpMethod(函数上移)322
    • 11.3 PullUpConstructorBody(构造函数本体上移)325
    • 11.4 PushDownMethod(函数下移)328
    • 11.5 PushDownField(字段下移)329
    • 11.6 ExtractSubclass(提炼子类)330
    • ……
    • 2第13章 重构,复用与现实