码迷,mamicode.com
首页 > 其他好文 > 详细

重构第一天:封装集合

时间:2014-06-24 12:37:24      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   color   get   

在一些情况下,在一个类中选择不去暴露整个集合给调用者是非常有必要的。比如当我们给一个集合添加/删除item时,我们需要添加一些额外的逻辑。因为这个原因,一个非常好的办法就是让暴露出来的collecction只能被迭代而不能被修改。让我们看下面的例子。

public class Order
{
    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);
    }
}

       正如你看到的,我们已经已经对collection进行了封装, 因为返回值是IEnumerable,_orderLines不会暴露给外界Add/Remove方法,她只能被迭代检索。采用这种办法可以确保调用者不会滥用你的collection,确保你的代码不会引入bug。

  也许有些人会说,这样做没办法做到让_orderLines绝对的安全,外部调用者还是可以把OrderLines强制转化为List, 然后进行Add/remove操作。你要是非要这么较真,那你可以稍微修改一下,通过下面的方式返回一个copy给调用者。

 

1  public IEnumerable<OrderLine> OrderLines
2  {
3      get { return new List<OrderLine>(_orderLines); }
4  }

重构第一天:封装集合,布布扣,bubuko.com

重构第一天:封装集合

标签:style   class   blog   code   color   get   

原文地址:http://www.cnblogs.com/peteryan/p/3805099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!