如何将信息从一种对象的格式转换为另一种格式?
在Smalltalk的最佳实践模式由肯特·贝克,他沮丧“并称需要对每个对象的所有可能的方案,他们可能会问它”。相反,他建议从一个对象转换为另一个对象。
有人可以举一个例子来说明他所说的“压倒性对象协议”是什么意思吗?我试图了解这样做的坏方法,以便能够欣赏好的方法。
正如贝克解释的那样,一些客户端可能需要以元素在公开之前排序的方式枚举集合,其他客户端不需要对同一个对象(可能在集合中出现两次)迭代两次,等等。
为解决这些情况的一种方法是给方法,如加#sortedDo:,#withoutDuplicatesDo:等的集合类。迟早,这种方法会得出与其他变体填充类#do:等#sortedSelect:, #withoutDuplicatesCollect:等。问题是类的结果协议会很快变得太大,增加了寻找正确选择器的简单任务的复杂性,增加了搜索不够详尽时重复代码片段的风险等。
为了避免这些副作用,该类应该提供在其他类的实例中转换其实例的方法。所以,代替#sortedDo:客户端可以使用
aCollection asSortedCollection do: aBlock
Run Code Online (Sandbox Code Playgroud)
或者
aCollection asSet do: aBlock
Run Code Online (Sandbox Code Playgroud)
用于无重复的迭代。
这就解释了为什么我们有丰富的转换方法:#asArray,#asOrderedCollection,等还请注意,转换方法不限于集合,它们也可用于其他类:#asInteger,#asFloat,#asString,#asSymbol,等多亏了他们的服务,客户通常需要可通过将转换与适当的消息相结合而获得,而不会用所有可能的组合来压倒手头对象的类,这将乘以(而不是相加)所有的可能性。