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


    一、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 }
  • 相关阅读:
    通讯录排序(c++)
    常用头文件的可调用函数的归类笔记
    常用头文件的可调用函数的归类笔记
    一维数组基础笔记(声明,定义,调用)
    一维数组基础笔记(声明,定义,调用)
    数据库安全
    python不常见用法
    异常处理-做一个优雅的程序员
    TCP/IP
    Python基础01
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2062983.html
Copyright © 2020-2023  润新知