我试图将一些静态类型的OOP代码移植到Smalltalk上,后者执行某种事件源。我认为如果继续按照我的方式做,最终看起来会像这样。
EventAgg>>processEvent: anEvent
"I can process an event"
(anEvent isKindOf: Discarded)
ifTrue: [ self discard ]
ifFalse: [ "...." ]
```
Pharo的内置皮棉机抱怨使用isKindOf
(“发送“可疑”消息”)。我能理解原因,大多数时候,人们会希望使用多态而不是显式条件。但是,由于处理代码访问EventAgg
类的私有状态,因此仅需将事件特定的消息发送回EventAgg
类来处理事件,因此调出事件没有太大意义。事件。
在Smalltalk中,有没有我不知道的模式?
答案 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
第二种方法将产生更大的凝聚力,但是如果您认为您的对象进行某些团队合作是很自然的话,这可能是有道理的。更复杂的事件可能需要两个对象的参与。当然,在分配职责时,您将需要更加注意。具体来说,我会尽量避免使用代码,例如Event
对EventAgg
的内部知识了解过多。为此,请让Event
在适当时将特定任务委派给EventAgg
。
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
ComplexEvent >> beProccessedWith: anEventAgg
anEventAgg
doThisUsing: self thisInformation;
doThatUsing: self thatInformation
答案 1 :(得分:1)