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**.