重构之以对象取代数据值(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 著
熊节 译
至于numberofOrdersFor函数,我们就可以随意的更改/扩展、优化功能。 66666
页:
[1]