Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Игла в яйце, яйцо в утке, утка в зайце...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: как правильно в ООП описать многоуровневую иерархию сущностей?
Mad_Alex
Отправлено: 12 Октября, 2011 - 15:41:15
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011  
Откуда: Moscow


Помог: 0 раз(а)




Допустим предположим например:
Нужно описать какую-то группу абстракций, причем иерархическую
Ну например:

человек (класс)
у каждого человека есть конечности (класс)
у каждой конечности есть пальцы(класс)

3 уровня

каждый палец знает к какой конечности он принадлежит
и каждая конечность знает какие пальцы у нее есть

тоже самое с людьми которые знают о конечностях но не знаю напрямую о пальцах


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

часто получается так что есть экземпляр верхнего уровня (человека) и нужно что-то сделать с его под-под экземплярами(пальцами)
Понимаю что можно и так и так, но хотелось бы понять как правильно и какой подход более ООПшный.
 
 Top
Stierus Супермодератор
Отправлено: 12 Октября, 2011 - 16:26:53
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Не очень понял, а в чем вопрос-то ? Если вас смущает изрядное потребление ресурсов, заранее не зная, потребуются ли нам экземпляры нижележащих классов - почитайте про lazy load (http://www.design-pattern.ru/patterns/lazy-load.html) .
 
My status
 Top
caballero
Отправлено: 12 Октября, 2011 - 17:07:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Понимаю что можно и так и так, но хотелось бы понять как правильно и какой подход более ООПшный
.

Нужно решать конкретную задачу а не мерятся ООПешными пиписками.

Если по логике вложенный екземпляр должен знать о своем владельце значит надо
не должен значит ссылку на владельца передавать нет смысла


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Mad_Alex
Отправлено: 13 Октября, 2011 - 08:30:31
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011  
Откуда: Moscow


Помог: 0 раз(а)




caballero пишет:
Цитата:
Понимаю что можно и так и так, но хотелось бы понять как правильно и какой подход более ООПшный
.

Нужно решать конкретную задачу а не мерятся ООПешными пиписками.

Если по логике вложенный екземпляр должен знать о своем владельце значит надо
не должен значит ссылку на владельца передавать нет смысла


А как это понять? "По логике" не получается.
У меня такая практическая иерархия:
Есть филиал, в филиале несколько устройств, у устройства несколько интерфейсов к интерфейсам привязаны каналы.
Вот при создании экземпляра "филиал" как должно выглядеть? У него должно сразу создасться как члены все устройства, у которых сразу создасться все интерфесы....

при том что задача "понять какие каналы связаны с данным филиалом" - очень даже актуальна. Да я знаю что можно наваять функцию "получить все каналы филиала" а потом "получить филиал к которому привязан данный канал" и потом еще костылей... но что-то в этом не то Вам не кажется?
 
 Top
Stierus Супермодератор
Отправлено: 13 Октября, 2011 - 09:46:08
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Нет, не должно. Вы должны описать интерфейс ваших классов, из этого интерфейса будет ясно, как лучше все организовать. Еще раз прошу прочесть про lazy load .. с каждым новым вашим постом, все больше прихожу к мысли, что это то, что вам нужно.

ps
Цитата:
Да я знаю что можно наваять функцию "получить все каналы филиала" а потом "получить филиал к которому привязан данный канал" и потом еще костылей
не очень понял про костыли ... функция "получить всех потомков" в классе-родителе с каких пор стала костылем ? о_О
 
My status
 Top
Mad_Alex
Отправлено: 13 Октября, 2011 - 10:57:16
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011  
Откуда: Moscow


Помог: 0 раз(а)




Stierus пишет:
Цитата:
не очень понял про костыли ... функция "получить всех потомков" в классе-родителе с каких пор стала костылем ? о_О


Канал не является потомком филиала, он является потомком интерфейса, который является потомком устройства, а вот оно уже есть потомок филиала.
Т.е. это не "сын", это "правнук".

Stierus пишет:

Еще раз прошу прочесть про lazy load .. с каждым новым вашим постом, все больше прихожу к мысли, что это то, что вам нужно.


В общем идея понятна, но там упор на экономию запросов.
В целом сенкс, буду копать. Но вопросы глупые все равно буду задавать Улыбка
 
 Top
Stierus Супермодератор
Отправлено: 13 Октября, 2011 - 11:33:01
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Просто когда есть проблема - ее описывают, у вас же нет описанной проблемы. Нужно ли создавать пальцы, создавая руку? ... если вы хотите увидеть конечность - нужно, если ниже локтя вы смотреть не планируете - то зачем ? Смотрите свои задачи, разбирайтесь в необходимости и целесообразности, начните с описания API ... это те вещи, которые решать вам, т.к. всю картину видите только вы. Если же есть конкретная проблема - то ее можем обсудить. У вас нет даже просьбы дать совет ... советы на абстрактные вопросы не дают, это все равно что спросить: "а как мне туда попасть, на велосипеде, мотоцикле, машине, самолетом или троллейбусом?" ... куда попасть, что у вас есть и когда вам это нужно?

зы
Цитата:
В общем идея понятна, но там упор на экономию запросов
Это упор на экономию ресурсов ... в том числе и запросов. Понятное дело, что видеть целую руку удобнее, даже если вы не смотрите ниже локтя, удобнее, что бы было ве и в любой момент можно было бросить косой взгляд на кисть. Если вы задаетесь вопросом, нужно ли показывать эту самую кисть - значит по каким-то причинам, показать все для вас проблематично - единственно для меня логичным поводом является экономия ресурсов.

$body->getHand('right')->getFingers() это нормальная практика в ООП языках. А с помощью lasy load еще и не такая затратная
 
My status
 Top
Mad_Alex
Отправлено: 13 Октября, 2011 - 11:45:34
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011  
Откуда: Moscow


Помог: 0 раз(а)




Stierus пишет:
советы на абстрактные вопросы не дают


Собственно я хотел узнать "как правильно в теории?".
В суровой практике можно вообще без ООП все это сделать.


Stierus пишет:
$body->getHand('right')->getFingers() это нормальная практика в ООП языках. А с помощью lasy load еще и не такая затратная


О! Т.е. если нужно массив экземпляров пальцев при имении экземпляра body
$fingers = $body->getHand('right')->getFingers();
В смысле это не "так тоже можно", а это "нормально"?

Если так, то я удовлетворен. Сенкс! Улыбка
 
 Top
caballero
Отправлено: 13 Октября, 2011 - 11:47:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Канал не является потомком филиала

Наведите порядок в своих мыслях - потомок это наследование
а у вас принадлежность экземпляра другому экземпляру

А что касается скорости работы - так можно подтянуть с базы все одним запросом
выгрузить в массив а нему уже бегать циклами
тоже не слишком элегантно зато просто и быстро


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Stierus Супермодератор
Отправлено: 13 Октября, 2011 - 13:55:16
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Почитайте книгу "Философия Java" несмотря на то что книга по java, там хорошо изложено про Объектно-ориентированное программирование, что такое объекты, для чего они, как связываются между собой и тд. лишним не будет ни для кого.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB