這是一個例子。Smalltalk - 如何避免在這種情況下typechecks?
假設以下限制:
- A商店只能有5種產品。
- 食品店只能添加食品。
- 一家服裝店只能添加衣服產品。
- 混合商店可以添加這兩種產品。
我有以下類別:
AbstractShop
- FoodShop
- ClothesShop
- MixedShop
AbstractProduct
- 服裝
- 食品
功能:
AbstractShop>>addProduct: aProduct
(products size < 5)
ifTrue:[^ products add:aProduct]
ifFalse:[ self error: 'A shop can only have five products' ]
FoodShop>>addProduct: aProduct
(aProduct isMemberOf: Food)
ifTrue:[^ super addProduct: aProduct]
ifFalse:[ self error: 'You can only add food products to a foodshop' ]
ClothesShop>>addProduct: aProduct
(aProduct isMemberOf: Clothing)
ifTrue:[^ super addProduct: aProduct]
ifFalse:[ self error: 'You can only add clothing products to a clothes shop' ]
"ClothesShop doesn't override the addProduct, because it can add them both."
如何避免檢查產品的類型,看它是否可以添加到商店?我想避免這種情況,因爲這是一種難聞的氣味。我試着用Double Dispatch來解決它,但它似乎使代碼更難以維護。
但雙重調度是最乾淨的方式。 –
顯示Smalltalk做事方式的兩本書是http://stephane.ducasse.free.fr/FreeBooks/BestSmalltalkPractices/Draft-Smalltalk%20Best%20Practice%20Patterns%20Kent%20Beck.pdf和http:// sdmeta。 gforge.inria。fr/FreeBooks/SmalltalkDesignPatternCompanion /這些都是最後一本書的草稿,最好購買實體書,但這些是第二好的選擇。 –