вопрос то ли по дереву то ли по программингу...

Benderlio

Новичок
вопрос то ли по дереву то ли по программингу...

есть дерево (своего рода каталог параметров продукта, с подпунктами ),
(таблица с деревом вида id, parent_id, name )
есть значения параметров хранящиеся в другой таблице...
необходимо выводить дерево со значениями..
если есть значение то выводить "ветку"(т.е. те записи которые являются ее родителями)... если нет записей то не выводить

как бы вывести дерево с параметрами не составляет труда, но вот вывести как мне необходимо что то не получается
может кто сталкивался с такой задачей , есть алгоритм ?
 

exxbrain

Новичок
Есть:

1. Move Accumulation to Collecting Parameter - из "Рефакторинга..." Кериевски - отличнейшая чтуковина для сбора результатов при обходе дерева,
вот ссылка
industriallogic.com/xp/refactoring/accumulationToCollection.html

есть еще более мощный инструмент годится для сбора результатов при обходе многотипового дерева
http://industriallogic.com/xp/refactoring/accumulationToVisitor.html


2. Decorator
 

Benderlio

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

exxbrain

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

Надо добавить атрибуты toDisplay и Parent к классу Node. И проверку сделать в getChildren.

-~{}~ 05.03.07 12:27:

лучше вообще removeNode
 

Фанат

oncle terrible
Команда форума
exxbrain
у тебя слишком excessive brain. надо быть проще.

Ему всего лишь нужно при выводе меню сайта, выводить раскрытой ветку текущего раздела, а от остальных - только корневые.
 

Benderlio

Новичок
это не меню сайта
это список параметров (масштабируемый)
т.е. например

экран
----тип
------тфт
------сенсорный
----разрешение
------1
------2
ну и так далее
например есть значение у параметра 2 то необходимо вывести:

экран
----разрешение
------1 и значение

что то в этом духе ... вот никак не получается толково вывести
хотелось что бы выводило вне зависимости от количества уровней вложения
 

exxbrain

Новичок
Benderlio
При создании дерева можно использовать builder. Рефакторинг Encapsulate Composite With Builder. Я очень рад, что узнал об этом :) Из той же книги.

Фанат
надо быть проще.
Думаю надо вести код к реальным понятиям логики. Которые можно "пощупать". Тогда будет все очень просто.
Что кажется вам запутанным в parent и toDisplay?

Хотя неявное дерево в ряде случаев может быть.
Но если вы хотите производить с ним какие-либо сложные операции все-таки проще и надежнее использовать шаблон Composite.
 

exxbrain

Новичок
Автор оригинала: Frol
exxbrain
а чай каким паттерном заваривать?
:)
отлично.
вобщем хотелось о деревьях поговорить. этот вопрос живо интересует.
в разработке некая относительно :) универсальная система на основе composite

-~{}~ 05.03.07 22:48:

Автор оригинала: Frol
exxbrain
а чай каким паттерном заваривать?
Helpera достаточно.
Кстати composite тут тоже присутствует :)
 

Фанат

oncle terrible
Команда форума
exxbrain
без ёрничества.
Я думаю, топик человека, впервые "каталог" - не лучшее место для разговора о деревьях.
Уверен, многим будет интересен такой разговор, если начать его самому, и с тех проблем, которые интересуют тебя самого.
 

exxbrain

Новичок
Фанат
Хотел поделиться с человеком найденным материалом. Задача у него, ксатати, по крайней мере, в таком виде в котором он себе ее поставил - не такая простая. Решение есть - достаточно всем родителям проблемного узла дать инструкцию не отображать себя - все. Дальше разговор, видимо, "по программингу..."
 

exxbrain

Новичок
В общих чертах мысль такова. Если кто-то хочет заняться деревьями с бесконечной вложенностью, то сразу нужно приступить к изучению шаблона Composite. Тем более если еще действия какие-то производить над деревом. Да еще данные из базы брать.
Знаю - просто раньше наткнулся на эти грабли. Теперь боюсь смотреть на тот код, который я написал тогда. Не пожелал бы вам такой участи.

-~{}~ 05.03.07 23:25:

Кстати, дерево в базе - это уже признак для применения этого шаблона.
 

mak_sim2001

Новичок
Блин будет интерестно почитать про Composite, а то я время от времени возращаюсь к одному дереву и в ужасе постоянно, что я тут за код навоял, трачу уйму времени на разбор своего кода, когда чегото поменять надо...
 

jonjonson

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

hermit_refined

Отшельник
раз тут уже пошел оффтоп, то...
Автор оригинала: exxbrain
1. Move Accumulation to Collecting Parameter - из "Рефакторинга..."
...
http://industriallogic.com/xp/refac...nToVisitor.html

2. Decorator
это все правильно и красиво.
но... вы пробовали это как-нибудь по-человечески состыковать с шаблонами?..
 

exxbrain

Новичок
Автор оригинала: jonjonson
Паттерн Composite никак не отвечает на вопрос о выводе дерева. Он лишь позволяет структурировать объекты. Другими словами, он помогает связать различные объекты, но ничего не говорит о манипуляции над ними, например, как над древовидной иерархией.
Это да. Но в процессе создания возможно работать с частично созданным деревом, если добавим немного в класс Node. Например, можем пройтись по родителям узла. Как в данном случае.

В любом случае встает вопрос:
какими способами внедряться в процесс получения дерева?

http://industriallogic.com/xp/refactoring/compositeWithBulder.html
отличный пример понятного создания дерева
 

Benderlio

Новичок
exxbrain

да вот что то не совсем понятно ...
если бы поглядеть на конкретный пример ...
(и достаточно ли для этого пхп 4 или только 5-ка ? )
 
Сверху