Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрытие методов объекта 
:(
    Опции темы
chak
Дата 26.11.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.7.2010

Репутация: нет
Всего: нет



Представь объект дом. Есть у него как бы внутренние объекты которые не наследуют его. например провода, они ведь ни чего общего с домом не имеют. Но проводам нужна какая то информацию о доме, например где у него проложены кабель каналы. Что бы дать такую информацию проводам приходиться делать методы дающие эту информацию публичными. Проблема в том что объект человек который будет использовать объект дом видеть объект с кучей доступных ему публичных методов которые для него не предназначены, например та же инфра про кабель каналы. Это само собой плохо так как изначально планировалось, что у объекта дом будет гораздо меньше публичных методов и он будет, что-то вроде черного ящика, а не получается так как внутренним объектам нужна инфра и им не откуда ее получит кроме как через публичные методы дома. Что я делаю не так?
Внутренними объектами здесь я называю экземпляры классов хранящихся внутри базового класса, но ни как не связанные с ним через наследования. В моем примере это провода, которые являются частью дома, но с другой стороны, ни имеет, ни какого отношения к дому.
PM MAIL   Вверх
chak
Дата 26.11.2011, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.7.2010

Репутация: нет
Всего: нет



Пример для наглядности 
Код

    class Home
    {
        private $wires;
        
        function __construct()
        {
            $this->wires[] = new Wire($this, 5);
            $this->wires[] = new Wire($this, 10);
        }
        
        public function check_length($length)
        {
            return ( ($length <= 7 ) ? TRUE : FALSE );
        }
    }
    
    class Wire
    {
        function __construct($home, $length)
        {
            if ($home->check_length($length) === FALSE)
            {
                echo(" слишком длинный провод для этого дома ");
            };
        }
    } 

PM MAIL   Вверх
Sentox
Дата 26.11.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Паттерны Composite и Bridge в помощь.
Мостом можно абстрагироваться от "клиента" полностью (хотя мост навряд ли то самое, но может содержать интерфейсы для работы с внутренними конкретными объектами), композицией создать композиционный объект (сори  за тавтологию), в Вашем случае "Дом".
PM MAIL   Вверх
chak
Дата 27.11.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.7.2010

Репутация: нет
Всего: нет



Sentox
Спасибо, но к сожалению мне не удалось понять как мне могут помочь Composite и Bridge. На другом форуме посоветовали Proxy вот он действительно помог, решение конечно не смое красивое но хоть что-то.
PM MAIL   Вверх
Sentox
Дата 27.11.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Паттерн композит нужен когда есть составной объект с интерфейсами доступа  (не использования!) к внутренним объектам. Паттерн мост обеспечивает интерфейсами для работы с составным "абстрактным" объектом как с чем то единым целым, эти два паттерна со своими интерфейсами как раз и описывают составной объект, который инкапсулирует внутреннюю логику работы со своими внутренними объектами. То есть класс базового объекта будет имплементировать два различных интерфейса, что даст большую гибкость.
Так что здесь только нужно подумать что конкретно Вам нужно на уровне объектов. То что Вы описали выше называется составным объектом но никак не прокси. Прокси можно было бы использовать для этого составного (громоздкого) объекта если бы у Вас было бы несколько типов их, например: Дом - котедж или маленький домашний, строение завода (цех) и т.д. Тогда прокси можно было бы использовать как прослойка для незаметной работы с ДОМОМ , но ни как с его составными деталями.
Кстати прокси реально не о том:
user posted image


Это сообщение отредактировал(а) Sentox - 27.11.2011, 20:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1034 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.