理解:封装集合就是把集合进行封装,只提供调用者所需要的功能行借口,保证集合的安全性。

详解:在大多的时候,我们没有必要把所有的操作暴露给调用者,只需要把调用者需要的相关操作暴露给他,这种情况中下我们就要对其进行封装,只把调用者需要的部分暴露出来。

我们先看一个例子:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _31DaysOfReflactor
{
public class Order
{
private List<OrderLine> _orderLines;
private double _orderTotal; public IList<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);
}
} public class OrderLine
{
public double Total { get; private set; }
}
}

如果我们对集合只允许调用端读取,遍历取值,而不允许其修改集合的值,那么我们把IList换成了IEnumerable。IEnumerable只包括一个返回值为IEnumerator的GetEnumerator()方法,用来遍历取值,就达到我们想要的目的。

重构后的代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _31DaysOfReflactor
{
public class Order
{
private List<OrderLine> _orderLines;
private double _orderTotal; 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);
}
} public class OrderLine
{
public double Total { get; private set; }
}
}

如上所示,我们对IList集合进行封装,没有把该集合的add/remove方法暴露给调用端。当然在.Net framework中提供了很多封装好的集合类,不同的类都有不同的作用,比如ReadOnlyCollection 集合,但是他们每个集合都有自己的使用局限性。上面的重构是一个值得注意的非常简单的例子,像这样的封装能够确保客户端不会错误的调用集合以免引进bugs。

最新文章

  1. CSS3-3D制作案例分析实战
  2. lua使用io.open跨平台文件夹遍历匹配查找
  3. register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
  4. Linux下自带的regex
  5. Careercup - Facebook面试题 - 5110993575215104
  6. linux关闭服务的方法
  7. 九九乘法口诀引申出NN乘法口诀
  8. CSS基本知识介绍
  9. NPC
  10. bootstrap标准模板
  11. 【转】使用gulp 进行ES6开发
  12. Linux 安装配置 Tomcat
  13. 第二次项目冲刺(Beta阶段)5.19
  14. 自定义win8资源管理器左侧导航窗格的方法
  15. 本地apache 可以正常访问,lnmp服务器访问404错误
  16. 牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)
  17. Python加载声音
  18. MySQL数据库的基础学习
  19. inheritCombinedParasitic.js
  20. linux内存源码分析 - SLAB分配器概述

热门文章

  1. 使用grunt合并压缩js、css文件
  2. paip.mysql 批量kill 连接.
  3. paip.mysql fulltext 全文搜索.最佳实践.
  4. O2O已死?不!美团点评们迎来新风口
  5. JavaScript-语法基础
  6. FIR.im Weekly - 技术是练出来的
  7. ASP.NET MVC4+EasyUI+EntityFrameWork5权限管理系统——菜单模块的实现(二)
  8. Html+css 练习写页面发现的错误及解决办法。
  9. 禁用iOS的UIView长按默认操作
  10. 原创内容搬家到csdn博客啦~