• 推荐
  • 评论
  • 收藏

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

2022-12-01    2604次浏览

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

动机(Motivation)

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

示例

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

改为

1 public DateTime  NextDate()
2 {
3     return  DateTime.Now.AddDays(1);
4   
5 }

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

动机(Motivation)

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

示例

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 }

改为

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),并且只以这些函数来访问值域。

示例

1 public  int _low, _high;
2 public bool Includes(int arg)
3 {
4     return arg >= _low && arg <= _high;
5 }

改为

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)

将数据项变成一个对象

示例

1 public class Customer
2 {
3     private string _name;
4     public string Name
5     {
6         get { return _name; }
7         set { _name = value; }
8     }
9 }

改为

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 }

引用时

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

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

动机(Motivation)

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

示例

1 public void GetCustomers()
2 {
3     string[] UserName = { new Customer("Spring Yang"), new Customer("Lemon Car"), new Customer("Associated Coffee") };
4 }

改为

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),而且不易管理。

示例

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        }

改为

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)

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

示例

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 }

改为

1 public void Main()
2 {
3     User user = new User();
4     user.ID = "1";
5     user.Name = "spring yang";
6     user.Depart = "IT";
7 }
原文地址:https://www.cnblogs.com/Leo_wl/p/2063962.html