我正试图将一些静态类型的OOP代码移植到Smalltalk,它执行某种事件源。我想如果我继续我的方式,它最终会看起来有点像这样。
EventAgg>>processEvent: anEvent
"I can process an event"
(anEvent isKindOf: Discarded)
ifTrue: [ self discard ]
ifFalse: [ "...." ]
```
Pharo的内置门楣抱怨isKindOf
的使用("发送‘可疑’消息"(。我能理解其中的原因,大多数时候人们希望使用多态性而不是显式条件句。但是,由于处理代码访问EventAgg
类的私有状态,因此调用该事件并没有多大意义,只是将特定于事件的消息发送回EventAgg
类以处理该事件。
Smalltalk中有什么我不知道的模式吗?
您没有公开足够的设计,无法让我们提供准确的答案。因此,让我为您推荐几种通用方法,以决定哪种方法(如果有的话(在您的情况下更有效。
显而易见的是双重调度,你似乎倾向于放弃它(不知道为什么(:
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
Discarded >> beProccessedWith: anEventAgg
anEventAgg processDiscardedEvent: self
EventAgg>>processDiscardedEvent: anEvent
self discard
然而,在使用此模式之前,我会探索其他协作方式,例如:
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
Discarded >> beProccessedWith: anEventAgg
anEventAgg discard
第二种方法将创造更多的凝聚力,但如果你认为你的对象进行一些团队合作是很自然的,那么这是有意义的。更复杂的事件可能需要两个对象的参与。当然,在分配责任时,你需要更加注意。具体来说,我会尽量避免Event
对EventAgg
的内部了解过多的代码。为此,让Event
在适当的时候将特定任务委派给EventAgg
。线路上的一些东西
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
ComplexEvent >> beProccessedWith: anEventAgg
anEventAgg
doThisUsing: self thisInformation;
doThatUsing: self thatInformation
您可以使用称为Double dispatch的模式。该技术用于在Smalltalk中实现方法重载。
在Pharo Smalltalk 中看到这篇关于双重调度的帖子