zoukankan      html  css  js  c++  java
  • 步步为营 .NET 代码重构学习笔记 八

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

    动机(Motivation)

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

    示例

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

    改为

            public DateTime  NextDate()
            {
                return  DateTime.Now.AddDays(1);
             
            }

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

    动机(Motivation)

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

    示例

            protected void Main()
            {
                Computer _computer;
                StringBuilder strCom = new StringBuilder();
                strCom.AppendLine("你的电脑配置如下:");
                strCom.AppendLine("主板是:" + _computer.MainBoard());
                strCom.AppendLine("处理器是:" + _computer.Cpu());
                strCom.AppendLine("显卡是:" + _computer.PhenoType());
                strCom.AppendLine("内存是:" + _computer.Memory());
                strCom.AppendLine("硬盘是:" + _computer.HardDisk());
                strCom.AppendLine("显示器是:" + _computer.Display());
                strCom.AppendLine("己组装完成");
                Console.WriteLine(strCom.ToString);
            }

    改为

       protected void Main()
            {
                Console.WriteLine(ShowComputerConfigure());
            }
    
            public string ShowComputerConfigure()
            {
                Computer _computer;
                StringBuilder strCom = new StringBuilder();
                strCom.AppendLine("你的电脑配置如下:");
                strCom.AppendLine("主板是:" + _computer.MainBoard());
                strCom.AppendLine("处理器是:" + _computer.Cpu());
                strCom.AppendLine("显卡是:" + _computer.PhenoType());
                strCom.AppendLine("内存是:" + _computer.Memory());
                strCom.AppendLine("硬盘是:" + _computer.HardDisk());
                strCom.AppendLine("显示器是:" + _computer.Display());
                strCom.AppendLine("己组装完成");
    
                return strCom.ToString();
            }

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

    动机(Motivation)

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

    示例

            public  int _low, _high;
            public bool Includes(int arg)
            {
                return arg >= _low && arg <= _high;
            }

    改为

            private int _low, _high;
    
            public int Low
            {
                get { return _low; }
                set { _low = value; }
            }
    
            public int High
            {
                get { return _high; }
                set { _high = value; }
            }
    
            public bool Includes(int arg)
            {
                return arg >= Low && arg <= High;
            }

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

    动机(Motivation)

    将数据项变成一个对象

    示例

        public class Customer
        {
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
        }

    改为

        public class Customer
        {
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            public Customer(string name)
            {
                this._name = name;
            }
        }

    引用时

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

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

    动机(Motivation)

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

    示例

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

    改为

     private Dictionary<string, Customer> dicUserName = new Dictionary<string, Customer>();
    
            public void GetCustomers()
            {
                string[] UserName = { dicUserName.TryGetValue("Spring Yang"), dicUserName.TryGetValue("Lemon Car"),
                                        dicUserName.TryGetValue("Associated Coffee") };
            }
    
            private void LoadCustomers()
            {
                AddCustomer("Spring Yang");
                AddCustomer("Lemon Car");
                AddCustomer("Associated Coffee");
            }
    
            private void AddCustomer(string name)
            {
                dicUserName.Add(name, new Customer(name));
            }

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

    动机(Motivation)

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

    示例

     private Dictionary<string, Customer> dicUserName = new Dictionary<string, Customer>();
    
            public void GetCustomers()
            {
                string[] UserName = { dicUserName.TryGetValue("Spring Yang"), dicUserName.TryGetValue("Lemon Car"),
                                        dicUserName.TryGetValue("Associated Coffee") };
            }
    
            private void LoadCustomers()
            {
                AddCustomer("Spring Yang");
                AddCustomer("Lemon Car");
                AddCustomer("Associated Coffee");
            }
    
            private void AddCustomer(string name)
            {
                dicUserName.Add(name, new Customer(name));
            }

    改为

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

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

    动机(Motivation)

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

    示例

            public void Main()
            {
                string[] UserInfo = new string[3];
                UserInfo[0] = "1";
                UserInfo[1] = "spring yang";
                UserInfo[2] = "IT";
            }

    改为

            public void Main()
            {
                User user = new User();
                user.ID = "1";
                user.Name = "spring yang";
                user.Depart = "IT";
            }
  • 相关阅读:
    python爬虫23 | 手机,这次要让你上来自己动了。这就是 Appium+Python 的牛x之处
    python爬虫22 | 以后我再讲python「模拟登录」我就是狗
    python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别
    phpcms 之 日期时间标签的调用
    phpcms 友情链接的调用
    在网页中嵌入百度地图的步骤(转)
    jquery 怎么取select选中项 自定义属性的值
    PHP实现根据银行卡号判断银行
    数据库基础
    从输入网址到显示网页的过程中发生了什么?(转自88旧港)
  • 原文地址:https://www.cnblogs.com/springyangwc/p/2062474.html
Copyright © 2011-2022 走看看