Добрый день! Начал изучать ооп, подскажите, я правильно понял что такое композиции: Выкладываю код. PHP: <?php /* * Класс для работы с точками доступа клиента (HotSpot) */ class Points { public function __construct() { //pass } /** * Метод возвращает количество активных точек для указанного клиента * @param <type> $clientID * @return <array()> */ public function getCountActivePointsByClientID($clientID) { $sql = " select count(id) from points where client_id = {$clientID} and is_deleted = false "; return $this->db->executeOne($sql); } } /* * Класс для работы с банковскими реквзитами клиента */ class ClientAccountingDetails { public function __construct() { //pass } /** * Метод проверяет, удален ли ИНН клиента * @param <int> $clientID * @return <int> */ public function getActiveTaxIdentificationNumberByclientID($clientID) { // тут проверка удален ли ИНН клиента из системы, если удален то такого клиента нельзя удалять с БД пока не удалить ИНН $sql = " ........ "; $x = $this->db->execute($sql); if($x == 1) { // не удален return 1; } else { // удален return 0; } } } class Clients { private $points; private $clientAccountingDetails; private $_clientID; public function __construct($clientID) { $this->_clientID = $clientID; // Создвем наши кубики (коллекцию) $this->points = new Points(); $this->clientAccountingDetails = new ClientAccountingDetails(); } public function dropClient() { // Если у клиента все еще еcть активные точки доступа то не удаляем $countPoints = $this->points->getCountActivePointsByClientID($this->_clientID); $activeTaxAccount = $this->clientAccountingDetails->getActiveTaxIdentificationNumberByclientID($this->_clientID); if ( $countPoints > 0 and $activeTaxAccount == 1) { // ... ничего не делаем и информируем пользователя о том что клиента нельзя удалять и прекращаем сценарий } else { // ... тут уже начинаетс удаление клиента и конец } } } /* * Подтип класса Clients (Обычный клиент) */ class SampleClient extends Clients { public function __construct($clientID) { parent::__construct($clientID); } } /* * Подтип класса Clients (V.I.P клиент) */ class VipClient extends Clients { public function __construct($clientID) { parent::__construct($clientID); } } /* * Ну и наконец само использование этого кода */ ... $obj = new SampleClient($clientID); $obj->dropClient(); ... //и тоже самое ... $obj1 = new VipClient($clientID); $obj->dropClient(); ... [/code]
так это же наверное не композит. композит таков: http://www.fluffycat.com/PHP-Design-Patterns/Composite/
Composite - это паттерн Компоновщик. Это совсем не то, что композиция. В общем похоже на композицию, да.
Хотя не знаю, что вкладывается в понятие Points. Если это точки доступа, которые лишь принадлежат данному клиенту, то это агрегация. Основное отличие - в композиции дочерний объект не может существовать без родителя. Т.е. счет клиента не может сущестовать отдельно от клиента, а вот точка доступа, полагаю, вполне может.
Клиент подключает точки доступа (то есть точка доступа не может существовать без клиента) Банковские реквизиты, аналогично. Прочитав книгу Гаммы "Наследование и композиции" (стр. 33) и наткнувшись по данной теме на статью (http://cssblast.ru/articles/oop_concepts/) Я понял следующие аспекты, композиции бывают 2х типов а) ассоциация б) аггрегация. Ассоциация - Это аналог наследования, но при этом мы скрываем реализацию. Ассоциация определяется типои связи "использует" и "имеет" . Так или иначе в реализации отношения ассоциация, класс составлен из других классов которые в отдельности умеют что то делать. А вот агрегацию не совсем понял. Но прочитав комментарий "MiksIr", посеял в своей голове следующию теорию. Ассоциация - Она использует тип связи "has a" - "имеет" Агрегация - тип связи "uses a" - "используют" В данном случае, я думаю все же, класс Points и ClientAccountingDetails относятся к классу Client типом связи "has a", так как каждый клиент может иметь 0...N количество точек доступа, каждый клиент в обязательном порядке "имеет" банковские реквизиты. Бред*? Если я где то что то напутал подскажите и двигаюсь не в том потоке, поправте. был бы рад если бы буквально и доходчиво растолковали эту тему. Спасибо.
Да, и еще форум выбран не очень удачно, если честно. Тут почти нет сильных теоретиков. Вернее, сильных вообще нет Попробуйте phpclub.ru или форумы более ооп-ных языков.
Да просто форум как бы для начинающих. Там даже если и ООП, то не вникая особо. Мне кажется, что отношение точки доступа к пользователю будет все же агрегацией. Композиция жестко подразумевает, что убивая агрегатор мы убиваем и агрегируемый объект (именно объект, а не ссылку на него). Тогда как точка доступа вполне может использоваться где-то еще. Т.е. называя это композицией мы по сути запрещаем использование точки доступа в других частях кода (например, вызвать ее по имени, адресу и т.п.). Но это все же мое имхо, ибо я тут тоже слабый теоретик. Советовал бы все же подискутировать еще и на других форумах
К сожалению в php композиций нет, тут сразу нужно вызывать объект или применять наследование (к сожалению множественного наследования тоже нет, также как и в Java->(есть композиции), только множественное наследование интерфейсов) И не надо изобретать велосипеды, 4 классами можно сделать 1 объект и не парить мозги и этого хватит. И чтобы проще было, использовать статик. Максимум, что можно сделать это разделить сайт на 3 объекта это сайт, бд и пользователь. Чтобы было удобнее...