Деревья в ООП

  • Автор темы Автор темы Nicki
  • Дата начала Дата начала

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() {}    

}

Т.е. структура дерева хранится в виде объектов, каждый из которых инкапсулирует в себе объект предок и массив потомков. Или я неправильно понимаю реализацию дерева в ООП?
 
А как тогда с ними работают например в java? Как с массивами?
 
PHP:
interface Category
{
/**
* Есть ли потомки, или это "лист"?
* @return bool
**/
public function hasChilds() {}    

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

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

это не дерево! :)
 
нет, мне нужно:

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

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

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

И еще такой вопрос. Какие посоветуете библиотеки для работы с деревьями? Дла работы с БД я испольхую adodb
 
Весь масив потомков не надо хранить - lazy load прочитайте
 
The Composite Pattern
удивлён, что его ещё не озвучили
 
zerkms
Да я занят. А больше тут никто кто в онлайне шаблонами не по острит)
 
Автор оригинала: флоппик
«В ООП» — деревьев нет!
Совершенно верно =)

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

Я раньше когда с классами не дружил совсем, пытался реализововать ООП на функциях, вприципе я тогда даже не знал что занимаюсь разработкой с уклоном на ооп =), а когда поднялся до классов, то почуствовал огромный простор для программирования.
 
Посмотри вот это (написано под 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/

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