可疑方法:如何使用重载方法移植代码以(同步)smallltalk

时间:2018-12-01 12:36:59

标签: smalltalk

我试图将一些静态类型的OOP代码移植到Smalltalk上,后者执行某种事件源。我认为如果继续按照我的方式做,最终看起来会像这样。

EventAgg>>processEvent: anEvent
    "I can process an event"

    (anEvent isKindOf: Discarded)
        ifTrue: [ self discard ]
        ifFalse: [ "...." ]

```

Pharo的内置皮棉机抱怨使用isKindOf(“发送“可疑”消息”)。我能理解原因,大多数时候,人们会希望使用多态而不是显式条件。但是,由于处理代码访问EventAgg类的私有状态,因此仅需将事件特定的消息发送回EventAgg类来处理事件,因此调出事件没有太大意义。事件。

在Smalltalk中,有没有我不知道的模式?

2 个答案:

答案 0 :(得分:3)

您没有充分暴露您的设计,无法让我们提供准确的答案。因此,让我为您提供一些一般方法,供您确定哪种方法(如果有)在您的情况下会更好。

显而易见的是双重调度,您似乎倾向于丢弃它(不知道为什么):

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

答案 1 :(得分:1)

您可以使用称为Double dispatch的模式。此技术用于实现method overloading in Smalltalk

请参见this post on double dispatch in Pharo Smalltalk