Smalltalk по-русски
пятница, Апрель 08, 2005
[VW] Полезняшки: Teachable

Как известно, в Smalltalk объекты могут обрабатывать "нестандартые" сообщения - при получении сообщения для обработки которого нет метода будет вызван метод #doesNotUnderstand: (кратко - DNU). Эта способность часто используется для создания разного рода "прозрачных" прокси - для пересылки сообщений удалённым объектам, для ленивой загрузки объектов из БД, или для организации делегирования.

Еще одним вариантом использования перехвата неизвестных сообщений является создание "обучаемых" объектов. Например, объект может перехватывать сообщения с одним параметром, сохранять параметр и, затем, возвращать значение параметра в ответ на соответсвующее унарное сообщение. То есть, при получении сообщения parametr: anObject этот самый anObject будет сохранён в словаре в объекте и будет возвращен в ответ на сообщение parametr.

Класс Teachable является более продвинутой реализацией идеи обучаемых объектов. Его можно обучить отвечать на любое сообщение.

Пример обучения:

|teachable|
teachable := Teachable new.
teachable
    whenSend: #help return: 'ok';
    whenSend: #doit evaluate: [1 inspect];
    acceptSend: #noDebugger;
    whenSend: #negate: evaluate: [:num | num negated].
После обучения объект готов к использованию:
teachable help. вернёт строку 'ok'
teachable doit. откроет в инспекторе число 1
teachable noDebugger. Сообщение #noDebugger является допустимым,
    а его результат - сам обучаемый объект
teachable negate: 120 вернёт число -120

Обучаемые объекты можно применять для создания моков для тестов.

Для реализации такого поведения нужно всего 5 методов. Три обучающих:

whenSend: aSymbol evaluate: aBlock
  При получении сообщения с данным селектором 
  выполнить блок с параметрами полученного сообщения

  self learnings at: aSymbol put: aBlock

whenSend: aSymbol return: anObject
  В ответ на сообщение с данным селектором 
  вернуть указанный объект

  self learnings at: aSymbol put: (#return -> anObject)

acceptSend: aSymbol
  Сообщение с данным селектором является допустимым

  self whenSend: aSymbol return: self
Для ответа на "обученные" сообщения используется DNU:
learnings
  Возвращает словарь для хранения данных об обучении
 
  ^learnings ifNil: [learnings := Dictionary new]

doesNotUnderstand: aMessage
  Если объект не обучен такому сообщению, 
  то будет вызван стандартный метод DNU

  | learning |
  learning := self learnings 
      at: aMessage selector 
      ifAbsent:[ ^super doesNotUnderstand: aMessage ].
  ^learning class == Association
      ifTrue: [learning value]
      ifFalse: [learning valueWithArguments: aMessage arguments]
Всё!

Версия для VW находится в публичном Store-репозитории, и состоит из двух пакетов Teachable и Teachable Tests. Версия для Squeak находится в SqueakMap.

Ярлыки:

Comments: Отправить комментарий

<< Home

Популярные статьи
:: Smalltalk?!
:: Почему Smalltalk?
:: Great Leap Forward from Java to Smalltalk

Последние сообщения
:: Smalltalk/JVM - open source?
:: Ambrai Smalltalk 1.0.6 Beta
:: [VW] Знаете ли Вы, что такое pragma?
:: Dolphin Smalltalk BETA
:: A Seaside Vacation
:: Dynamic typing
:: [Squeak] 64-bit VM
:: Анонсы событий от ESUG и STIC на 2005-й год
:: Bruce Eckel о языках для обучения программированию...
:: Alan Kay о Smalltalk

Архив
Предыдущие новости / Декабрь 2004 / Январь 2005 / Февраль 2005 / Март 2005 / Апрель 2005 / Май 2005 / Июнь 2005 / Июль 2005 / Август 2005 / Сентябрь 2005 / Октябрь 2005 / Ноябрь 2005 / Декабрь 2005 / Январь 2006 / Февраль 2006 / Март 2006 / Апрель 2006 / Май 2006 / Июнь 2006 / Июль 2006 / Сентябрь 2006 / Октябрь 2006 / Ноябрь 2006 / Декабрь 2006 / Январь 2007 / Февраль 2007 / Март 2007 / Апрель 2007 / Май 2007 / Июнь 2007 / Август 2007 / Сентябрь 2007 / Ноябрь 2007 / Январь 2008 / Март 2008 / Май 2008 / Июнь 2008 / Июль 2008 / Август 2008 / Сентябрь 2008

Atom Feed
Smalltalk по-русски


Powered by Blogger