33
33
* [ 21. Refused Bequest(被拒绝的馈赠)] ( #21-refused-bequest被拒绝的馈赠 )
34
34
* [ 22. Comments(过多的注释)] ( #22-comments过多的注释 )
35
35
* [ 构筑测试体系] ( #构筑测试体系 )
36
- * [ 重构列表] ( #重构列表 )
37
36
* [ 重新组织函数] ( #重新组织函数 )
38
37
* [ 1. Extract Method(提炼函数)] ( #1-extract-method提炼函数 )
39
38
* [ 2. Inline Method(内联函数)] ( #2-inline-method内联函数 )
@@ -270,32 +269,36 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl
270
269
271
270
## 5. Divergent Change (发散式变化)
272
271
273
- 一个类受到多种变化的影响;
272
+ 设计原则:一个类应该只有一个引起改变的原因。也就是说,针对某一外界变化所有相应的修改,都只应该发生在单一类中。
274
273
275
274
针对某种原因的变化,使用 Extract Class 将它提炼到一个类中。
276
275
277
276
## 6. Shotgun Surgery (散弹式修改)
278
277
279
278
一个变化引起多个类修改;
280
279
281
- 使用 Move Method 和 Move Field 把所有需要修改地代码放到同一个类中 。
280
+ 使用 Move Method 和 Move Field 把所有需要修改的代码放到同一个类中 。
282
281
283
282
## 7. Feature Envy (依恋情结)
284
283
285
- 一个函数对某个类的兴趣高于对自己所处类的兴趣,通常是过多访问其它类的数据。
284
+ 一个函数对某个类的兴趣高于对自己所处类的兴趣,通常是过多访问其它类的数据,
286
285
287
286
使用 Move Method 将它移到该去的地方,如果对多个类都有 Feature Envy ,先用 Extract Method 提取出多个函数。
288
287
289
288
## 8. Data Clumps (数据泥团)
290
289
291
- 有些数据经常一起出现,比如两个类具有相同的字段、许多函数有相同的参数。使用 Extract Class 将它们放在一起。
290
+ 有些数据经常一起出现,比如两个类具有相同的字段、许多函数有相同的参数,这些绑定在一起出现的数据应该拥有属于它们自己的对象。
291
+
292
+ 使用 Extract Class 将它们放在一起。
292
293
293
294
## 9. Primitive Obsession (基本类型偏执)
294
295
295
296
使用类往往比使用基本类型更好,使用 Replace Data Value with Object 将数据值替换为对象。
296
297
297
298
## 10. Switch Statements (switch 惊悚现身)
298
299
300
+ 具体参见第一章的案例。
301
+
299
302
## 11. Parallel Inheritance Hierarchies (平行继承体系)
300
303
301
304
每当为某个类增加一个子类,必须也为另一个类相应增加一个子类。
@@ -332,19 +335,23 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl
332
335
333
336
## 18. Alernative Classes with Different Interfaces (异曲同工的类)
334
337
338
+ 两个函数做同一件事,却有着不同的签名。
339
+
340
+ 使用 Rename Method 根据它们的用途重新命名。
341
+
335
342
## 19. Incomplete Library Class (不完美的类库)
336
343
337
344
类库的设计者不可能设计出完美的类库,当我们需要对类库进行一些修改时,可以使用以下两种方法:如果只是修改一两个函数,使用 Introduce Foreign Method ;如果要添加一大堆额外行为,使用 Introduce Local Extension 。
338
345
339
346
## 20. Data Class (幼稚的数据类)
340
347
341
- 它只拥有一些数据字段。
348
+ 它只拥有一些数据字段,以及用于访问这些字段的函数,除此之外一无长物 。
342
349
343
350
找出字段使用的地方,然后把相应的操作移到 Data Class 中。
344
351
345
352
## 21. Refused Bequest (被拒绝的馈赠)
346
353
347
- 子类继承超类的所有函数和数据,但是它只想要一部分 。
354
+ 子类不想继承超类的所有函数和数据 。
348
355
349
356
为子类新建一个兄弟类,不需要的函数或数据使用 Push Down Method 和 Push Down Field 下推给那个兄弟。
350
357
@@ -356,13 +363,13 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl
356
363
357
364
Java 可以使用 Junit 进行单元测试。
358
365
359
- 单元测试的对象是类的方法,而功能测以客户的角度保证软件正常运行 。
366
+ 测试应该能够完全自动化,并能检查测试的结果。 Junit 可以做到 。
360
367
361
- 应当集中测试可能出错的边界条件 。
368
+ 小步修改,频繁测试 。
362
369
363
- # 重构列表
370
+ 单元测试的对象是类的方法,而功能测是以客户的角度保证软件正常运行。
364
371
365
- 小步前进,频繁测试 。
372
+ 应当集中测试可能出错的边界条件 。
366
373
367
374
# 重新组织函数
368
375
0 commit comments