Начальная страница

Николай Жарких (Киев)

Персональный сайт

?

Коллекторы и переходы

А что делает атрибут link вершины? И зачем нужен класс Link ?

Коллекторы

Коллектор – это вершина любого класса, кроме Link, которая имеет ненулевой атрибут link или иной(ые) атрибут(ы), который(ые) являются ключом вершины. Имея такую информацию, Смерека использует ее для коллекционирования атрибутов, которые будут использованы во время компоновки страницы из вершины-коллектора.

Процесс коллекционирования атрибутов очень напоминает наследование свойств от суперкласса к подклассам в объектно-ориентированных системах программирования. Конкретно он выглядит следующим образом: Смерека выбирает все атрибуты для текущей вершины (это она делает всегда и независимо от коллекционирования). Если атрибут-указатель, по которому ведется коллекционирование, не нулевой, загружается вершина, на которую он указывает. Смерека анализирует атрибуты этой вершины и добавляет те из них, которых еще нет в коллекторе. Цикл загрузки-добавления повторяется, пока не наступит одно из следующих условий:

1. Атрибут-указатель является нулевым;

2. Атрибут-указатель указывает на несуществующую вершину;

3. Атрибут-указатель указывает на одну из вершин, которые уже были просмотрены (т.е. в структуре вершин есть ошибки типа циклической ссылки, когда вершина А ссылается на вершину Б, а вершина Б ссылается на вершину А).

Итак, если вершина-коллектор имеет какой-то свой собственный атрибут, то значение этого атрибута для вершин из цепочки ссылок будут проигнорированы, но если она не имеет такого атрибута – она унаследует значения от первой вершины из цепочки, которая обладает таким атрибутом.

Следует знать, что метод коллекционирования определен в контексте Вершины, но вызывает этот метод Страница. По умолчанию Смерека выполняет коллекционирования по атрибуту link для всех страниц, когда работает в режиме просмотра, и не выполняет никакого коллекционирования в режиме редактирования. Другие шаблоны страниц могут выполнять или не выполнять коллекционирования по своему усмотрению, коллекционировать по нескольким атрибутам-ссылкам и т.д. Это придает дополнительную гибкость процессу компоновки веб-страниц.

Следует знать, что в процессе коллекционирования уровень доступа к вершинам игнорируется. Поэтому во время компоновки «несекретных» страниц можно использовать данные из «секретных» вершин.

Например, вы не хотите, чтобы незарегистрированный пользователь сайта просматривал список цен на ваши товары, и защищаете вершину «Список цен» определенным уровнем доступа; но общедоступные страницы с описаниями ваших товаров могут ссылаться на эту защищенную вершину и выбирать из нее цены соответствующих товаров.

Конечно, программист Смереки может полностью или частично отказаться от механизма коллекционирования и использовать атрибут link для какой-либо другой цели.

Переходы

Переход – это вершина класса Link, которая имеет ненулевой атрибут link. Для таких вершин Смерека вместо коллекционирования атрибутов выполняет разыменование: загружается вершина, которая является целью ссылки, и если она также относится к классу Link, цикл разыменования продолжается. Заканчивается он в одном из следующих случаев:

1. Вершина не принадлежит к классу Link – мы успешно добрались до цели ссылки;

2. Атрибут link является нулевым;

3. Атрибут link указывает на несуществующую вершину;

4. Атрибут link указывает на одну из вершин, которые уже были просмотрены (т.е. в структуре вершин есть ошибки типа циклической ссылке, когда вершина А ссылается на вершину Б, а вершина Б ссылается на вершину А).

Следует знать, что в процессе разыменования уровень доступа к вершинам игнорируется. Он проверяется только когда процесс разыменования успешно завершен (случай 1). Поэтому использование перехода все же не даст пользователю доступа к «секретной» вершины, для просмотра которой у него нет прав.

Попросту говоря, вершина-переход задает отображение целевой вершины в ее собственном контексте (так сказать, выполняет явный внутренний «редирект»), а коллектор без собственных атрибутов задает отображение целевой вершины в контексте коллектора (так сказать, слепой внутренний «редирект»; но в обоих случаях «редирект» обеспечивается собственно Смерекой, без использования механизмов http протокола, поэтому мы берем это слово в кавычки и называем его внутренним).

Пример использования

Рассмотрим применение возможностей Смереки на примере интернет-магазина по продаже Мерседесов. Для начала мы создаем примерно такое дерево:

Каталог

Производители автомобилей

Цвета автомобилей

Теперь нам нужно наполнить каталог. Сегодня мы предлагаем Мерседес 600 (черный), Мерседес 601 (серебристый), Лексус 21 (серебристый) и Лексус 21М (каурый). (А каурый – это какой? Купите, посмотрите, не пожалеете:).

Для этого мы предусматриваем класс Автомобиль с атрибутами Производитель, Марка, Цвет.

Теперь наше дерево приобретает следующий вид (в квадратных скобках проставлены собственные атрибуты вершин):

Каталог

Производители автомобилей

Мерседес

1. [Автомобиль, Производитель="Мерседес" Марка="600" Цвет="Черный"]

2. [Автомобиль, Производитель="Мерседес" Марка="601" Цвет="Серебристый"]

Лексус

3. [Автомобиль, Производитель="Лексус" Марка="21" Цвет="Серебристый"]

4. [Автомобиль, Производитель="Лексус" Марка="21М" Цвет="Каурый"]

Цвета автомобилей

Но есть большая группа покупателей, которая выбирает автомобили не по мощности, удобством, безопасности, и даже не по числу колес, а только смотрит, подходит ли он к прическе. Следовательно, нужен раздел каталога «Цвета». Как его наполнять?

Подход 1 – дублирование

Копируем каждую вершину с описанием автомобиля в буфер Смереки и вставляем дубликат в соответствующую позицию каталога цветов (подход мысленно древа 2.5):

Каталог

Производители автомобилей

Мерседес

1. [Автомобиль, Производитель="Мерседес" Марка="600" Цвет="Черный"]

2. [Автомобиль, Производитель="Мерседес" Марка="601" Цвет="Серебристый"]

Лексус

3. [Автомобиль, Производитель="Лексус" Марка="21" Цвет="Серебристый"]

4. [Автомобиль, Производитель="Лексус" Марка="21М" Цвет="Каурый"]

Цвета автомобилей

Черный

5. [Производитель="Мерседес" Марка="600" Цвет="Черный"]

Серебристый

6. [Производитель="Мерседес" Марка="601" Цвет="Серебристый"]

7. [Производитель="Лексус" Марка="21" Цвет="Серебристый"]

Другой

8. [Производитель="Лексус" Марка="21М" Цвет="Каурый"]

Цель достигнута, но если 600-й Мерседес выйдет из моды и будут заменены на 609-й, то нам придется корректировать каждую такую вершину отдельно.

Подход 2 – переходы

При этом подходе мы вставляем в каталог цветов не дубликаты описаний автомобилей, а переходы к оригинальным описаний:

Каталог

Производители автомобилей

Мерседес

1. [Автомобиль, Производитель="Мерседес" Марка="600" Цвет="Черный"]

2. [Автомобиль, Производитель="Мерседес" Марка="601" Цвет="Серебристый"]

Лексус

3. [Автомобиль, Производитель="Лексус" Марка="21" Цвет="Серебристый"]

4. [Автомобиль, Производитель="Лексус" Марка="21М" Цвет="Каурый"]

Цвета автомобилей

Черный

[Переход, link="1"]

Серебристый

[Переход, link="2"]

[Переход, link="3"]

Другой

[Переход, link="4"]

Цель вновь достигнута и теперь для замены 600-го Мерседеса на 609-и нужно исправить только один атрибут в вершины 1.

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

Подход 3 – простые коллекторы

При этом подходе в каталог цветов вставляются вершины класса Автомобиль, в которых атрибут link указывает на полное описание товара:

Каталог

Производители автомобилей

Мерседес

1. [Автомобиль, Производитель="Мерседес" Марка="600" Цвет="Черный"]

2. [Автомобиль, Производитель="Мерседес" Марка="601" Цвет="Серебристый"]

Лексус

3. [Автомобиль, Производитель="Лексус" Марка="21" Цвет="Серебристый"]

4. [Автомобиль, Производитель="Лексус" Марка="21М" Цвет="Каурый"]

Цвета автомобилей

Черный

[Автомобиль, link="1"]

Серебристый

[Автомобиль, link="2"]

[Автомобиль, link="3"]

Другой

[Автомобиль, link="4"]

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

Подход 4 – сложные коллекторы

Недостаток всех трех подходов состоит в том, что общие атрибуты для родственных товаров дублируются в описании каждого товара. С использованием коллекторов можно внедрить определенную рационализацию:

Справочник [скрыт]

Производители [скрыт]

9. [Автомобиль, Производитель="Мерседес"] [скрыт]

10. [Автомобиль, Производитель="Лексус"] [скрыт]

Каталог

Производители автомобилей

Мерседес

1. [Автомобиль, link="9" Марка="600" Цвет="Черный"]

2. [Автомобиль, link="9" Марка="601" Цвет="Серебристый"]

Лексус

3. [Автомобиль, link="10" Марка="21" Цвет="Серебристый"]

4. [Автомобиль, link="10" Марка="21М" Цвет="Каурый"]

Цвета автомобилей

Черный

[Автомобиль, link="1"]

Серебристый

[Автомобиль, link="2"]

[Автомобиль, link="3"]

Другой

[Автомобиль, link="4"]

Отличие состоит в создании скрытого от пользователя каталога производителей. Этот каталог состоит из вершин класса Автомобиль, для которых задано только общие для всех товаров атрибуты, в нашем случае – это только Производитель. Поскольку элементы этого каталога – скрытые, покупатель не будет озадачен предложением Мерседеса-не-600.

Вместе с тем, когда покупатель кликает в каталоге цветов по черной машине, Смерека видит, что этот Автомобиль не имеет собственных атрибутов и коллекционирует для него атрибуты Марка, Цвет из вершины 1. Поскольку эта последняя вершина в свою очередь является коллектором, Смерека продолжает коллекционировать атрибуты и выбирает атрибут Производитель из скрытой вершины 9.

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

Подход 5 – два коллектора

Развивая идеи предыдущего подхода, добавляем словарь цветов:

Справочник [скрыт]

Производители [скрыт]

9. [Автомобиль, Производитель="Мерседес"] [скрыт]

10. [Автомобиль, Производитель="Лексус"] [скрыт]

Цвета [скрыт]

11. [Автомобиль, Цвет="Черный"] [скрыт]

12. [Автомобиль, Цвет="Серебристый"] [скрыт]

13. [Автомобиль, Цвет="Каурый"] [скрыт]

Каталог

Производители автомобилей

Мерседес

1. [Автомобиль, link="9" Марка="600" ColorLink="11"]

2. [Автомобиль, link="9" Марка="601" ColorLink="12"]

Лексус

3. [Автомобиль, link="10" Марка="21" ColorLink="12"]

4. [Автомобиль, link="10" Марка="21М" ColorLink="13" Цвет="Мышастый"]

Цвета автомобилей

Черный

[Автомобиль, link="1"]

Серебристый

[Автомобиль, link="2"]

[Автомобиль, link="3"]

Другой

[Автомобиль, link="4"]

Здесь мы расширили определение класса Автомобиль, добавив атрибут ColorLink и позаботились, чтобы шаблон страницы с описанием автомобиля выполнял не только стандартное коллекционирование атрибутов, но и коллекционирование по атрибуту ColorLink.

При таком подходе, если какой-то Автомобиль владеет собственным атрибутом Цвет, атрибут ColorLink, пытающийся придать значение цвета из словаря, будет проигнорирован. В нашем примере цвет Лексуса 21М переименована в «мышастый». (А «мышастый – это какой? Покупайте, это круто:).

В свою очередь, изменение словарной записи 11 из «черного» на «черноватый» автоматически повлияет на все товары, содержащие ссылки на этот элемент словаря.