Сомнительный метод: Как перенести код с помощью перегруженного метода на (pharo) smallltalk - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь перенести некоторый статически типизированный ООП-код на Smalltalk, который выполняет какой-либо источник событий.Я думаю, что в конечном итоге это будет выглядеть примерно так, если я продолжу в том же духе.

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

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

`` `

Встроенная линза Pharo жалуется на использование isKindOf(«Отправляет сомнительное» сообщение).Я могу понять причины, в большинстве случаев хотелось бы использовать полиморфизм вместо явных условных выражений.Но поскольку код обработки обращается к частным состояниям класса EventAgg, не имеет особого смысла вызывать событие, а только отправлять сообщение, специфичное для события, обратно в класс EventAgg для обработки события.

Существуют ли какие-либо шаблоны для этого в Smalltalk, о которых я не знаю?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы недостаточно раскрыли свой дизайн, чтобы дать нам точный ответ.Итак, позвольте мне предложить вам пару общих подходов, чтобы решить, какой из них (если таковой имеется) будет лучше работать в вашем случае.

Очевидным является двойная диспетчеризация , к которой вы склонныотбросить (не знаю почему):

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
0 голосов
/ 01 декабря 2018

Вы можете использовать шаблон, известный как Двойная отправка .Этот метод используется для реализации перегрузки метода в Smalltalk .

См. этот пост о двойной рассылке в Pharo Smalltalk

...