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
Форумы портала PHP.SU :: Версия для печати :: Игла в яйце, яйцо в утке, утка в зайце...
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Игла в яйце, яйцо в утке, утка в зайце...

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

1. Mad_Alex - 12 Октября, 2011 - 15:41:15 - перейти к сообщению
Допустим предположим например:
Нужно описать какую-то группу абстракций, причем иерархическую
Ну например:

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

3 уровня

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

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


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

часто получается так что есть экземпляр верхнего уровня (человека) и нужно что-то сделать с его под-под экземплярами(пальцами)
Понимаю что можно и так и так, но хотелось бы понять как правильно и какой подход более ООПшный.
2. Stierus - 12 Октября, 2011 - 16:26:53 - перейти к сообщению
Не очень понял, а в чем вопрос-то ? Если вас смущает изрядное потребление ресурсов, заранее не зная, потребуются ли нам экземпляры нижележащих классов - почитайте про lazy load (http://www.design-pattern.ru/patterns/lazy-load.html) .
3. caballero - 12 Октября, 2011 - 17:07:04 - перейти к сообщению
Цитата:
Понимаю что можно и так и так, но хотелось бы понять как правильно и какой подход более ООПшный
.

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

Если по логике вложенный екземпляр должен знать о своем владельце значит надо
не должен значит ссылку на владельца передавать нет смысла
4. Mad_Alex - 13 Октября, 2011 - 08:30:31 - перейти к сообщению
caballero пишет:
Цитата:
Понимаю что можно и так и так, но хотелось бы понять как правильно и какой подход более ООПшный
.

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

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


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

при том что задача "понять какие каналы связаны с данным филиалом" - очень даже актуальна. Да я знаю что можно наваять функцию "получить все каналы филиала" а потом "получить филиал к которому привязан данный канал" и потом еще костылей... но что-то в этом не то Вам не кажется?
5. Stierus - 13 Октября, 2011 - 09:46:08 - перейти к сообщению
Нет, не должно. Вы должны описать интерфейс ваших классов, из этого интерфейса будет ясно, как лучше все организовать. Еще раз прошу прочесть про lazy load .. с каждым новым вашим постом, все больше прихожу к мысли, что это то, что вам нужно.

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


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

Stierus пишет:

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


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

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

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


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


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


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

Если так, то я удовлетворен. Сенкс! Улыбка
9. caballero - 13 Октября, 2011 - 11:47:10 - перейти к сообщению
Цитата:
Канал не является потомком филиала

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

А что касается скорости работы - так можно подтянуть с базы все одним запросом
выгрузить в массив а нему уже бегать циклами
тоже не слишком элегантно зато просто и быстро
10. Stierus - 13 Октября, 2011 - 13:55:16 - перейти к сообщению
Почитайте книгу "Философия Java" несмотря на то что книга по java, там хорошо изложено про Объектно-ориентированное программирование, что такое объекты, для чего они, как связываются между собой и тд. лишним не будет ни для кого.

 

Powered by ExBB FM 1.0 RC1