Использование декларации интерфейсов как инструмента настройки.txt
2008-01-11 19:02Приписать пользуясь кодами ZCML дополнительные интерфейсы этим объектам. ...
Использование декларации интерфейсов как инструмента настройки:
Легко представить себе ситуацию, когда имеется несколько объектов, давно созданных и не нами, в общем-то, написанных, между которыми нужно организовать взаимодействие. Сразу отметим: взаимодействие между этим объектами должно быть вообще говоря возможно (т.е. атрибуты есть и поведение совпадает с ожиданием). Как это сделать? Приписать пользуясь кодами ZCML дополнительные интерфейсы этим объектам. Например, прикрепим новый траверсер к объектам "Folder". Пусть у нас есть особенный траверсер, который может траверсить обычный контейнер, но особым образом:
# Описание самого траверсера. В процессе траверса, публикатор будет
# Для каждого объекта запрашивать: а нет ли для него специфического
# траверсера? И из всех найденных траверсеров будет эвристически
# (помните)? выбирать наиболее подходящий. Описанный ниже траверсер
# - это траверсер, применяемый для объекта с интерфейсом
# IFuzzyFolder.
<interface interface=".interfaces.IFuzzyFolder" name="IFuzzyFolder"/>
<view
for=".interfaces.IFuzzyFolder"
type="zope.publisher.interfaces.browser.IBrowserRequest"
factory=".fuzzytraverser.FuzzyTraverser"
provides="zope.publisher.interfaces.browser.IBrowserPublisher"
permission="zope.Public"
/>
Контейнеры у нас уже есть, это обычные папки и у них есть свой собственный траверсер. Что бы применить к нем наш траверсер, нужно дополнить их интерфейсом IFuzzyFolder, что делается следующей директивой:
<configure
xmlns:browser="http://namespaces.zope.org/browser"
xmlns="http://namespaces.zope.org/zope">
<class class="zope.app.folder.folder.Folder">
<implements interface="..interfaces.IFuzzyFolder"/>
</class>
</configure>
Вот собственно все - нам не потребовалось ни малейших изменений, ни даже взгляда в структуру папки, что бы подключить к ней траверсер. Не потребовалось взгляда - потому что мы знали, что IFuzzyFolder порожден от IFolder и потому его схема вполне удовлетворяет нашим потребностям.
Возникает интересный вопрос: почему бы сразу не написать у траверсера входной интерфейс IFolder и откуда вообще берутся такие траверсеры? Конечно можно и написать. А берутся такие траверсеры как компоненты некоторого другого решения, в котором фигурировал объект IFuzzyFolder. Мы про тот объект забыли (он нам не подошел) а вот траверсер использовали.
Собственно присвоить интерфейс объекту можно и другими, более грязными способами - например явным присваиванием к уже инстанциированному экземпляру класса (вспомните фабрики). Это тоже будет работать :), хотя и не будет так иллюстративно.



