一、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 |
} |