遇见沥川电视剧百度云:步步为营 .NET 代码重构学习笔记 九
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 15:56:28
步步为营 .NET 代码重构学习笔记 九
2011-05-30 23:14byspring yang,1108visits,网摘,收藏,编辑步步为营 .NET 代码重构学习笔记系列
步步为营 .NET 代码重构学习笔记 一、为何要代码重构
步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)
步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)
步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)
步步为营 .NET 代码重构学习笔记 七
步步为营 .NET 代码重构学习笔记 八
一、Duplicate Observed Data(复制[被监视数据])
动机(Motivation)
将该笔数据拷贝到一个domain object中。建立一个Observer模式,用以对domain object 和GUI object内的重复数据进行同步控制(sync)。
示例
步步为营 .NET 设计模式学习笔记 十二、Observer (观察者模式)
二、Change Unidirectional Association to Bidirectional(将单向关联改为双向)
动机(Motivation)
添加一个反指针,并使修改函数(modifiers)能够同时更新两条连接。
示例
01
public
class
Order
02
{
03
private
Customer _customer;
04
05
public
Customer NewCustomer
06
{
07
get
{
return
_customer; }
08
set
{ _customer = value; }
09
}
10
}
11
12
public
class
Customer
13
{
14
}
改为
01
public
class
Order
02
{
03
public
List CustomerList =
new
List();
04
05
public
void
AddCustomer(Customer arg)
06
{
07
arg.orderlist.Add(
this
);
08
CustomerList.Add(arg);
09
}
10
11
public
void
RemoveCustomer(Customer arg)
12
{
13
arg.orderlist.Remove(
this
);
14
CustomerList.Remove(arg);
15
}
16
}
17
18
public
class
Customer
19
{
20
public
List orderlist =
new
List();
21
public
void
AddOrder(Order arg)
22
{
23
arg.CustomerList.Add(
this
);
24
orderlist.Add(arg);
25
}
26
public
void
RemoveOrder(Order arg)
27
{
28
arg.CustomerList.Remove(
this
);
29
orderlist.Remove(arg);
30
}
31
}
三、Change Bidirectional Association to Unidirectional(将双向改为单向)
动机(Motivation)
两个classes之间有双向关联,但其中一个class如今不再需要另一个class的特性。
示例
01
public
class
Order
02
{
03
public
List CustomerList =
new
List();
04
05
public
void
AddCustomer(Customer arg)
06
{
07
arg.orderlist.Add(
this
);
08
CustomerList.Add(arg);
09
}
10
11
public
void
RemoveCustomer(Customer arg)
12
{
13
arg.orderlist.Remove(
this
);
14
CustomerList.Remove(arg);
15
}
16
}
17
18
public
class
Customer
19
{
20
public
List orderlist =
new
List();
21
public
void
AddOrder(Order arg)
22
{
23
arg.CustomerList.Add(
this
);
24
orderlist.Add(arg);
25
}
26
public
void
RemoveOrder(Order arg)
27
{
28
arg.CustomerList.Remove(
this
);
29
orderlist.Remove(arg);
30
}
31
}
改为
01
public
class
Order
02
{
03
private
Customer _customer;
04
05
public
Customer NewCustomer
06
{
07
get
{
return
_customer; }
08
set
{ _customer = value; }
09
}
10
}
11
12
public
class
Customer
13
{
14
}
四、Replace Magic Number with Symbolic Constant(以符号常量/字面常量取侙魔法数)
动机(Motivation)
创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。
示例
1
public
double
PotentialEnergy(
double
mass,
double
height)
2
{
3
return
mass * 9.51 * height;
4
}
改为
1
private
double
GRAVITATIONAL_CONSTANT = 9.51;
2
public
double
PotentialEnergy(
double
mass,
double
height)
3
{
4
return
mass * GRAVITATIONAL_CONSTANT * height;
5
}
五、Encapsulate Field(封装值域)
动机(Motivation)
将它声明为private,并提供相应的访问函数(accessors)
示例
1
public
string
_name;
改为
1
private
string
_name;
2
3
public
string
Name
4
{
5
get
{
return
_name; }
6
set
{ _name = value; }
7
}
六、Replace Type Code with Class(以类取代型别码)
动机(Motivation)
以一个新的class替换该数值型别码(type code)
示例
01
public
class
Person
02
{
03
public
int
O = 0;
04
public
int
A = 1;
05
public
int
B = 2;
06
public
int
AB = 3;
07
08
private
int
_bloodGroup;
09
10
public
Person(
int
bloodGroup)
11
{
12
_bloodGroup = bloodGroup;
13
}
14
public
int
NewBloodGroup
15
{
16
get
{
return
_bloodGroup; }
17
set
{ _bloodGroup = value; }
18
}
19
}
改为
01
public
class
Person
02
{
03
public
int
O = BloodGroup.O.Code;
04
public
int
A = BloodGroup.A.Code;
05
public
int
B = BloodGroup.B.Code;
06
public
int
AB = BloodGroup.AB.Code;
07
08
09
private
int
_bloodGroup;
10
11
public
Person(
int
bloodGroup)
12
{
13
_bloodGroup = bloodGroup;
14
}
15
16
public
int
NewBloodGroup
17
{
18
get
{
return
_bloodGroup; }
19
set
{ _bloodGroup = value; }
20
}
21
}
22
23
public
class
BloodGroup
24
{
25
public
static
BloodGroup O =
new
BloodGroup(0);
26
public
static
BloodGroup A =
new
BloodGroup(1);
27
public
static
BloodGroup B =
new
BloodGroup(2);
28
public
static
BloodGroup AB =
new
BloodGroup(3);
29
30
private
int
_code;
31
32
private
BloodGroup(
int
code)
33
{
34
_code = code;
35
}
36
37
public
int
Code
38
{
39
get
{
return
_code; }
40
set
{ _code = value; }
41
}
42
43
}