В Squeak, как обернуть каждый метод отправки? - PullRequest
2 голосов
/ 20 мая 2009

Я создал класс, и в этом классе у меня есть метод 'sendMessage: to: withArgs:', который получает объект, сообщение и массив аргументов. Метод используется для отправки сообщений на объект и выполнения некоторого алгоритма. Чтобы использовать этот метод, я должен создать экземпляр x класса, который я создал, и сделать что-то вроде x sendMessage: '+' to: '7' withArgs: '# (5)'. Результатом этого является отправка сообщения «+» объекту 7 с параметром 5, плюс некоторые вещи, которые выполняет мой алгоритм. Но я хочу, чтобы алгоритм использовался при каждом вызове метода, то есть 7 + 5 вызовет мой метод sendMessage: to: withArgs:. Как я могу это сделать? Или, по крайней мере, что-то вызывается в каждом методе, отправляемом каждому объекту?

Ответы [ 4 ]

2 голосов
/ 25 мая 2009

Взгляните на Отражательную способность .

К сожалению, некоторые из бумажных ссылок не работают, и я не помню точного вызова из головы, но действительно легко кодировать инструмент, как вы хотите, и даже делать это во время выполнения. Ищите примеры, используя класс Link.

2 голосов
/ 20 мая 2009

Это довольно забавно, мы только что обсуждали это на канале Squeak irc. Посмотрите на ObjectViewer, возможно.

В вашем примере вы хотите перехватить сообщение, отправленное SmallInteger. Как ни странно, ObjectViewer работает практически со всеми классами, НО SmallInteger.

Итак, чтобы перехватить отправку сообщения myObject, сделайте это.

Создайте класс Intercepter, пусть он наследуется от ObjectTracer, возможно. Изменение не означает что-то, что служит вам:

doesNotUnderstand: aMessage
   "do Mojo to aMessage as you describe it"

Затем, чтобы начать работу, создайте свой перехватчик:

myIntercepter := Intercepter on: myObject.

А потом

myObject become: myInterceptor.
2 голосов
/ 20 мая 2009

В Squeak см. Класс ObjectTracer. Комментарий класса описывает, как его использовать. Вы должны быть в состоянии выполнить то, что вам нужно, или, по крайней мере, использовать это в качестве модели.

1 голос
/ 21 мая 2009

Вы можете использовать метод обертки. Чтобы увидеть, что такое метод-обертка, вы можете найти бумагу под названием «Обертки на помощь». Я думаю, что есть пакет для писка, который уже реализует обертки метода. Кроме того, вы можете увидеть, как выполняется анализ покрытия тестового кода в последней версии Pharo, поскольку он использует своего рода упаковщик методов, чтобы увидеть, какие методы оцениваются во время выполнения теста. веселит, Габото

...