有问题的方法:如何使用重载方法将代码移植到(pharo)smalltalk



我正试图将一些静态类型的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

第二种方法将创造更多的凝聚力,但如果你认为你的对象进行一些团队合作是很自然的,那么这是有意义的。更复杂的事件可能需要两个对象的参与。当然,在分配责任时,你需要更加注意。具体来说,我会尽量避免EventEventAgg的内部了解过多的代码。为此,让Event在适当的时候将特定任务委派给EventAgg。线路上的一些东西

EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
ComplexEvent >> beProccessedWith: anEventAgg
anEventAgg
doThisUsing: self thisInformation;
doThatUsing: self thatInformation

您可以使用称为Double dispatch的模式。该技术用于在Smalltalk中实现方法重载。

在Pharo Smalltalk 中看到这篇关于双重调度的帖子

最新更新