圣诞大减价开始了!

封装集合

问题

类包含一个集合字段和用于处理集合的简单getter和setter。

解决方案

将getter返回的值设置为只读,并创建用于添加/删除集合元素的方法。

之前
封装集合-之前
封装收集-之后

为什么重构

类包含一个包含对象集合的字段。这个集合可以是数组、列表、集合或向量。已经创建了用于处理集合的普通getter和setter。

但是使用集合的协议应该与其他数据类型使用的协议略有不同。getter方法不应该返回集合对象本身,因为这会让客户端在不知道所有者类的情况下更改集合内容。此外,这将向客户端显示太多对象数据的内部结构。获取集合元素的方法应该返回一个不允许更改集合或透露关于其结构的过多数据的值。

此外,不应该有给集合赋值的方法。相反,应该有添加和删除元素的操作。因此,所有者对象可以控制添加和删除集合元素。

这样的协议正确地封装了一个集合,这最终降低了所有者类和客户端代码之间的关联程度。

好处

  • 集合字段封装在类中。当调用getter时,它返回集合的副本,这可以防止在不知道包含集合的类的情况下意外更改或覆盖集合元素。

  • 如果集合元素包含在基元类型中,例如数组,则可以创建更方便的方法来处理集合。

  • 如果集合元素包含在非基元容器(标准集合类)中,通过封装集合,可以限制对不需要的集合标准方法的访问(例如限制添加新元素)。

如何重构

  1. 创建用于添加和删除集合元素的方法。它们必须在参数中接受集合元素。

  2. 如果在类构造函数中没有这样做,则将一个空集合分配给字段作为初始值。

  3. 查找集合字段setter的调用。更改setter,使其使用添加和删除元素的操作,或使这些操作调用客户端代码。

注意,setter只能用于用其他集合元素替换所有集合元素。因此,更改setter名称(重命名方法)取代

  1. 找到对集合getter的所有调用,之后更改了集合。更改代码,使其使用您的新方法从集合中添加和删除元素。

  2. 更改getter,使其返回集合的只读表示。

  3. 检查使用集合的客户端代码,以寻找在集合类本身内部看起来更好的代码。

Baidu
map