目录

  1. 本书的写作缘由 1
  2. 1.1 过度设计 1
  3. 1.2 模式万灵丹 2
  4. 1.3 设计不足 2
  5. 1.4 测试驱动开发和持续重构 3
  6. 1.5 重构与模式 5
  7. 1.6 演进式设计 6
  8. 重构 7
  9. 2.1 何谓重构 7
  10. 2.2 重构的动机 8
  11. 2.3 众目睽睽 9
  12. 2.4 可读性好的代码 10
  13. 2.5 保持清晰 11
  14. 2.6 循序渐进 11
  15. 2.7 设计欠账 12
  16. 2.8 演变出新的架构 13
  17. 2.9 复合重构与测试驱动的重构 13
  18. 2.10 复合重构的优点 15
  19. 2.11 重构工具 15
  20. 模式 17
  21. 3.1 何谓模式 17
  22. 3.2 模式痴迷 18
  23. 3.3 实现模式的方式不止一种 20
  24. 3.4 通过重构实现、趋向和去除模式 22
  25. 3.5 模式是否会使代码更加复杂 24
  26. 3.6 模式知识 25
  27. 3.7 使用模式的预先设计 26
  28. 代码坏味 29
  29. 4.1 重复代码(Duplicated Code) 31
  30. 4.2 方法过长(Long Method) 31
  31. 4.3 条件逻辑太复杂(Conditional Complexity) 32
  32. 4.4 基本类型迷恋(Primitive Obsession) 33
  33. 4.5 不恰当的暴露(Indecent Exposure) 33
  34. 4.6 解决方案蔓延(Solution Sprawl) 34
  35. 4.7 异曲同工的类(Alternative Classes with Different Interfaces) 34
  36. 4.8 冗赘类(Lazy Class) 34
  37. 4.9 类过大(Large Class) 34
  38. 4.10 分支语句(Switch Statement) 35
  39. 4.11 组合爆炸(Combinatorial Explosion) 35
  40. 4.12 怪异解决方案(Oddball Solution) 35
  41. 模式导向的重构目录 37
  42. 5.1 重构的格式 37
  43. 5.2 本目录中引用的项目 38
  44. 5.2.1 XML Builder 39
  45. 5.2.2 HTML Parser 39
  46. 5.2.3 贷款风险计算程序 40
  47. 5.3 起点 40
  48. 5.4 学习顺序 41
  49. 创建 43
  50. 6.1 用Creation Method替换构造函数 44
  51. 6.1.1 动机 44
  52. 6.1.2 做法 46
  53. 6.1.3 示例 46
  54. 6.1.4 变体 51
  55. 6.2 将创建知识搬移到Factory 52
  56. 6.2.1 动机 53
  57. 6.2.2 做法 55
  58. 6.2.3 示例 56
  59. 6.3 用Factory封装类 61
  60. 6.3.1 动机 62
  61. 6.3.2 做法 63
  62. 6.3.3 示例 63
  63. 6.3.4 变体 66
  64. 6.4 用Factory Method引入多态创建 68
  65. 6.4.1 动机 68
  66. 6.4.2 做法 69
  67. 6.4.3 示例 71
  68. 6.5 用Builder封装Composite 74
  69. 6.5.1 做法 76
  70. 6.5.2 示例 77
  71. 6.5.3 变体 87
  72. 6.6 内联Singleton 90
  73. 6.6.1 动机 90
  74. 6.6.2 做法 92
  75. 6.6.3 示例 93
  76. 简化 97
  77. 7.1 组合方法 98
  78. 7.1.1 动机 98
  79. 7.1.2 做法 100
  80. 7.1.3 示例 100
  81. 7.2 用Strategy替换条件逻辑 103
  82. 7.2.1 动机 103
  83. 7.2.2 做法 105
  84. 7.2.3 示例 106
  85. 7.3 将装饰功能搬移到Decorator 115
  86. 7.3.1 动机 115
  87. 7.3.2 做法 119
  88. 7.3.3 示例 120
  89. 7.4 用State替换状态改变条件语句 134
  90. 7.4.1 动机 134
  91. 7.4.2 做法 135
  92. 7.4.3 示例 136
  93. 7.5 用Composite替换隐含树 144
  94. 7.5.1 动机 144
  95. 7.5.2 做法 147
  96. 7.5.3 示例 148
  97. 7.6 用Command替换条件调度程序 155
  98. 7.6.1 动机 156
  99. 7.6.2 做法 157
  100. 7.6.3 示例 158
  101. 泛化 165
  102. 8.1 形成Template Method 166
  103. 8.1.1 动机 167
  104. 8.1.2 做法 168
  105. 8.1.3 示例 168
  106. 8.2 提取Composite 173
  107. 8.2.1 动机 173
  108. 8.2.2 做法 174
  109. 8.2.3 示例 175
  110. 8.3 用Composite替换一/多之分 181
  111. 8.3.1 动机 181
  112. 8.3.2 做法 183
  113. 8.3.3 示例 184
  114. 8.4 用Observer替换硬编码的通知 191
  115. 8.4.1 动机 191
  116. 8.4.2 做法 192
  117. 8.4.3 示例 193
  118. 8.5 通过Adapter统一接口 200
  119. 8.5.1 动机 200
  120. 8.5.2 做法 201
  121. 8.5.3 示例 202
  122. 8.6 提取Adapter 209
  123. 8.6.1 动机 209
  124. 8.6.2 做法 211
  125. 8.6.3 示例 211
  126. 8.6.4 变体 217
  127. 8.7 用Interpreter替换隐式语言 218
  128. 8.7.1 动机 218
  129. 8.7.2 做法 220
  130. 8.7.3 示例 221
  131. 保护 231
  132. 9.1 用类替换类型代码 232
  133. 9.1.1 动机 232
  134. 9.1.2 做法 234
  135. 9.1.3 示例 235
  136. 9.2 用Singleton限制实例化 240
  137. 9.2.1 动机 240
  138. 9.2.2 做法 241
  139. 9.2.3 示例 241
  140. 9.3 引入Null Object 243
  141. 9.3.1 动机 244
  142. 9.3.2 做法 245
  143. 9.3.3 示例 246
  144. 聚集操作 251
  145. 10.1 将聚集操作搬移到Collecting Parameter 252
  146. 10.1.1 动机 252
  147. 10.1.2 做法 253
  148. 10.1.3 示例 254
  149. 10.2 将聚集操作搬移到Visitor 258
  150. 10.2.1 动机 258
  151. 10.2.2 做法 262
  152. 10.2.3 示例 266
  153. 实用重构 273
  154. 11.1 链构造函数 274
  155. 11.1.1 动机 274
  156. 11.1.2 做法 275
  157. 11.1.3 示例 275
  158. 11.2 统一接口 277
  159. 11.2.1 动机 277
  160. 11.2.2 做法 278
  161. 11.2.3 示例 278
  162. 11.3 提取参数 279
  163. 11.3.1 动机 279
  164. 11.3.2 做法 279
  165. 11.3.3 示例 280
  166. 跋 281
  167. 参考文献 283
  168. 索引 287