第1章 本书的写作缘由1.1 过度设计1.2 模式万灵丹1.3 设计不足1.4 测试驱动开发和持续重构1.5 重构与模式1.6 演进式设计第2章 重构2.1 何谓重构2.2 重构的动机2.3 众目睽睽2.4 可读性好的代码2.5 保持清晰2.6 循序渐进2.7 设计欠账2.8 演变出新的架构2.9 复合重构与测试驱动的重构2.10 复合重构的优点2.11 重构工具第3章 模式3.1 何谓模式3.2 模式痴迷3.3 实现模式的方式不止一种3.4 通过重构实现、趋向和去除模式3.5 模式是否会使代码更加复杂3.6 模式知识3.7 使用模式的预先设计第4章 代码坏味4.1 重复代码(Duplicated Code)4.2 过长函数(Long Method)4.3 条件逻辑太复杂(Conditional Complexity)4.4 基本类型偏执(Primitive Obsession)4.5 不恰当的暴露(Indecent Exposure)4.6 解决方案蔓延(Solution Sprawl)4.7 异曲同工的类(Alternative Classes with Different Interfaces)4.8 冗赘类(Lazy Class)4.9 过大的类(Large Class)4.10 分支语句(Switch Statement)4.11 组合爆炸(Combinatorial Explosion)4.12 怪异解决方案(Oddball Solution)第5章 模式导向的重构目录5.1 重构的格式5.2 本目录中引用的项目5.2.1 XML Builder5.2.2 HTML Parser5.2.3 贷款风险计算程序5.3 起点5.4 学习顺序第6章 创建6.1 用Creation Method替换构造函数6.1.1 动机6.1.2 做法6.1.3 示例6.1.4 变体6.2 将创建知识搬移到Factory6.2.1 动机6.2.2 做法6.2.3 示例6.3 用Factory封装类6.3.1 动机6.3.2 做法6.3.3 示例6.3.4 变体6.4 用Factory Method引入多态创建6.4.1 动机6.4.2 做法6.4.3 示例6.5 用Builder封装Composite6.5.1 做法6.5.2 示例6.5.3 变体6.6 内联Singleton6.6.1 动机6.6.2 做法6.6.3 示例第7章 简化7.1 组合方法7.1.1 动机7.1.2 做法7.1.3 示例7.2 用Strategy替换条件逻辑7.2.1 动机7.2.2 做法7.2.3 示例7.3 将装饰功能搬移到Decorator7.3.1 动机7.3.2 做法7.3.3 示例7.4 用State替换状态改变条件语句7.4.1 动机7.4.2 做法7.4.3 示例7.5 用Composite替换隐含树7.5.1 动机7.5.2 做法7.5.3 示例7.6 用Command替换条件调度程序7.6.1 动机7.6.2 做法7.6.3 示例第8章 泛化8.1 形成Template Method8.1.1 动机8.1.2 做法8.1.3 示例8.2 提取Composite8.2.1 动机8.2.2 做法8.2.3 示例8.3 用Composite替换一/多之分8.3.1 动机8.3.2 做法8.3.3 示例8.4 用Observer替换硬编码的通知8.4.1 动机8.4.2 做法8.4.3 示例8.5 通过Adapter统一接口8.5.1 动机8.5.2 做法8.5.3 示例8.6 提取Adapter8.6.1 动机8.6.2 做法8.6.3 示例8.6.4 变体8.7 用Interpreter替换隐式语言8.7.1 动机8.7.2 做法8.7.3 示例第9章 保护9.1 用类替换类型代码9.1.1 动机9.1.2 做法9.1.3 示例9.2 用Singleton限制实例化9.2.1 动机9.2.2 做法9.2.3 示例9.3 引入Null Object9.3.1 动机9.3.2 做法9.3.3 示例第10章 聚集操作10.1 将聚集操作搬移到Collecting Parameter10.1.1 动机10.1.2 做法10.1.3 示例10.2 将聚集操作搬移到Visitor10.2.1 动机10.2.2 做法10.2.3 示例第11章 实用重构11.1 链构造函数11.1.1 动机11.1.2 做法11.1.3 示例11.2 统一接口11.2.1 动机11.2.2 做法11.2.3 示例11.3 提取参数11.3.1 动机11.3.2 做法11.3.3 示例跋参考文献索引
^ 收 起