Деревья в ООП

Nicki

Новичок
Деревья в ООП

Люди... помогите пожалуйста разобраться. Как в ООП юзать деревья? Очень прошу отозваться гуру ООП.

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

PHP:
class Category
{
    private $id = 0;

    /**
    * @var Category Обьект-предок
    **/    
    private $Parent = null;

    /**
    * @var array Массив обьектов-потомков
    * 'categoryId' => 'object'
    **/    
    private $childs = array();

/**
* Есть ли потомки, или это "лист"?
* @return bool
**/
public function hasChilds() {}    

/**
* Возвращает следующего потомка или false
* @return Category
**/
public function getNextChild() {}    

/**
* Возвращает родителя, или false если его нет
* @return Category
**/
public function getParent() {}    

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

Nicki

Новичок
А как тогда с ними работают например в java? Как с массивами?
 

dr-sm

Новичок
PHP:
interface Category
{
/**
* Есть ли потомки, или это "лист"?
* @return bool
**/
public function hasChilds() {}    

/**
* Возвращает следующего потомка или false
* @return Category
**/
public function getNextChild() {}    

/**
* Возвращает родителя, или false если его нет
* @return Category
**/
public function getParent() {} 
}
это не дерево! :)
 

Nicki

Новичок
нет, мне нужно:

1. получить данные дерева (ветки дерева) из БД
2. преобразовать данные в формат, в котором будут использоваться в скрипте (и выводе в том числе)
3. вывести дерево (как вариант)

Само дерево может хранится в БД, например, в Списках смежности (Adjacency List) или Вложенных множествах (Nested Sets) - принципиального значения не имеет т.к. сказано в FAQ http://phpclub.ru/faq/Tree/Internal?v=38y
что бы одни части Вашего проекта (вывод дерева, его обработка и т.п.) не зависили от того, как устроены другие его части (способ его хранения, способ его загрузки и т.п.)
Я хочу сделать вывод дерева из БД не в массив, а в объекты, т.к. учусь использовать объекты. В первом посте я привел листинг класса узла-дерева, то как я себе это представляю. Я правильно думаю или нет? Как работать с деревьями описанными в ОО стиле?

Причем я не спрашиваю совета о том как выбрать из БД нужную ветку или путь. Меня интерисует именно структура уже готового к использованию в скрипте дерева.
 

dr-sm

Новичок
ну попробуй, напиши код вывода дерева, с тем интерфейсом, что ты привел.
 

Nicki

Новичок
Я просто пытаюсь понять как используя ОО подход работать с деревьями. Кто ни будь выводит деревья в объектах или все используют только массивы?
 

Nicki

Новичок
HraKK
Проблема... Наверное пробемы нет. Просто хочу узнать правильный у меня ход мысли или нет? Я имею в виду то, что в каждом ОБЪЕКТЕ узла дерева нужно хранить ссылку на объект узел предка (к примеру для навигации по дереву от листа к корню) и массив объектов с потомками (собственно, например для вывода дерева в браузер - его то рисуют от корня). Так, или нет?

И еще такой вопрос. Какие посоветуете библиотеки для работы с деревьями? Дла работы с БД я испольхую adodb
 

HraKK

Мудак
Команда форума
Весь масив потомков не надо хранить - lazy load прочитайте
 

zerkms

TDD infected
Команда форума
The Composite Pattern
удивлён, что его ещё не озвучили
 

HraKK

Мудак
Команда форума
zerkms
Да я занят. А больше тут никто кто в онлайне шаблонами не по острит)
 

Maxsystems

Новичок
Автор оригинала: флоппик
«В ООП» — деревьев нет!
Совершенно верно =)

Объектно ореинтированное программирование(ООП), не связанно с деревьями. Очень распространено что ООП реализуют через классы из-за их универсальной гибкости, унекоторых новичков складывается ложное понятие что ООП это и есть сами классы.

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

Иван 76

Новичок
Посмотри вот это (написано под Zend Framework).
http://code.google.com/p/zend-tree/downloads/list

Еще можно посмотреть компонент Tree из
http://ezcomponents.org/download

-~{}~ 31.10.08 23:26:

Кстати, автор того материала что ты указал ( http://phpclub.ru/faq/Tree/Internal?v=38y )
разработал класс AList, который входит в состав системы http://popoff.donetsk.ua/text/work/light/

Посмотри его.
 
Сверху