Skip to content

Commit 512c177

Browse files
author
xujiashu
committed
7.1 doing
1 parent e8a7682 commit 512c177

2 files changed

+147
-1
lines changed

第6章 重新组织函数.md

+94
Original file line numberDiff line numberDiff line change
@@ -372,3 +372,97 @@ class Account{
372372
}
373373
```
374374

375+
**重构后**
376+
377+
```java
378+
class Gamma{
379+
private final Account _account;
380+
private int inputVal;
381+
private int quantityVal;
382+
private int yearToDate;
383+
private int importValue1;
384+
private int importValue2;
385+
private int importValue3;
386+
Gamma(Account source,int inputValArg,int quantityArg,int yearToDateArg){impo
387+
_account=source;
388+
inputVal = inputValArg;
389+
quantityVal=quantityArg;
390+
yearToDate = yearToDateArg;
391+
392+
}
393+
int commpute(){
394+
importantValue1 =(inputVal*quantity)+_account.delta();
395+
importantValue2 = (inputVal*yearToDate)+100;
396+
importantThing()
397+
int importantValue3= importantValue2*7;
398+
//and so on
399+
return importantValue3 - 2* importantValue1;
400+
}
401+
}
402+
int gamma(int inputVal,int quantity,int yearToDate){
403+
return new Gamma(this,inputVal,quantity,yearToDate).commpute();
404+
}
405+
void importantThing(){
406+
if((yearToDate-importantValue1)>100){
407+
importantValue2-=20;
408+
}
409+
}
410+
```
411+
412+
##### 6.9 Substitute Algorithm(替换算法)
413+
414+
你想要把某个算法替换成另一个更清晰的算法。
415+
416+
**将函数本体替换为另一个算法。**
417+
418+
```java
419+
String foundPerson(String[] people){
420+
for(int i=0;i<people.length;i++){
421+
if(people[i].euqals("Don")){
422+
return "Don";
423+
}
424+
if(people[i].equals("John")){
425+
return "John";
426+
}
427+
if(people[i].equals("Kent")){
428+
return "kent";
429+
}
430+
}
431+
return "";
432+
}
433+
```
434+
435+
436+
437+
**重构后**
438+
439+
```java
440+
String foundPerson(String[] people){
441+
List candidates = Arrays.asList(new String[]{"Don","John","kent"});
442+
for(int i=0;i<people.length;i++){
443+
if(candidates.contains(people[i])){
444+
return people[i];
445+
}
446+
}
447+
return "";
448+
}
449+
```
450+
451+
452+
453+
**动机**
454+
455+
- 重构可以把一些复杂东西简单化,但有时必须装饰断腕,删掉整个算法,代之简单算法。
456+
- 使用这项重构手法之前,先确定自己已经尽可能分解了原先函数。
457+
458+
**做法**
459+
460+
- 准备好另一个(替换用)算法,让它通过编译。
461+
462+
- 针对现有测试,执行上述的新算法。如果结果与原本结果相同,重构结束。
463+
464+
- 入股屙屎结果不同于原先,在测试和调试过程中,以旧算法为比较参照标准。
465+
466+
> 对于每个测试用例,分别以新旧算法运行,并观察两者结果是否相同。这可帮助你看到哪一个测试用例出现麻烦,以及出现了怎么的麻烦。
467+
468+
+53-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,54 @@
1-
#### 第六章 重新组织函数
1+
#### 第七章 在对象之间搬移特性
2+
3+
##### 7.1 Move Method(搬移函数)
4+
5+
你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流,调用后者或被后者调用。
6+
7+
**在该函数最常引用的类中建立一个有着类似行为的新函数。将就函数变成一个单纯的委托函数,或是将旧函数完全移除**
8+
9+
**动机**
10+
11+
- 如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。
12+
13+
**做法**
14+
15+
- 检查源类中被源函数所使用的一切特性(包含字段和函数),考虑他们是否也该被搬移。
16+
17+
> 如果某个特性制备你打算搬移的那个函数用到,就应该将它一并搬移。如果另有其他函数使用了这个特性,你可以考虑将使用该特性的所有函数全都一并搬移。有时候,搬移一组函数比注意搬移简单些。
18+
19+
- 检查源类的子类和超类,看看是否有该函数的其他声明。
20+
21+
> 如果出现其他声明,你或许无法进行搬移,除非目标类也同样出现多态性。
22+
23+
- 在目标类中声明这个函数。
24+
25+
> 你可以为此函数选择一个新名词—对目标类更有意义的名称。
26+
27+
- 将原函数的代码复制到目标函数中,调整后者,使其能在新家中正常运行。
28+
29+
> 如果目标函数使用了源类中的特性,你得决定如何从目标函数引用源对象。如果目标类中没有相应的引用机制,就把源对象的引用当做参数,传给新建立的目标函数。
30+
31+
> 如果原函数包含异常处理,你得判断逻辑上应该由哪个类来处理这一异常。如果应该由源类来负责,就把异常处理留在原地。
32+
33+
- 编译目标类
34+
35+
- 决定如何从原函数正确引用目标对象
36+
37+
> 可能会有一个现成的字段或函数帮助你取得目标对象。如果没有,就看能否轻松建立一个这样的函数。如果还是不行,就得在源类中新建一个字段来保存目标对象,这可能是一个永久性修改,但你也可以让他是暂时的。因为后继的其他重构项目可能会把这个新建字段去掉。
38+
39+
- 修改原函数,使之成为一个纯委托函数。
40+
41+
- 编译测试。
42+
43+
- 决定是否删除原函数,或是将它当做一个委托函数保留下来。
44+
45+
> 如果你经常要在源对象中引用目标函数,那么将原函数作为委托函数保留下来会比较简单。
46+
47+
- 如果要移除原函数,请将源类中对原函数的所有调用,替换成对目标函数的调用。
48+
49+
> 你可以没修改一个引用点就编译并测试一次,也可以通过一次“查找、替换”改掉所有引用点,这通常会简单一些。
50+
51+
- 编译测试。
52+
53+
-
254

0 commit comments

Comments
 (0)