遇见火星女孩动画片:步步为营 .NET 代码重构学习笔记 十一
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 17:22:48
步步为营 .NET 代码重构学习笔记 十一
2011-06-01 22:23byspring yang,1071visits,网摘,收藏,编辑步步为营 .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 代码重构学习笔记 八
步步为营 .NET 代码重构学习笔记 九
步步为营 .NET 代码重构学习笔记 十
一、Remove Control Flag(移除控制标记)
动机(Motivation)
以break语句或return语句取代控制标记。
示例
01
public
void
CheckSecurity(
string
[] people)
02
{
03
string
found =
string
.Empty;
04
for
(
int
i = 0; i < people.Length; i++)
05
{
06
if
(found.Equals(
""
))
07
{
08
if
(people[i].Equals(
"Don"
))
09
{
10
found =
"Don"
;
11
}
12
if
(people[i].Equals(
"John"
))
13
{
14
found =
"John"
;
15
}
16
}
17
}
18
SomeDataCode(found);
19
}
改为
01
public
void
CheckSecurity(
string
[] people)
02
{
03
string
found =
string
.Empty;
04
for
(
int
i = 0; i < people.Length; i++)
05
{
06
if
(found.Equals(
""
))
07
{
08
if
(people[i].Equals(
"Don"
))
09
{
10
found =
"Don"
;
11
break
;
12
}
13
if
(people[i].Equals(
"John"
))
14
{
15
found =
"John"
;
16
break
;
17
}
18
}
19
}
20
SomeDataCode(found);
21
}
示例
01
public
string
FindPeople(
string
[] people)
02
{
03
string
found =
string
.Empty;
04
for
(
int
i = 0; i < people.Length; i++)
05
{
06
if
(found.Equals(
""
))
07
{
08
if
(people[i].Equals(
"Don"
))
09
{
10
found =
"Don"
;
11
}
12
if
(people[i].Equals(
"John"
))
13
{
14
found =
"John"
;
15
}
16
}
17
}
18
return
found;
19
}
改为
01
public
string
FindPeople(
string
[] people)
02
{
03
string
found =
string
.Empty;
04
for
(
int
i = 0; i < people.Length; i++)
05
{
06
if
(found.Equals(
""
))
07
{
08
if
(people[i].Equals(
"Don"
))
09
{
10
return
"Don"
;
11
}
12
if
(people[i].Equals(
"John"
))
13
{
14
return
"John"
;
15
}
16
}
17
}
18
return
string
.Empty;
19
}
二、Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件式)
动机(Motivation)
使用卫语句(guard clauses)表现所有特殊情况。
示例
01
public
double
GetPayAmount()
02
{
03
double
result;
04
if
(IsDead)
05
result = DeadAmount();
06
else
07
{
08
if
(IsSeparated)
09
result = SeparatedAmount();
10
else
11
{
12
if
(IsRetired)
13
result = RetiredPayAmount();
14
else
15
result = NormalPayAmount();
16
}
17
}
18
return
result;
19
}
改为
01
public
double
GetPayAmount()
02
{
03
if
(IsDead)
04
return
DeadAmount();
05
if
(IsSeparated)
06
return
SeparatedAmount();
07
if
(IsRetired)
08
return
RetiredPayAmount();
09
return
NormalPayAmount();
10
}
三、Introduce Null Object (引入Null对象)
动机(Motivation)
将null value(无效值)替换为null object(无效物)
示例
1
if
(customer ==
null
)
2
plan = BillingPlan.Basic();
3
else
4
plan = customer.GetPlan();
改为
1
public
double
GetPayAmount()
2
{
3
if
(customer.IsNull())
4
plan = BillingPlan.Basic();
5
else
6
plan = customer.GetPlan();
7
}
四、Rename Method(重新命名函数)
动机(Motivation)
修改函数名称让它人容易理解它的作用
示例
1
public
int
Getinvcdtlmt()
2
{
3
return
10;
4
}
改为
1
public
int
GetInvoiceAbleCreditLimit()
2
{
3
return
10;
4
}
五、Separate Query from Modifier(将查询函数和修改函数分离)
动机(Motivation)
建立两个不同的函数,其中一个负责查询,另一个负责修改。
示例
01
public
string
FindPeople(
string
[] people)
02
{
03
string
found =
string
.Empty;
04
for
(
int
i = 0; i < people.Length; i++)
05
{
06
if
(found.Equals(
""
))
07
{
08
if
(people[i].Equals(
"Don"
))
09
{
10
SendMail();
11
return
"Don"
;
12
}
13
if
(people[i].Equals(
"John"
))
14
{
15
SendMail();
16
return
"John"
;
17
}
18
}
19
}
20
return
string
.Empty;
21
}
改为
01
public
string
FindPeople(
string
[] people)
02
{
03
string
found = FindPeopleOne(people);
04
SendMailToPeople(found);
05
}
06
07
public
string
FindPeopleOne(
string
[] people)
08
{
09
string
found =
string
.Empty;
10
for
(
int
i = 0; i < people.Length; i++)
11
{
12
if
(found.Equals(
""
))
13
{
14
if
(people[i].Equals(
"Don"
))
15
{
16
return
"Don"
;
17
}
18
if
(people[i].Equals(
"John"
))
19
{
20
return
"John"
;
21
}
22
}
23
}
24
return
string
.Empty;
25
}
26
27
public
void
SendMailToPeople(
string
people)
28
{
29
if
(!
string
.IsNullOrEmpty(people))
30
SendMail();
31
}
六、Parameterize Method(令函数携带参数)
动机(Motivation)
建立单一函数,以参数表达那些不同的值
示例
1
public
double
TenPercentRaise()
2
{
3
return
salary * 1.1;
4
}
5
6
public
double
FivePercentRaise()
7
{
8
return
salary * 1.05;
9
}
改为
1
public
double
Raise(
double
factor)
2
{
3
return
salary * factor;
4
}
七、Replace Parameter with Explicit Methods(以明确函数取代参数)
动机(Motivation)
针对该参数的每一个可能值,建立一个独立函数。
示例
01
private
int
_height;
02
private
int
_width;
03
04
public
void
SetValue(
string
name,
int
value)
05
{
06
if
(name.Equals(
"height"
))
07
{
08
_height = value;
09
return
;
10
}
11
if
(name.Equals(
"width"
))
12
{
13
_width = value;
14
return
;
15
}
16
}
改为
01
private
int
_height;
02
private
int
_width;
03
04
public
int
Height
05
{
06
set
{ _height = value; }
07
}
08
09
public
int
Width
10
{
11
set
{ _width = value; }
12
}