步步为营 .NET 代码重构学习笔记 十
一、Replace Type Code with Subclasses (以子类取代型别码)
动机(Motivation)
以 一个subclass取代这个type code,如果面对的type code不会影响宿主类的行为,可以使用Replace Type Code with Class 来处理它们。但如果type code 会影响宿主类的行为,那么最好的办法就是借助多态(polymorphism)业处理 变化行为。
示例
01 public class Employee
02 {
03 private int _type;
04 public static int ENGINEER = 0;
05 public static int SALEMAN = 1;
06 public static int MANAGER = 2;
07
08 public Employee( int type)
09 {
10 _type = type;
11 }
12 }
改为
01 public class Employee
02 {
03 private int _type;
04 public static int ENGINEER = 0;
05 public static int SALEMAN = 1;
06 public static int MANAGER = 2;
07
08 public Employee( int type)
09 {
10 _type = type;
11 }
12
13 public int Type
14 {
15 get { return _type; }
16 set { _type = value; }
17 }
18
19
20 }
21
22 public class ENGINEER : Employee
23 {
24 public int GetType()
25 {
26 return Employee.ENGINEER;
27 }
28 }
29
30 public class SALEMAN : Employee
31 {
32 public int GetType()
33 {
34 return Employee.SALEMAN;
35 }
36 }
37
38 public class MANAGER : Employee
39 {
40 public int GetType()
41 {
42 return Employee.MANAGER;
43 }
44 }
45
46 public class Factory:Employee
47 {
48 public Employee Create( int type)
49 {
50 switch (type)
51 {
52 case ENGINEER:
53 return new ENGINEER();
54 case SALEMAN:
55 return new SALEMAN();
56 case MANAGER:
57 return new MANAGER();
58 default :
59 throw new ExecutionEngineException( "Incorrect type code value" );
60 }
61 }
62 }
二、Replace Type Code with State/Strategy(以State/Strategy取代型别码)
动机(Motivation)
以State object(专门用来描述状态的对象)取代type code。
示例
01 public class Employee
02 {
03 private int _type;
04 public static int ENGINEER = 0;
05 public static int SALEMAN = 1;
06 public static int MANAGER = 2;
07
08 public Employee( int type)
09 {
10 _type = type;
11 }
12
13 public int Type
14 {
15 get { return _type; }
16 set { _type = value; }
17 }
18
19 public int PayAmount()
20 {
21 switch (_type)
22 {
23 case ENGINEER:
24 return 100;
25 case SALEMAN:
26 return 1000;
27 case MANAGER:
28 return 10000;
29 default :
30 throw new ExecutionEngineException( "Incorrect type code value" );
31 }
32 }
33
34 }
改为
01 public class Employee
02 {
03 private int _type;
04 public static int ENGINEER = 0;
05 public static int SALEMAN = 1;
06 public static int MANAGER = 2;
07
08 public Employee( int type)
09 {
10 _type = type;
11 }
12
13 public int Type
14 {
15 get { return _type; }
16 set { _type = value; }
17 }
18
19 public int PayAmount()
20 {
21 EmployeeType employeeType;
22 switch (_type)
23 {
24 case ENGINEER:
25 employeeType= new ENGINEER();
26 break ;
27 case SALEMAN:
28 employeeType= new SALEMAN();
29 break ;
30 case MANAGER:
31 employeeType = new MANAGER();
32 break ;
33 default :
34 throw new ExecutionEngineException( "Incorrect type code value" );
35 }
36 return employeeType.GetType();
37 }
38
39 }
40
41 public class ENGINEER : EmployeeType
42 {
43 public override int GetType()
44 {
45 return 100;
46 }
47 }
48
49 public class SALEMAN : EmployeeType
50 {
51 public override int GetType()
52 {
53 return 1000;
54 }
55 }
56
57 public class MANAGER : EmployeeType
58 {
59 public override int GetType()
60 {
61 return 10000;
62 }
63 }
64
65 public abstract class EmployeeType
66 {
67 public abstract int GetType();
68
69 }
三、Replace Subclass with Fields(以值域取代子类)
动机(Motivation)
修改这些函数,使它们返回superclass中的某个(新增值域,然后销毁subclasses)
示例
01 public abstract class Person
02 {
03 public abstract bool IsMale();
04 public abstract string GetCode();
05
06 public Person CreateMale()
07 {
08 return new Male();
09 }
10
11 public Person CreateFemale()
12 {
13 return new Female();
14 }
15 }
16
17 public class Male : Person
18 {
19
20 public override bool IsMale()
21 {
22 return true ;
23 }
24
25 public override string GetCode()
26 {
27 return "M" ;
28 }
29 }
30
31 public class Female : Person
32 {
33
34 public override bool IsMale()
35 {
36 return false ;
37 }
38
39 public override string GetCode()
40 {
41 return "F" ;
42 }
43 }
改为
01 public class Person
02 {
03 private bool _IsMale;
04 private string _Code;
05
06 public bool IsMale
07 {
08 get { return _IsMale; }
09 set { _IsMale = value; }
10 }
11
12 public string Code
13 {
14 get { return _Code; }
15 set { _Code = value; }
16 }
17 public Person( bool isMale, string code)
18 {
19 this ._IsMale = isMale;
20 this ._Code = code;
21 }
22 }
23
24 public class Male : Person
25 {
26
27 public Male()
28 : base ( true , "M" )
29 { }
30 }
31
32 public class Female : Person
33 {
34 public Female()
35 : base ( false , "F" )
36 { }
37 }
四、Decompose Conditional(分解条件式)
动机(Motivation)
从if、then、else三个段落中分别提炼出独立函数。
示例
1 if (date<SUMMER_START||date>SUMMER_BND)
2 charge=quantity*_winterRate+_winterServiceCharge;
3 else
4 charge=quantity*_summerRate;
改为
1 if (notSummer(date))
2 charge=winterCharge(quantity);
3 else
4 charge=summerCharge(quantity);
五、Consolidate Conditional Expression(合并条件式)
动机(Motivation)
将很多条件合并成一个条件式,并将这个条件式提炼成为一个独立函数。
示例
1 public double DisabilityAmount()
2 {
3 if (_seniority < 2) return 0;
4 if (_monthsDisabled > 12) return 0;
5 if (_isPartTime) return 0;
6 return 1;
7 }
改为
1 public double DisabilityAmount()
2 {
3 if (IsNotBligableForDisability()) return 0;
4 return 1;
5 }
六、Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
动机(Motivation)
将重复代码搬移到条件式之外。
示例
01 if (isSpecialDeal())
02 {
03 total = price * 0.95;
04 sendMail();
05 }
06 else
07 {
08 total = price * 0.98;
09 sendMail();
10 }
改为
1 if (isSpecialDeal())
2 total = price * 0.95;
3 else
4 total = price * 0.98;
5
6 sendMail();
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于步步为营 .NET 代码重构学习笔记 十的详细内容...