zoukankan      html  css  js  c++  java
  • 重构第一天:封装集合

    在一些情况下,在一个类中选择不去暴露整个集合给调用者是非常有必要的。比如当我们给一个集合添加/删除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  }
  • 相关阅读:
    RTMP命令亲自测试记录
    如何在 i5 上实现 20 倍的 Python 运行速度?
    百倍加速!Python量化策略的算法性能提升指南
    谷歌推出 Python 性能加速方案
    用Cython加速Python到“起飞”
    Python GPU加速
    金融数学太复杂?看完这10部电影会不会轻松点!
    金融数学攻略+书单
    耳朵如何保养
    DataOps Reading Notes
  • 原文地址:https://www.cnblogs.com/peteryan/p/3805099.html
Copyright © 2011-2022 走看看