这两种方法 [Smalltalk 最佳实践模式 - Kent Beck] 之间有什么区别?
What is the difference between those two approaches [Smalltalk Best Practice Patterns - Kent Beck]?
如何将信息从一种对象的格式转换为另一种格式?
在 Kent Beck 的 Smalltalk 最佳实践模式 中,他不鼓励“将所有可能的协议添加到他们可能被问到的每个对象的”。相反,他建议从一个对象转换为另一个对象。
谁能举例说明“压倒性对象的协议”是什么意思?我试图了解做这件事的坏方法,以便能够欣赏好的方法。
Reference: Smalltalk by best practice patterns - Page 28
正如 Beck 所解释的,一些客户端可能需要以一种在公开元素之前对元素进行排序的方式来枚举集合,而另一些客户端则不需要对同一对象(可能在集合中出现两次)进行两次迭代,等等.
解决这些情况的一种方法是将 #sortedDo:
、#withoutDuplicatesDo:
等方法添加到集合 class 中。迟早,这种方法会派生出用 #do:
的其他变体填充 class,例如 #sortedSelect:
、#withoutDuplicatesCollect:
等。问题是 class 的结果协议会很快变得太大,增加了寻找正确选择器的简单任务的复杂性,增加了在搜索不够详尽时重复代码片段的风险,等等。
为了避免这些副作用,class 应该提供将其实例转换为其他 class 实例的方法。因此,客户端可以使用
而不是 #sortedDo:
aCollection asSortedCollection do: aBlock
或
aCollection asSet do: aBlock
用于不重复的迭代。
这就解释了为什么我们有丰富的转换方法:#asArray
、#asOrderedCollection
等。另请注意,转换方法不仅限于集合,它们也可用于其他class es: #asInteger
, #asFloat
, #asString
, #asSymbol
, 等。多亏了他们,客户通常需要的服务可以通过将转换与适当的消息相结合来获得,不会用所有可能的组合压倒手头对象的class,这会增加(而不是增加)所有的可能性。
如何将信息从一种对象的格式转换为另一种格式?
在 Kent Beck 的 Smalltalk 最佳实践模式 中,他不鼓励“将所有可能的协议添加到他们可能被问到的每个对象的”。相反,他建议从一个对象转换为另一个对象。
谁能举例说明“压倒性对象的协议”是什么意思?我试图了解做这件事的坏方法,以便能够欣赏好的方法。
Reference: Smalltalk by best practice patterns - Page 28
正如 Beck 所解释的,一些客户端可能需要以一种在公开元素之前对元素进行排序的方式来枚举集合,而另一些客户端则不需要对同一对象(可能在集合中出现两次)进行两次迭代,等等.
解决这些情况的一种方法是将 #sortedDo:
、#withoutDuplicatesDo:
等方法添加到集合 class 中。迟早,这种方法会派生出用 #do:
的其他变体填充 class,例如 #sortedSelect:
、#withoutDuplicatesCollect:
等。问题是 class 的结果协议会很快变得太大,增加了寻找正确选择器的简单任务的复杂性,增加了在搜索不够详尽时重复代码片段的风险,等等。
为了避免这些副作用,class 应该提供将其实例转换为其他 class 实例的方法。因此,客户端可以使用
而不是#sortedDo:
aCollection asSortedCollection do: aBlock
或
aCollection asSet do: aBlock
用于不重复的迭代。
这就解释了为什么我们有丰富的转换方法:#asArray
、#asOrderedCollection
等。另请注意,转换方法不仅限于集合,它们也可用于其他class es: #asInteger
, #asFloat
, #asString
, #asSymbol
, 等。多亏了他们,客户通常需要的服务可以通过将转换与适当的消息相结合来获得,不会用所有可能的组合压倒手头对象的class,这会增加(而不是增加)所有的可能性。