重构第1天:封装集合(Encapsulate Collection)
2024-08-25 00:28:38
理解:封装集合就是把集合进行封装,只提供调用者所需要的功能行借口,保证集合的安全性。
详解:在大多的时候,我们没有必要把所有的操作暴露给调用者,只需要把调用者需要的相关操作暴露给他,这种情况中下我们就要对其进行封装,只把调用者需要的部分暴露出来。
我们先看一个例子:
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。
最新文章
- CSS3-3D制作案例分析实战
- lua使用io.open跨平台文件夹遍历匹配查找
- register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
- Linux下自带的regex
- Careercup - Facebook面试题 - 5110993575215104
- linux关闭服务的方法
- 九九乘法口诀引申出NN乘法口诀
- CSS基本知识介绍
- NPC
- bootstrap标准模板
- 【转】使用gulp 进行ES6开发
- Linux 安装配置 Tomcat
- 第二次项目冲刺(Beta阶段)5.19
- 自定义win8资源管理器左侧导航窗格的方法
- 本地apache 可以正常访问,lnmp服务器访问404错误
- 牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)
- Python加载声音
- MySQL数据库的基础学习
- inheritCombinedParasitic.js
- linux内存源码分析 - SLAB分配器概述
热门文章
- 使用grunt合并压缩js、css文件
- paip.mysql 批量kill 连接.
- paip.mysql fulltext 全文搜索.最佳实践.
- O2O已死?不!美团点评们迎来新风口
- JavaScript-语法基础
- FIR.im Weekly - 技术是练出来的
- ASP.NET MVC4+EasyUI+EntityFrameWork5权限管理系统——菜单模块的实现(二)
- Html+css 练习写页面发现的错误及解决办法。
- 禁用iOS的UIView长按默认操作
- 原创内容搬家到csdn博客啦~