跳转至

封装集合

  • 问题


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

  • 解决方法


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

为什么重构?

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

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

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

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

  • 集合字段封装在一个类中。当调用 getter 时,它会返回集合的副本,这可以防止在不知道包含集合的类的情况下意外更改或覆盖集合元素。
  • 如果集合元素包含在基本类型(例如数组)内,您可以创建更方便的方法来处理集合。
  • 如果集合元素包含在非原始容器(标准集合类)内,则通过封装集合,您可以限制对集合中不需要的标准方法的访问(例如通过限制添加新元素)。

如何重构?

  1. 创建用于添加和删除集合元素的方法。它们必须在其参数中接受集合元素。
  2. 如果未在类构造函数中完成此操作,请将空集合分配给字段作为初始值。
  3. 查找集合字段设置器的调用。更改setter,使其使用添加和删除元素的操作,或者使这些操作调用客户端代码。

请注意,setter 只能用于将所有集合元素替换为其他元素。因此,建议更改 setter 名称 重命名方法 来替换。

  1. 查找收集getter的所有呼叫,然后更改集合。更改代码,以便它使用您的新方法来添加和删除集合中的元素。
  2. 更改 getter,使其返回集合的只读表示形式。
  3. 检查使用集合的客户端代码,以获取在集合类本身内部看起来更好的代码。