马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

重构之以对象取代数据值(Replace Data Value With Object)

  [复制链接]
查看3621 | 回复4 | 2019-3-21 23:45:15 | 显示全部楼层 |阅读模式
          开发初期,当我们要对一些数据项进行操作时,往往都会以简单的情况表示;但随着开发进度的推进,要操作的数据项越来越来,数据项行为也会越来越多,这时候简单的数据项就不在简单了。比如,一开始我们用一个字符串表示“客户(名称)”概念,但随着开发进度的推进,“客户(名称)”需要有地址,有简称,我们还有订单跟“客户(名称)”进行交互。如果只有一两个地方用到还要,我们可以把相关函数/属性放到数据项相关所属的对象里;当用的地方多的时候,重复代码会越来越多,依赖性会越来越强最后导致可读性差,扩展性低,藕合度高,这会是很糟糕的情况。这时,我们的“以对象取代数据值(Replace Data Value With Object)”就最很好的帮到我们。我们有这样的一个Order类
[C#] 纯文本查看 复制代码
    class Order
    {
        private string _customer;

        public string Customers
        {
            get { return _customer; }
            set { _customer = value; }
        }


        public Order(string customer)
        {
            Customers = customer;
        }
    }

有这样的一个函数使用Order
[C#] 纯文本查看 复制代码
private static int numberofOrdersFor(List<Order> orders, string customer)
        {
            int result = 0;
            foreach (Order item in orders)
            {
                if (item.Customers.Equals(customer))
                {
                    result++;
                }
            }
            return result;
        }

现在我希望用一个对象来表示客户,这样我们就可以保存客户的简称、公司地址等信息便于使用,所以我们要新建这样的一个Customers 类
[C#] 纯文本查看 复制代码
    public class Customer
    {
        private string _name;
        /// <summary>
        /// 名称
        /// </summary>
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private string _jName;
        /// <summary>
        /// 简称
        /// </summary>
        public string JName
        {
            get { return _jName; }
            set { _jName = value; }
        }

        private string _address;
        /// <summary>
        /// 地址
        /// </summary>
        public string Address
        {
            get { return _address; }
            set { _address = value; }
        }

    }

然后,Order类就变成
[C#] 纯文本查看 复制代码
class Order
{
private string _customer;

public string Customers
{
get { return _customer; }
set { _customer = value; }
}


public Order(string customer)
{
 CustomerClass =  new Customer();
CustomerClass.Name = customer;
}
        public Order(string customer,string jname)
        {
            CustomerClass = new Customer();
            CustomerClass.Name = customer;
            CustomerClass.JName = jname;
        }

        public Order(Customer Customer)
        {
            CustomerClass = Customer;
        }
}

从上面的三个构造函数就可以看出Order类对客户的操作就更自由了,可读性、扩展性也更好了、藕合度也降低了。

参考文献
重构——改善既有代码的设计   【美】Martin Fowler 著
                                                                         熊节 译







剑弑 | 2019-3-21 23:47:58 | 显示全部楼层
至于numberofOrdersFor函数,我们就可以随意的更改/扩展、优化功能。
ibcadmin | 2019-3-25 16:32:58 | 显示全部楼层
66666
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则