步步为营 .NET 代码重构学习笔记 十四
2011-06-06 22:17
681 查看
一、FormTempllateMethod(塑造模板函数)
动机(Motivation)
有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。
示例
改为
二、ReplaceInheritancewithDelegation(以委托取代继承)
动机(Motivation)
某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
示例
改为
三、ReplaceDelegationwithInheritance(以继承取代委托)
动机(Motivation)
如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegatingmethods),请回头使用继承。
示例
改为
四、TeaseApartInheritance(梳理并分解继承体系)
动机(Motivation)
某个继承体系(inheritancehierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。
示例
改为
五、ConvertProceduralDesigntoObjects(将过程化设计转化为对象设计)
动机(Motivation)
有一些代码,以传统的过程化风格(proceduralstyle)写就。将数据记录(datarecords)变成对象,将形为分开,并将行为移入相关对象之中。
示例
改为
六、SeparateDomainfromPresentation(将领域和表述/显示分离)
动机(Motivation)
某些GUIclasses之中包含了domainlogic(领域逻辑)。将domainlogic(领域逻辑)分离出来,为它们建立独立的domainclasses。
示例
改为
七、ExtractHierarchy(提炼继承体系)
动机(Motivation)
有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。
示例
改为
步步为营.NET代码重构学习笔记系列
步步为营.NET代码重构学习笔记一、为何要代码重构
步步为营.NET代码重构学习笔记二、提炼方法(ExtractMethod)
步步为营.NET代码重构学习笔记三、内联方法(InlineMethod)
步步为营.NET代码重构学习笔记四、临时变量(TemporaryVariable)
步步为营.NET代码重构学习笔记五、分解函数和替换算法(ReplaceMethodAndSubstituteAlgorithm)
步步为营.NET代码重构学习笔记六、移动函数和移动值域(MoveMethodAndMoveField)
步步为营.NET代码重构学习笔记七
步步为营.NET代码重构学习笔记八
步步为营.NET代码重构学习笔记九
步步为营.NET代码重构学习笔记十
步步为营.NET代码重构学习笔记十一
步步为营.NET代码重构学习笔记十二
步步为营.NET代码重构学习笔记十三
动机(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 | } |
动机(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 | } |
动机(Motivation)
如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegatingmethods),请回头使用继承。
示例
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 |
动机(Motivation)
某个继承体系(inheritancehierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。
示例
改为
五、ConvertProceduralDesigntoObjects(将过程化设计转化为对象设计)
动机(Motivation)
有一些代码,以传统的过程化风格(proceduralstyle)写就。将数据记录(datarecords)变成对象,将形为分开,并将行为移入相关对象之中。
示例
改为
六、SeparateDomainfromPresentation(将领域和表述/显示分离)
动机(Motivation)
某些GUIclasses之中包含了domainlogic(领域逻辑)。将domainlogic(领域逻辑)分离出来,为它们建立独立的domainclasses。
示例
改为
七、ExtractHierarchy(提炼继承体系)
动机(Motivation)
有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。
示例
改为
步步为营.NET代码重构学习笔记系列
相关文章推荐
- 步步为营 .NET 代码重构学习笔记 十四
- 步步为营 .NET 代码重构学习笔记 七
- 步步为营 .NET 代码重构学习笔记 十
- 步步为营 .NET 代码重构学习笔记 十
- 步步为营 .NET 代码重构学习笔记 七
- 步步为营 .NET 代码重构学习笔记 十三
- 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
- 步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)
- 步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
- 步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Move Field)
- 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
- 步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)
- 步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)
- 步步为营 .NET 代码重构学习笔记 四、分解函数和替换算法(Replace Method And Substitute Algorithm)
- [转]步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 八
- 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)