步步为营 .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<Customer> CustomerList = new List<Customer>();
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<Order> orderlist = new List<Order>();
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<Customer> CustomerList = new List<Customer>();
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<Order> orderlist = new List<Order>();
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    }
posted @ 2011-06-02 00:25  网络金领  阅读(264)  评论(0编辑  收藏  举报