Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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