有问题的方法:如何使用重载方法将代码移植到 (pharo) smallltalk
Questionable Method: How to port code using overloaded method to (pharo) smallltalk
我正在尝试将一些静态类型的 OOP 代码移植到执行某种事件源的 Smalltalk。我觉得再这样下去最后会有点像这个样子。
EventAgg>>processEvent: anEvent
"I can process an event"
(anEvent isKindOf: Discarded)
ifTrue: [ self discard ]
ifFalse: [ "...." ]
```
Pharo 的内置 linter 抱怨 isKindOf
("Sends 'Questionable' message") 的使用。我能理解原因,大多数时候人们会想使用多态而不是显式条件。但是由于处理代码访问 EventAgg
class 的私有状态,因此调用事件没有多大意义,只是将特定于事件的消息发送回 EventAgg
class 处理事件。
Smalltalk 中是否有任何我不知道的模式?
您可以使用称为 Double dispatch. This technique is used to implement method overloading in Smalltalk 的模式。
见
您没有充分展示您的设计,因此我们无法提供准确的答案。因此,让我建议一些通用方法,供您决定哪种方法(如果有的话)更适合您的情况。
最明显的是 double dispatching,你似乎倾向于丢弃它(不知道为什么):
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
我正在尝试将一些静态类型的 OOP 代码移植到执行某种事件源的 Smalltalk。我觉得再这样下去最后会有点像这个样子。
EventAgg>>processEvent: anEvent
"I can process an event"
(anEvent isKindOf: Discarded)
ifTrue: [ self discard ]
ifFalse: [ "...." ]
```
Pharo 的内置 linter 抱怨 isKindOf
("Sends 'Questionable' message") 的使用。我能理解原因,大多数时候人们会想使用多态而不是显式条件。但是由于处理代码访问 EventAgg
class 的私有状态,因此调用事件没有多大意义,只是将特定于事件的消息发送回 EventAgg
class 处理事件。
Smalltalk 中是否有任何我不知道的模式?
您可以使用称为 Double dispatch. This technique is used to implement method overloading in Smalltalk 的模式。
见
您没有充分展示您的设计,因此我们无法提供准确的答案。因此,让我建议一些通用方法,供您决定哪种方法(如果有的话)更适合您的情况。
最明显的是 double dispatching,你似乎倾向于丢弃它(不知道为什么):
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