好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

步步为营 .NET 代码重构学习笔记 九

步步为营 .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 代码重构学习笔记 九的详细内容...

  阅读:43次