您的位置:首页 > 编程语言

步步为营 .NET 代码重构学习笔记 十四

2011-06-06 22:17 681 查看
一、FormTempllateMethod(塑造模板函数)

动机(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
}
二、ReplaceInheritancewithDelegation(以委托取代继承)

动机(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
}
三、ReplaceDelegationwithInheritance(以继承取代委托)

动机(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
四、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代码重构学习笔记十三
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: