这两种方法之间的区别是什么【Smalltalk最佳实践模式-Kent Beck】



如何将信息从一个对象的格式转换为另一个对象

Kent BeckSmalltalk最佳实践模式中,他劝阻";将所需的所有可能的协议添加到他们可能被要求的每个对象";。相反,他建议将一个对象转换为另一个对象。

有人能给我举个例子说明他所说的";压倒性对象的协议";?我正在努力理解做这件事的坏方法,以便能够欣赏好的方法。

参考:最佳实践模式的Smalltalk-第28页

正如Beck所解释的,一些客户端可能需要在公开元素之前以元素排序的方式枚举集合,其他客户端则需要不在同一对象上迭代两次(可能在集合中出现两次(,等等。

解决这些情况的一种方法是将#sortedDo:#withoutDuplicatesDo:等方法添加到集合类中。这种方法迟早会在用#do:的其他变体(如#sortedSelect:#withoutDuplicatesCollect:等(填充类时派生出来。问题是,该类的最终协议会很快变得太大,给寻找正确选择器的简单任务增加了复杂性,增加了在搜索不够详尽时复制代码片段的风险,等等

为了避免这些副作用,类应该提供在其他类的实例中转换其实例的方法。因此,客户端可以使用而不是#sortedDo:

aCollection asSortedCollection do: aBlock

aCollection asSet do: aBlock

用于在没有重复的情况下进行迭代。

这解释了为什么我们有丰富的转换方法:#asArray#asOrderedCollection等。还要注意的是,转换方法不限于集合,它们也可用于其他类:#asInteger#asFloat#asString#asSymbol等。正因为如此,客户端通常需要的服务可以通过将转换与适当的消息相结合来获得,而不会用所有可能的组合来压倒手头对象的类,这些组合会使所有可能性相乘(而不是相加(。

最新更新