一、Form Templlate Method(塑造模板函数)
动机(Motivation)
有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。
示例
01 |
public abstract class Site |
02 |
{ |
03 |
private double _unit; |
04 |
private double _rate; |
05 |
private double _taxRate; |
06 |
07 |
public double TaxRate |
08 |
{ |
09 |
get { return _taxRate; } |
10 |
set { _taxRate = value; } |
11 |
} |
12 |
13 |
public double Unit |
14 |
{ |
15 |
get { return _unit; } |
16 |
set { _unit = value; } |
17 |
} |
18 |
19 |
public double Rate |
20 |
{ |
21 |
get { return _rate; } |
22 |
set { _rate = value; } |
23 |
} |
24 |
} |
25 |
26 |
public class ResidentialSite : Site |
27 |
{ |
28 |
public double GetBillableAmount() |
29 |
{ |
30 |
double baseAmount = Unit * Rate; |
31 |
double tax = baseAmount * TaxRate; |
32 |
return basePrice + tax; |
33 |
} |
34 |
} |
35 |
36 |
public class LifeLineSite : Site |
37 |
{ |
38 |
public double GetBillableAmount() |
39 |
{ |
40 |
double baseAmount = Unit * Rate*0.5; |
41 |
double tax = baseAmount * TaxRate*0.2; |
42 |
return basePrice + tax; |
43 |
} |
44 |
} |
改为
01 |
public abstract class Site |
02 |
{ |
03 |
private double _unit; |
04 |
private double _rate; |
05 |
private double _taxRate; |
06 |
07 |
public double TaxRate |
08 |
{ |
09 |
get { return _taxRate; } |
10 |
set { _taxRate = value; } |
11 |
} |
12 |
13 |
public double Unit |
14 |
{ |
15 |
get { return _unit; } |
16 |
set { _unit = value; } |
17 |
} |
18 |
19 |
public double Rate |
20 |
{ |
21 |
get { return _rate; } |
22 |
set { _rate = value; } |
23 |
} |
24 |
public abstract double GetBaseAmount(); |
25 |
public abstract double GetTaxAmount(); |
26 |
public double GetBillAbleAmount() |
27 |
{ |
28 |
return GetBaseAmount() + GetTaxAmount(); |
29 |
} |
30 |
|
31 |
} |
32 |
33 |
public class ResidentialSite : Site |
34 |
{ |
35 |
public override double GetBaseAmount() |
36 |
{ |
37 |
return Unit * Rate; |
38 |
} |
39 |
40 |
public override double GetTaxAmount() |
41 |
{ |
42 |
return baseAmount * TaxRate; ; |
43 |
} |
44 |
} |
45 |
46 |
public class LifeLineSite : Site |
47 |
{ |
48 |
public override double GetBaseAmount() |
49 |
{ |
50 |
return Unit * Rate * 0.5; |
51 |
} |
52 |
53 |
public override double GetTaxAmount() |
54 |
{ |
55 |
return baseAmount * TaxRate * 0.2; |
56 |
} |
57 |
} |
二、Replace Inheritance with Delegation(以委托取代继承)
动机(Motivation)
某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
示例
01 |
public class Vector |
02 |
{ |
03 |
public int Size() |
04 |
{ |
05 |
return 100; |
06 |
} |
07 |
08 |
public bool IsEmpte() |
09 |
{ |
10 |
return false ; |
11 |
} |
12 |
} |
13 |
14 |
public class MyStack : Vector |
15 |
{ |
16 |
17 |
} |
改为
01 |
public class Vector |
02 |
{ |
03 |
public int Size() |
04 |
{ |
05 |
return 100; |
06 |
} |
07 |
08 |
public bool IsEmpty() |
09 |
{ |
10 |
return false ; |
11 |
} |
12 |
} |
13 |
14 |
public class MyStack |
15 |
{ |
16 |
private Vector _vector; |
17 |
18 |
public int Size() |
19 |
{ |
20 |
return _vector.Size(); |
21 |
} |
22 |
} |
三、Replace Delegation with Inheritance(以继承取代委托)
动机(Motivation)
如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegating methods),请回头使用继承。
示例
01 |
public class Vector |
02 |
{ |
03 |
public int Size() |
04 |
{ |
05 |
return 100; |
06 |
} |
07 |
08 |
public bool IsEmpty() |
09 |
{ |
10 |
return false ; |
11 |
} |
12 |
} |
13 |
14 |
public class MyStack |
15 |
{ |
16 |
private Vector _vector; |
17 |
18 |
public int Size() |
19 |
{ |
20 |
return _vector.Size(); |
21 |
} |
22 |
23 |
public bool IsEmpty() |
24 |
{ |
25 |
return _vector.IsEmpty(); |
26 |
} |
27 |
} |
改为
01 |
public class Vector |
02 |
{ |
03 |
public int Size() |
04 |
{ |
05 |
return 100; |
06 |
} |
07 |
08 |
public bool IsEmpte() |
09 |
{ |
10 |
return false ; |
11 |
} |
12 |
} |
13 |
14 |
public class MyStack : Vector |
15 |
{ |
16 |
17 |
} |
1 |
|
1 |
|
1 |
|
四、Tease Apart Inheritance(梳理并分解继承体系)
动机(Motivation)
某个继承体系(inheritance hierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。
示例
改为
五、Convert Procedural Design to Objects(将过程化设计转化为对象设计)
动机(Motivation)
有一些代码,以传统的过程化风格(procedural style)写就。将数据记录(data records)变成对象,将形为分开,并将行为移入相关对象之中。
示例
改为
六、Separate Domain from Presentation(将领域和表述/显示分离)
动机(Motivation)
某些GUI classes之中包含了domain logic(领域逻辑)。将domain logic(领域逻辑)分离出来,为它们建立独立的domain classes。
示例
改为
七、Extract Hierarchy(提炼继承体系)
动机(Motivation)
有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。
示例
改为
步步为营 .NET 代码重构学习笔记系列
步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)
步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)