Композиция или агрегация?

apt-get_mebeer

Новичок
Как бодрость духа?
Начал изучать ООП более детально. Возник вопрос насчет композиции, набросал небольшой код:
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();
...
Точка доступа не может существовать без клиента.
Банковские реквизиты клиента, аналогично.
Я правильно понял композицию? Или же в данном случае это агрегация если утверждать что в композиции один класс от другого не зависит. Всем спасибо заранее.
 

ПавелЗА

Новичок
Я обратил внимание что только классы SampleClient и VipClient имеют предков и то из их содержимого я понял что это только синонимы основного класса) На счет точки доступа так как у него нет предка то этот класс не от чего не зависит и с технической стороны может существовать без клиента.

п.с. если чесно я так и не понял в чем вопрос уточните пож?
 

AmdY

Пью пиво
Команда форума
apt-get_mebeer
это элементарно, когда один класс пользуется другим. В твоём коде есть $this->db
PHP:
class Foo {
      protected $db;
      public function __constructor($db) {
            $this->db = $db; // присваиваем аттрибуту класс Foo содержимое $db;
            // или так 
            $this->db = new Db();
      }
      public function runMethodFromDb() {
            // вызываем метод другого класса.
            return $this->db->runMethod();
      }
}
p.s. Зря ты взялся за банду четырёх, возми книжку попроще, ребята первопроходцы, а как известно - первый блин комом, очень тяжело читается, даже если есть опыт.
 

A1x

Новичок
про агрегацию и композицию есть у Фаулера (Основы UML)
Агрегация и композиция

К одним из наиболее частых источников недоразумений в UML -можно отнести агрегацию и композицию. В нескольких словах это можно объяснить так; Агрегация (aggregation) – это отношение типа «часть целого». Точно так же можно сказать, что двигатель и колеса представляют собой части автомобиля. Звучит вроде бы просто, однако при рассмотрении разницы между агрегацией и композицией возникают определенные трудности.

До появления языка UML вопрос о различии между агрегацией и композицией у аналитиков просто не возникал. Осознавалась подобная неопределенность или нет, но свои работы в этом вопросе аналитики совсем не согласовывали между собой. В результате многие разработчики считают агрегацию важной, но по совершенно другой причине. Язык UML включает агрегацию (рис. 5.3) но семантика ее очень расплывчата. Как говорит Джим Рамбо (Jim Rumbaugh); «Можно представить себе агрегацию как плацебо для моделирования» [40].

Наряду с агрегацией в языке UML есть более определенное свойство -композиция (composition). На рис. 5.4 экземпляр класса Point (Точка) , может быть частью многоугольника, а может представлять центр окружности, но он не может быть и тем и другим одновременно. Главное





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

Вы заметите, что на рис 5.4 я не показываю обратные кратности. В большинстве случаев, как и здесь, они равны 0..1. Единственной альтернативой является значение 1, когда класс-компонент разработан таким образом, что у него только один класс-владелец.

Правило «нет совместного владения» является ключевым в композиции. Другое допущение состоит в том, что если удаляется многоугольник (Polygon), то автоматически должны удалиться все точки (Points), которыми он владеет.

Композиция – это хороший способ показать свойства, которыми владеют по значению, свойства объектов-значений (стр. 100) или свойства, которые имеют определенные и до некоторой степени исключительные права владения другими компонентами. Агрегация совершенно не имеет смысла; поэтому я не рекомендовал бы применять ее в диаграммах. Если вы встретите ее в диаграммах других разработчиков, то вам придется покопаться, чтобы понять их значение. Разные авторы и команды разработчиков используют их в совершенно разных целях.
 

Redjik

Джедай-мастер
AmdY

Согласен про банду четырех, насикосок прочитал первый раз, в скором времени собираюсь по второму разу, уже пробуя делать свои примеры...
А какую книжку попроще ты имеешь ввиду?
 

A1x

Новичок
freeek, это она и есть - "банда четырех" ;)

простая и понятная книжка, читается как детектив
 

freeek

Новичок
sorry, не посмотрел)) а какую книгу то надо?
не знаю, по моему там все внятно описано и рассмотрено
 

apt-get_mebeer

Новичок
Всем огромное спасибо! Вроде разобрался с данныим связями.
Композиция - это когда один класс является частью другого и без него существовать не может.
Агрегация - это когда один класс является частью другого, но при этом они могут существовать как самостоятельные сущности.
Так же при композиции при удалении одной части, удаляется и другая часть.
Ассоциация - какая то явная связь. ;)
 

A1x

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

apt-get_mebeer

Новичок
вот я правда не понял почему Фаулер считает что

кстати рекомендую эту книгу - Фаулер "UML основы, третье издание" - там много интересного не только об UML, к тому же она очень тонкая
Да , согласен. только для меня немного сложно читать ее без доп. информации. в частности только после прочтения "Современные методы описания функциональности системы" -- А. Коберн, я смог понять Use Сases по Фаулерский.
 

Redjik

Джедай-мастер
Приемы объектно-ориентированного проектирования. Паттерны проектирования

Почитай эту книгу, мне понравилась. примеры на С, но это особого значения не имеет
Прикупил месяц как - но сначала решил по C++ учебник прочитать, чтобы лучше понимать.
 

freeek

Новичок
а что там понимать, на минимальном уровне все тоже самое, считай это за абстрактный код, псевдокод.
 
Сверху