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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считать это "грязным хаком" ? или же "хорошим решением" ? 
V
    Опции темы
Alone
Дата 10.1.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Код

class a {

    var $name;
    var $new_name;
    
    function a($name) {
        
        $this = new b($name);
    }
    
    function setName($new){
        
    }
}

class b extends a  {

    function b($name) {
        $this->name = $name;
    }
    
    function setName($new){
        $this->new_name = $new;
    }
}

$obj = &new a("old");
$obj->setName("new");




--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



А что именно?
Зачем создавать объект внутри?

PM ICQ   Вверх
Alone
Дата 10.1.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Ну, скажем, класс а является абстрактным базовым, и от него унаследованы х классов.
В зависимости от определенного условия, необходимо взаимодействовать с классом, имя и реализация которого неизвестна (паттерн abstract_factory).
Пример:

$db1 = &new DbProvider("pgsql");
$db2 = &new DbProvider("mysql");

В зависимости от входного параметра будут созданы объекты необходимых типов (mysql, pgsql), кои являются прямыми наследниками DbProvider
Заодно экономия по памяти...


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Я бы делал проще.
Объявлял один класс, если это так надо, и описывал второй класс, причем второй наследует свойства и методы первого.
И создаешь ты один объект от описания второго класса.
PM ICQ   Вверх
Alone
Дата 10.1.2006, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



smile ты не понял ситуацию, или незнаешь паттерна abstract factory...
В примере используется АБСТРАКТНЫЙ класс DbProvider.
Создается экземпляр его типа
вот так: $db = new DbProvider("pgsql");
или так: $db = new DbProvider();
Тебе известны свойства и методы класса DbProvider, а что он внутри себя делает - это НИКОМУ не должно быть известно.

Цитата

И создаешь ты один объект от описания второго класса.

Я не должен об этом объекте ничего знать. Ни как он называется, ни где лежит...



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Alone я несколько не понимаю смысла... Ты делаешь интерфейс базы. Тебе надо всего лишь выбрать базу и все, но сами классы для каждой БД у тебя хранятся в разных файлах, но имеют одинаковое строение.

При чем тут абстракция?
PM ICQ   Вверх
Alone
Дата 10.1.2006, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Возможно с классами для БД получился несколько неудачный пример.
Я не хотел конкретизировать вопрос на БД. Это был частный случай. (как видно не совсем удачный)...

Представь себе, что за абстрактным классом скрыта реализация 20 различных классов, наследованных от базового, и при каком условии используется тот или иной класс - тебе неизвестно. Ты общаешься ТОЛЬКО через описанный интерфейс. Вот для такого случая я хотел задать первоначальный вопрос...


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Aloneа смысл?
PM ICQ   Вверх
Alone
Дата 10.1.2006, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



смысл чего?


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Абстрактных классов. На практике.
PM ICQ   Вверх
Alone
Дата 10.1.2006, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Э... перечитай плиз мой пост (про пример с скрытой реализ-ей 20 классов) еще раз.
Вроде как понятно изложил... Если непонятно - хрен с ним... закрывай эту тему.


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Bikutoru
Дата 10.1.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


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

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



Alone, по-моему гораздо лучшебудет, если абстрактный класс не будет знать о своих наследниках, а заботу о создании конкретной реализации абстрактного класса лучше возложить на отдельный клас/метод. Например так:
Код

<?php

class AbstractProvider
{
    function doSomething() {}
}

class MySQLProvider extends AbstractProvider
{
    function doSomething()
    {
        print "Something from MySQL";
    }
}

class PostgreSQLProvider extends AbstractProvider
{
    function doSomething()
    {
        print "Something from PotgreSQL";
    }
}

class ProviderFactory
{
    var $providers;

    function ProviderFactory()
    {
        $this->providers = array ();
    }

    function addProvider($name, &$provider)
    {
        if (isset($this->providers[$name]))
            return false;

        $this->providers[$name] = $provider;
        return true;
    }

    function getProvider($name)
    {
        if (isset($this->providers[$name]))
            return $this->providers[$name];

        return null;
    }
}


$pf = &new ProviderFactory();
$pf->addProvider("mysql", new MySQLProvider());
$pf->addProvider("postgresql", new PostgreSQLProvider());

$mysqlProv = $pf->getProvider("mysql");
$mysqlProv->doSomething();
$mysqlProv = $pf->getProvider("postgresql");
$mysqlProv->doSomething();
?>



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Alone
Дата 10.1.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Похоже меня никто не понял... smile Пример красив, только мы опять пошли по кругу.
Я не конкретную задачу решаю, а "обсасываю" механизм.

Цитата

Представь себе, что за абстрактным классом скрыта реализация 20 различных классов, наследованных от базового, и при каком условии используется тот или иной класс - тебе неизвестно. Ты общаешься ТОЛЬКО через описанный интерфейс.


Я всего лишь хотел спросить, если заменить ЭТО:
Код

class a {

    function a($name) {

        return new b($name);
    }
}


на ЭТО:

Код

class a {

    function a($name) {
        
        $this = new b($name);
    }
}


А все ударились в советы...




--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(Alone @ 10.1.2006, 18:17 Найти цитируемый пост)

если заменить ЭТО:

Цитата(Alone @ 10.1.2006, 18:17 Найти цитируемый пост)

на ЭТО:

Второе скорее всего будет ошибкой.
PM ICQ   Вверх
Alone
Дата 10.1.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



м... какой на твой взгляд ошибкой? Языка? Синтаксической?
Ни тому ни другому оно не противоречит. Тесты показали полную работоспособность smile
Вот как обстоит дело в рнр5... Может у них кардинально взгляды изменились... smile


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 10.1.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Alone ну а как ты себе представляешь такую картину.
Ты в текущий объект, в выполняем методе, да и еще в this, который только для внутреннего пользования создаешь новый объект. По логике Access Violation должен быть. Как это работает - диву даюсь.
PM ICQ   Вверх
Sardar
Дата 10.1.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Alone паттерн factory предпологает что класс имеет статичный метод, генерящий конкретный instance, например:

Код
require_once('DB.php');

//где возвращаеться конкретный обьект, реализующий логику
$con=&DB::connect('mysql://root@localhost/my_db');

В PEAR: DB драйвера наследуються от DB_common, но сути не меняет, можешь свои обьекты наследовать от абстракного MyClass и писать MyClass::Instance('my_sub_type');

Это будет правильно, а не new чего то.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alone
Дата 11.1.2006, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Sardar
Цитата

Это будет правильно, а не new чего то.


Та же "банда четырех" определяет назначение шаблона abstract factory как "предоставление интерфейса для создания семейств связанных между собой или зависимых друг от друга объектов без указания их конкретных классов"
Шаблон abstract factory гарантирует что система всегда реализует именно тот набор объектов, который отвечает данной ситуации.
Так что таки моя реализация соответствует определению. Да. В твоем пировском примере реализована именно фабрика. Я это место как раз и рассматривал для экспериментов smile Просто как вариант, подумалось, что если вместо отдельного метода, который инстанцирует и возвращает ссылку на новый объект - сделать это в конструкторе , с подменой текущего объекта.


PS: у меня еще с времен ZX-80 осталась "манечка" к минимизации всего. Вот и тут узрел экономию на целый объект smile
Добавлено @ 00:48
Mal Hack
Цитата

По логике Access Violation должен быть. Как это работает - диву даюсь.

О, вот это уже интереснее... Да. тут с тобой соглашусь... но блин работает... я попробую еще под нагрузкой, чтоб память "поработала", и хотелось бы тесты на рнр5, если у кого есть...


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Sardar
Дата 11.1.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(Alone @ 10.1.2006, 23:46 Найти цитируемый пост)
сделать это в конструкторе , с подменой текущего объекта.

Не каждый язык позволит "вернуть" другой обьект (в Java например физически не возможно), также по идее вообще в бесконечный цикл должен твой код убежать. Операция new стоит особнячком от обычной посылки сообщения, это выделение памяти, а конструктор это не просто метод. Для PHP конечно разницы особой нет (кроме памяти, резервируеться место под a и b(что в свою очередь резервирует ещё под своего а)), создаёться хештаблица на подобие той что в массивах юзаеться, далее вызываеться обычный метод, что на время считаеться конструктором.

В итоге, лучше так не делай smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alone
Дата 11.1.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



убедил. не буду.
Добавлено @ 01:06
кстати, в пире больше подошел бы паттерн адаптер вместо фабрики... IMHO smile


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
IZ@TOP
Дата 11.1.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


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

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



Цитата(Alone @ 11.1.2006, 01:46 Найти цитируемый пост)

О, вот это уже интереснее... Да. тут с тобой соглашусь... но блин работает... я попробую еще под нагрузкой, чтоб память "поработала", и хотелось бы тесты на рнр5, если у кого есть...

$this = чего-то; вызовет фатальную ошибку, по словам интерпретатора "Нельзя переназначить внутренний указатель объекта".


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

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


 




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


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

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