剑弑 发表于 2019-3-21 23:45:15

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

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

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


      public Order(string customer)
      {
            Customers = customer;
      }
    }
有这样的一个函数使用Order
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 类
    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类就变成
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
页: [1]
查看完整版本: 重构之以对象取代数据值(Replace Data Value With Object)