2008-02-28

outsckirtsnamespace.txt

  2008-02-28 09:42

...

Краткое описание пакета
=======================

Пакет разработан что бы предоставить неймспейс **++outsckirt++**,
которое позволяет обращатся к объектам, находящимся в окрестности
определенного диаметра (если считать по ветвям деревьев) от текущего
объекта. Такой неймспейс полезен, например, что бы ставить ссылки на рисунки
в статьях, расположение которых, в силу особенностей построения сервера
dreambot, плохо детерминировано.

Способ реализации
-----------------

Доступ к объектам окрестности возможен через такой URL:

    http://<неважно>/++outsckirts++[]/,
    
    Здесь:
        
        DEEP
            Диаметр поиска (меряется в ветвях дерева),
            по умолчанию равен 1
            
        NAME
            Имя запрашиваемого объекта            


Такой продукт - это типичный namespace traverser адаптер
пространства имен, создание которого подробно описано в статье
Адаптер пространства имен.txt.
    
В качестве примера можно взять продукт smartbannernamespace, который
уже был написан на нашем семинаре :), но в отличие от реализованного там
продукта, в случае outscirtsnamespace надо реализовать более сложный подход:
фактически, адаптер в **outscirtsnamespace**, возвращает не искомый объект,
который сразу может быть использован, как это было в
smartbannernamespace.txt, а контейнер с такими объектами, контейнер,
который не существует на самом деле, а создается лишь при обращении к
пространству имен **outscirts**. Этот контейнер
предоставляет как минимум интерфейс **IReadContainer**, а более интересно -
**IWriteContainer** (на усмотрение участника семинара) и тестом, на то что
контейнер работает и правильно сформирован может быть то, что вызов:

    http://<неважно>/++outsckirts++[]/
    
в браузере приведет к тому, что отобразится страница (редактирования)
контейнера. 

Формирование контейнера
.......................

Возможно, удачным вариантов реализации будет такой: оставить в
 адаптере пространства имен только
получение параметра (-ров) и вызов конструктора контейнера, в который
передаются параметры и контекст вызова. Стоит обратить внимание, что
контейнер получаемый таким образом должен предоставлять интерфейс
**IContained**, а следовательно иметь атрибут __parent__ (равный контексту
вызова **++outscirts++**) и __name__ (равный полному имени, использованному
для вызова  адаптера пространства имен,
например "**++outscirts++4**").

Контейнер может не предоставлять интерфейс IContained сам, вместо этого,
адаптер пространства имен может обернуть его в **locationProxy**,
как это сделано в
nsinterface: http://code.dreambot.ru/svn/ng.adapter/trunk/src/ng/adapter/nsinterface .

Обход дерева
............

Интересная тонкость в порядке обхода дерева. Так как имена в разных
контейнерах могут совпадать, то от порядка обхода дерева зависит то,
насколько будет работа контейнера соответствовать интуитивному пониманию его
работы пользователями. Предположительно, наилучшим вариантом будет
обход дерева в ширину, ради реализации которого
можно пнуть Орлова.

Алгоритм обхода дерева (каким бы он не был) будет возвращать повторяющиеся
имена. Контейнер должен игнорировать повторные имена и при всех операциях (в
том числе операциях, обеспечиваемых интерфесом IWriteContainer) использовать
первый объект с данным именем.


Виды
----

Для контейнера, возвращаемого **++outsckirts++**, нужно зарегистрировать
виды директивой **containerViews** (см. Директивы для создания видов и
форм.txt), для этого контейнеру можно присвоить интерфейс **IOutscirts**.
 

Ссылки на эту статью:

Maverick
Официальный сайт Zope3 Московская группа изучения реактивного движения The Dream Bot Site noooxml