好得很程序员自学网

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

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

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

一、Introduce Foreign Method(引入外加函数)

动机(Motivation)

在client class 中建立一个函数,并以一个server class实体作为第一引数(argument)。

示例

view source print ?

1 DateTime newStart = DateTime.Now.AddDays(1);

改为

view source print ?

1 public DateTime  NextDate()

2 {

3     return   DateTime.Now.AddDays(1);

4

5 }

二、Introduce Local Extension(引入本地扩展)

动机(Motivation)

建立一个新class,使它包含这些额外函数。让这个扩展品成为source class的subclass(子类)或wrapper(外覆类)。

示例

view source print ?

01 protected void Main()

02 {

03     Computer _computer;

04     StringBuilder strCom = new StringBuilder();

05     strCom.AppendLine( "你的电脑配置如下:" );

06     strCom.AppendLine( "主板是:" + _computer.MainBoard());

07     strCom.AppendLine( "处理器是:" + _computer.Cpu());

08     strCom.AppendLine( "显卡是:" + _computer.PhenoType());

09     strCom.AppendLine( "内存是:" + _computer.Memory());

10     strCom.AppendLine( "硬盘是:" + _computer.HardDisk());

11     strCom.AppendLine( "显示器是:" + _computer.Display());

12     strCom.AppendLine( "己组装完成" );

13     Console.WriteLine(strCom.ToString);

14 }

改为

view source print ?

01 protected void Main()

02      {

03          Console.WriteLine(ShowComputerConfigure());

04      }

05

06      public string ShowComputerConfigure()

07      {

08          Computer _computer;

09          StringBuilder strCom = new StringBuilder();

10          strCom.AppendLine( "你的电脑配置如下:" );

11          strCom.AppendLine( "主板是:" + _computer.MainBoard());

12          strCom.AppendLine( "处理器是:" + _computer.Cpu());

13          strCom.AppendLine( "显卡是:" + _computer.PhenoType());

14          strCom.AppendLine( "内存是:" + _computer.Memory());

15          strCom.AppendLine( "硬盘是:" + _computer.HardDisk());

16          strCom.AppendLine( "显示器是:" + _computer.Display());

17          strCom.AppendLine( "己组装完成" );

18

19          return strCom.ToString();

20      }

三、Self Encapsulate Field(自封装值域)

动机(Motivation)

为这个值域建立取值/设置函数(getting/setting methods),并且只以这些函数来访问值域。

示例

view source print ?

1 public   int _low, _high;

2 public bool Includes( int arg)

3 {

4     return arg >= _low && arg <= _high;

5 }

改为

view source print ?

01 private int _low, _high;

02

03 public int Low

04 {

05     get { return _low; }

06     set { _low = value; }

07 }

08

09 public int High

10 {

11     get { return _high; }

12     set { _high = value; }

13 }

14

15 public bool Includes( int arg)

16 {

17     return arg >= Low && arg <= High;

18 }

四、Replace Data Value with Object(以对象取代数据值)

动机(Motivation)

将数据项变成一个对象

示例

view source print ?

1 public class Customer

2 {

3     private string _name;

4     public string Name

5     {

6         get { return _name; }

7         set { _name = value; }

8     }

9 }

改为

view source print ?

01 public class Customer

02 {

03     private string _name;

04     public string Name

05     {

06         get { return _name; }

07         set { _name = value; }

08     }

09     public Customer( string name)

10     {

11         this ._name = name;

12     }

13 }

引用时

view source print ?

1 string name = new Customer( "spring yang" );

五、Change Value to Referencce(将实值对象改为引用对象)

动机(Motivation)

将value object(实值对象)变成一个reference object(引用对象)

示例

view source print ?

1 public void GetCustomers()

2 {

3     string [] UserName = { new Customer( "Spring Yang" ), new Customer( "Lemon Car" ), new Customer( "Associated Coffee" ) };

4 }

改为

view source print ?

01 private Dictionary< string , Customer> dicUserName = new Dictionary< string , Customer>();

02

03        public void GetCustomers()

04        {

05            string [] UserName = { dicUserName.TryGetValue( "Spring Yang" ), dicUserName.TryGetValue( "Lemon Car" ),

06                                    dicUserName.TryGetValue( "Associated Coffee" ) };

07        }

08

09        private void LoadCustomers()

10        {

11            AddCustomer( "Spring Yang" );

12            AddCustomer( "Lemon Car" );

13            AddCustomer( "Associated Coffee" );

14        }

15

16        private void AddCustomer( string name)

17        {

18            dicUserName.Add(name, new Customer(name));

19        }

六、Change Reference to Value(将引用对象改为实值对象)

动机(Motivation)

reference object(引用对象),很小且不可变(immutable),而且不易管理。

示例

view source print ?

01 private Dictionary< string , Customer> dicUserName = new Dictionary< string , Customer>();

02

03        public void GetCustomers()

04        {

05            string [] UserName = { dicUserName.TryGetValue( "Spring Yang" ), dicUserName.TryGetValue( "Lemon Car" ),

06                                    dicUserName.TryGetValue( "Associated Coffee" ) };

07        }

08

09        private void LoadCustomers()

10        {

11            AddCustomer( "Spring Yang" );

12            AddCustomer( "Lemon Car" );

13            AddCustomer( "Associated Coffee" );

14        }

15

16        private void AddCustomer( string name)

17        {

18            dicUserName.Add(name, new Customer(name));

19        }

改为

view source print ?

1 public void GetCustomers()

2 {

3     string [] UserName = { new Customer( "Spring Yang" ), new Customer( "Lemon Car" ), new Customer( "Associated Coffee" ) };

4 }

七、Replace Array with Object(以对象取代数组)

动机(Motivation)

以对象替换数组。对于数组中的每个元素,以一个值域表示。

示例

view source print ?

1 public void Main()

2 {

3     string [] UserInfo = new string [3];

4     UserInfo[0] = "1" ;

5     UserInfo[1] = "spring yang" ;

6     UserInfo[2] = "IT" ;

7 }

改为

view source print ?

1 public void Main()

2 {

3     User user = new User();

4     user.ID = "1" ;

5     user.Name = "spring yang" ;

6     user.Depart = "IT" ;

7 }

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于步步为营 .NET 代码重构学习笔记 七的详细内容...

  阅读:45次