Колектори і переходи
А що робить атрибут 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 з «чорного» на «чорнявий» автоматично вплине на всі товари, які містять посилання на цей елемент словника.