[英]What is the difference between those two approaches [Smalltalk Best Practice Patterns - Kent Beck]?
如何將信息從一個對象的格式轉換為另一種?
在Kent Beck的Smalltalk 最佳實踐模式中,他不鼓勵“將所有可能需要的協議添加到每個 object 可能被要求的協議中”。 相反,他建議從一個 object 轉換為另一個。
有人可以舉個例子說明他所說的“壓倒性對象的協議”是什么意思嗎? 我試圖了解這樣做的壞方法,以便能夠欣賞好的方法。
正如 Beck 解釋的那樣,一些客戶端可能需要以元素在公開之前對其進行排序的方式枚舉集合,其他客戶端則不需要在同一個 object 上迭代兩次(可能在集合中出現兩次),等等。
解決這些情況的一種方法是將#sortedDo:
、 #withoutDuplicatesDo:
等方法添加到集合 class 中。 遲早,這種方法會在 class 中使用#do:
的其他變體,例如#sortedSelect:
、 #withoutDuplicatesCollect:
等。 問題是 class 的最終協議會很快變得太大,增加了尋找正確選擇器的簡單任務的復雜性,增加了在搜索不夠詳盡時重復代碼片段的風險等。
為避免這些副作用,class 應提供在其他類的實例中轉換其實例的方法。 所以,而不是#sortedDo:
客戶端可以使用
aCollection asSortedCollection do: aBlock
或者
aCollection asSet do: aBlock
用於沒有重復的迭代。
這解釋了為什么我們有豐富的轉換方法: #asArray
、 #asOrderedCollection
等。還要注意,轉換方法不僅限於 collections,它們還適用於其他類: #asInteger
、 #asFloat
、 #asString
、# #asSymbol
等。多虧了他們,客戶通常需要的服務可以通過將轉換與適當的消息相結合來獲得,而不會壓倒手頭的 object 的 class 和所有可能的組合,這將增加(而不是增加)所有可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.