Spiga

一天一个重构方法(36):封装群集

2009-09-30 18:54:22

Encapsulate Collection:封装群集

有个方法返回一个群集。让这个方法返回该群集的一个只读映件,并在这个类中提供添加/删除(add/remove)群集元素的方法。因此,以可迭代但不直接在集合上进行操作的方式来暴露集合,是个不错的主意。我们来看代码:

public class Order
{
	private int _orderTotal;
	private List<OrderLine> _orderLines;
	public IEnumerable<OrderLine> OrderLines
	{
		get { return _orderLines; }
	}
	public void AddOrderLine(OrderLine orderLine)
	{
		_orderTotal += orderLine.Total;
		_orderLines.Add(orderLine);
	}
	public void RemoveOrderLine(OrderLine orderLine)
	{
		orderLine = _orderLines.Find(o => o == orderLine);
		if (orderLine == null) return;
		_orderTotal -= orderLine.Total;
		_orderLines.Remove(orderLine);
	}
}

如你所见,我们对集合进行了封装,没有将Add/Remove 方法暴露给类的使用者。在.NET Framework中,有些类如ReadOnlyCollection,会由于封装集合而产生不同的行为,但它们各自都有防止误解的说明。这是一个非常简单但却极具价值的重构,可以确保用户不会误用你暴露的集合,避免代码中的一些bug。