如何解决这两种方法有什么区别 [Smalltalk 最佳实践模式 - Kent Beck]?
如何将信息从一种对象的格式转换为另一种格式?
在 Kent Beck 的 Smalltalk 最佳实践模式中,他不鼓励“将所有可能的协议添加到他们可能被要求的每个对象上”。相反,他建议从一个对象转换为另一个对象。
谁能给我举个例子来说明他所说的“压倒性对象协议”是什么意思?我试图了解这样做的坏方法,以便能够欣赏好的方法。
Reference: Smalltalk by best practice patterns - Page 28
解决方法
正如 Beck 解释的那样,一些客户可能需要在暴露元素之前以元素排序的方式枚举集合,其他客户则不需要对同一个对象(可能在集合中出现两次)迭代两次,等等。
解决这些情况的一种方法是向集合类添加#sortedDo:
、#withoutDuplicatesDo:
等方法。迟早,这种方法会派生出用 #do:
的其他变体(例如 #sortedSelect:
、#withoutDuplicatesCollect:
等)填充类。问题是类的结果协议会很快变得太大,增加了寻找正确选择器的简单任务的复杂性,增加了搜索不够详尽时重复代码片段的风险等。
为了避免这些副作用,该类应该提供在其他类的实例中转换其实例的方法。因此,客户端可以使用
代替#sortedDo:
aCollection asSortedCollection do: aBlock
或
aCollection asSet do: aBlock
用于无重复的迭代。
这就解释了为什么我们有丰富的转换方法:#asArray
、#asOrderedCollection
等。还要注意转换方法不限于集合,它们也可用于其他类:#asInteger
,#asFloat
,#asString
,#asSymbol
等。多亏了他们,可以通过将转换与适当的消息结合来获得客户端通常需要的服务,而不会压倒对象的类手头有所有可能的组合,这将乘以(而不是相加)所有的可能性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。