为什么我们最好使用一流的收藏?


15

根据The ThoughtWorks Anthology中Jeff Bay (RTF)对象健美操规则第4条规则,建议一个人应该“ 使用一流的收藏集 ”。

规则4:一流的收藏

该规则的应用很简单:任何包含集合的类都不应包含其他成员变量。每个集合都包装在自己的类中,因此与集合相关的行为现在有了归属。您可能会发现过滤器成为此新类的一部分。同样,您的新类可以处理诸如将两个组连接在一起或将规则应用于该组的每个元素的活动。

从中我可以理解的是,我们应该使用一个单独的类来包装该集合,并使用添加,删除该集合的数据的方法。

并且我们需要它,以便我们确定什么数据类型进入集合,什么结果出来。

如果我们使用通用集合(在适用的语言中),是否需要遵循此规则?

如果我没有重要意义,请澄清。


1
Amogh Talpallikar我已将规则8更改为规则4,因为规则8实际上是“没有两个以上实例变量的类”。
扬尼斯

似乎在目录中说了规则8,然后在正文中将其称为规则4
没用的2012年


6
仅仅是我,还是这条规则无法实现?我的意思是,您的班级中有一个集合,因此您将其他所有内容都删除了。现在您的课程是一个集合。因此,如果您有另一个班级,并且其中包含该班级,则它内有一个集合,并且…起泡,冲洗,重复。
mjfgates 2012年

@mjfgates:嗯...很好!要真正考虑的事情!
Amogh Talpallikar

Answers:


12

类型安全性是使用一流集合的一个非常次要的理由。从您的链接:

规则4:第一类集合该规则的应用很简单:任何包含集合的类都不应包含其他成员变量。每个集合都包装在自己的类中,因此与集合相关的行为现在有了归属。您可能会发现过滤器成为此新类的一部分。同样,您的新类可以处理诸如将两个组连接在一起或将规则应用于该组的每个元素的活动。

这里的想法是,如果您发现自己在集合上进行添加,删除/迭代语义之外的搜索,过滤,验证或其他操作,则代码会要求您将其放入自己的类中。如果您只需要更新一个值(在搜索后),则该值可能在collection类中。

这样做的原因很简单,集合通常会被传递出去。很快,有4种不同的类有自己的SearchByID()方法。否则,您将获得返回值,例如Map<Integer, String>剥离了该映射中存储内容的上下文。一流的收藏是一种简单的解决方案,只需要一个源文件。在实践中,一旦这些就位(它们也很容易编写单元测试),则处理集合的任何更改都很容易处理,例如SearchByID需要使用GUID而不是int时。


8

...使用单独的类包装集合,并使用方法添加,删除修改该集合的数据

这确实远远超过担保类型存储在集合中的对象,虽然,它也保证任何集合不变。

树木(红黑,AVL等)对排序很敏感,它们的行为取决于适当时的重新平衡。哈希表的性能还取决于适当的重新哈希。您是否还记得每次插入哈希映射时都要检查负载因子吗?

FWIW,有关此内容的文字非常清楚(我将整个内容编辑到您的问题中,因此没有人需要下载该RTF):

每个集合都包装在自己的类中,因此与集合相关的行为现在有了归属

与类型(或泛型)无关,与将集合的行为与其数据相关联的一切都无关。


1

如果您使用的是支持泛型的语言,则简单的回答是“否”。因为语言功能本身在这方面做得很好,所以不需要检查类型(根据我的Java泛型经验)。

但是,如果您想自定义从该语言给出的数据结构,则可以围绕原始数据结构创建包装器类,并公开自己的API并仍然使用原始数据结构的基础实现。


我也在考虑类似的思路。但是应该有一些东西,我在Java和C#中看到的例子都支持通用集合。
Amogh Talpallikar

@AmoghTalpallikar:我的意思是保持简单。除非我不需要重写数据结构的任何特定行为,否则我不会自定义。
java_mouse12年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.