这是一个例子。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 /这些都是最后一本书的草稿,最好购买实体书,但这些是第二好的选择。 –