步步为营 .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 }
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于步步为营 .NET 代码重构学习笔记 九的详细内容...