За последние 24 часа нас посетили 18026 программистов и 1652 робота. Сейчас ищут 1510 программистов ...

композиции в php

Тема в разделе "Решения, алгоритмы", создана пользователем apt-get_mebeer, 17 ноя 2011.

  1. apt-get_mebeer

    apt-get_mebeer Активный пользователь

    С нами с:
    17 ноя 2011
    Сообщения:
    12
    Симпатии:
    0
    Добрый день!
    Начал изучать ооп, подскажите, я правильно понял что такое композиции:
    Выкладываю код.
    PHP:
    1.  
    2. <?php
    3. /*
    4.  * Класс для работы с точками доступа клиента (HotSpot)
    5.  */
    6. class Points {
    7.  
    8.     public function  __construct() {
    9.         //pass
    10.     }
    11.  
    12.     /**
    13.      * Метод возвращает количество активных точек для указанного клиента
    14.      * @param <type> $clientID
    15.      * @return <array()>
    16.      */
    17.     public function getCountActivePointsByClientID($clientID) {
    18.         $sql = "
    19.            select count(id) from points where client_id = {$clientID} and is_deleted = false
    20.        ";
    21.         return $this->db->executeOne($sql);
    22.     }
    23.  
    24. }
    25.  
    26. /*
    27.  * Класс для работы с банковскими реквзитами клиента
    28.  */
    29. class ClientAccountingDetails {
    30.  
    31.     public function  __construct() {
    32.         //pass
    33.     }
    34.  
    35.     /**
    36.      * Метод проверяет, удален ли ИНН клиента
    37.      * @param <int> $clientID
    38.      * @return <int>
    39.      */
    40.     public function getActiveTaxIdentificationNumberByclientID($clientID) {
    41.         // тут проверка удален ли ИНН клиента из системы, если удален то такого клиента нельзя удалять с БД пока не удалить ИНН
    42.         $sql = "
    43.            ........
    44.        ";
    45.         $x = $this->db->execute($sql);
    46.  
    47.         if($x == 1) { // не удален
    48.             return 1;
    49.         } else { // удален
    50.             return 0;
    51.         }
    52.     }
    53.  
    54. }
    55.  
    56.  
    57. class Clients {
    58.  
    59.     private $points;
    60.     private $clientAccountingDetails;
    61.  
    62.     private $_clientID;
    63.  
    64.     public function  __construct($clientID) {
    65.  
    66.         $this->_clientID = $clientID;
    67.  
    68.         // Создвем наши кубики (коллекцию)
    69.         $this->points                  = new Points();
    70.         $this->clientAccountingDetails = new ClientAccountingDetails();
    71.     }
    72.  
    73.     public function dropClient() {
    74.  
    75.         // Если у клиента все еще еcть активные точки доступа то не удаляем
    76.         $countPoints      = $this->points->getCountActivePointsByClientID($this->_clientID);
    77.         $activeTaxAccount = $this->clientAccountingDetails->getActiveTaxIdentificationNumberByclientID($this->_clientID);
    78.  
    79.         if ( $countPoints > 0  and $activeTaxAccount == 1) {
    80.             // ... ничего не делаем и информируем пользователя о том что клиента нельзя удалять и прекращаем сценарий
    81.         } else {
    82.             // ... тут уже начинаетс удаление клиента и конец
    83.         }
    84.     }
    85.  
    86. }
    87.  
    88.  
    89. /*
    90.  * Подтип класса Clients (Обычный клиент)
    91.  */
    92. class SampleClient extends Clients {
    93.  
    94.     public function  __construct($clientID) {
    95.         parent::__construct($clientID);
    96.     }
    97.  
    98.  
    99. }
    100.  
    101. /*
    102.  * Подтип класса Clients (V.I.P клиент)
    103.  */
    104. class VipClient extends Clients {
    105.  
    106.     public function  __construct($clientID) {
    107.         parent::__construct($clientID);
    108.     }
    109.  
    110. }
    111.  
    112.  
    113. /*
    114.  * Ну и наконец само использование этого кода
    115.  */
    116. ...
    117. $obj = new SampleClient($clientID);
    118. $obj->dropClient();
    119. ...
    120.  
    121. //и тоже самое
    122. ...
    123. $obj1 = new VipClient($clientID);
    124. $obj->dropClient();
    125. ...
    126.  
    127.  
    [/code]
     
  2. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
  3. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Composite - это паттерн Компоновщик. Это совсем не то, что композиция.
    В общем похоже на композицию, да.
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Хотя не знаю, что вкладывается в понятие Points. Если это точки доступа, которые лишь принадлежат данному клиенту, то это агрегация. Основное отличие - в композиции дочерний объект не может существовать без родителя. Т.е. счет клиента не может сущестовать отдельно от клиента, а вот точка доступа, полагаю, вполне может.
     
  5. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    а ясно. спасибо
     
  6. apt-get_mebeer

    apt-get_mebeer Активный пользователь

    С нами с:
    17 ноя 2011
    Сообщения:
    12
    Симпатии:
    0
    Клиент подключает точки доступа (то есть точка доступа не может существовать без клиента)
    Банковские реквизиты, аналогично.

    Прочитав книгу Гаммы "Наследование и композиции" (стр. 33) и наткнувшись по данной теме на статью (http://cssblast.ru/articles/oop_concepts/)
    Я понял следующие аспекты, композиции бывают 2х типов а) ассоциация б) аггрегация.
    Ассоциация - Это аналог наследования, но при этом мы скрываем реализацию. Ассоциация определяется типои связи "использует" и "имеет" .
    Так или иначе в реализации отношения ассоциация, класс составлен из других классов которые в отдельности умеют что то делать.
    А вот агрегацию не совсем понял.

    Но прочитав комментарий "MiksIr", посеял в своей голове следующию теорию.
    Ассоциация - Она использует тип связи "has a" - "имеет"
    Агрегация - тип связи "uses a" - "используют"

    В данном случае, я думаю все же, класс Points и ClientAccountingDetails относятся к классу Client типом связи "has a", так как каждый клиент может иметь 0...N количество точек доступа, каждый клиент в обязательном порядке "имеет" банковские реквизиты. Бред*?

    Если я где то что то напутал подскажите и двигаюсь не в том потоке, поправте.
    был бы рад если бы буквально и доходчиво растолковали эту тему. Спасибо.
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Да, и еще форум выбран не очень удачно, если честно. Тут почти нет сильных теоретиков. Вернее, сильных вообще нет ;) Попробуйте phpclub.ru или форумы более ооп-ных языков.
     
  9. apt-get_mebeer

    apt-get_mebeer Активный пользователь

    С нами с:
    17 ноя 2011
    Сообщения:
    12
    Симпатии:
    0
    Думаю они все есть, вот только денег хотят ;)
    Спасибо, начал читать
     
  10. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Да просто форум как бы для начинающих. Там даже если и ООП, то не вникая особо.
    Мне кажется, что отношение точки доступа к пользователю будет все же агрегацией. Композиция жестко подразумевает, что убивая агрегатор мы убиваем и агрегируемый объект (именно объект, а не ссылку на него). Тогда как точка доступа вполне может использоваться где-то еще. Т.е. называя это композицией мы по сути запрещаем использование точки доступа в других частях кода (например, вызвать ее по имени, адресу и т.п.).
    Но это все же мое имхо, ибо я тут тоже слабый теоретик. Советовал бы все же подискутировать еще и на других форумах ;)
     
  11. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Ну, да. Есть такое. Зато сколько сильных троллей 80-го левела ))
     
  12. apt-get_mebeer

    apt-get_mebeer Активный пользователь

    С нами с:
    17 ноя 2011
    Сообщения:
    12
    Симпатии:
    0
    Апельсин
    2ой день ищу ответа и объяснения на свои вопросы. пока света нет.
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    К сожалению в php композиций нет, тут сразу нужно вызывать объект или применять наследование (к сожалению множественного наследования тоже нет, также как и в Java->(есть композиции:)), только множественное наследование интерфейсов)
    И не надо изобретать велосипеды, 4 классами можно сделать 1 объект и не парить мозги и этого хватит.
    И чтобы проще было, использовать статик.
    Максимум, что можно сделать это разделить сайт на 3 объекта это сайт, бд и пользователь.
    Чтобы было удобнее...