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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> global в методах класса 
V
    Опции темы
youri
Дата 2.10.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Simpliest @  2.10.2009,  01:16 Найти цитируемый пост)
Там останавливаются на конкретном решении, - которое им подошло, - Service Locator.Dependency Injection упомянут вскользь, видимо, для них он оказался слишком сложным.

у тебя какое-то субъективно-негативное отношение к этой статье. Может потому, что не любишь TDD? Да, они для себя выбрали решение, но тем не менее они рассказали про другие варианты

Цитата(Simpliest @  2.10.2009,  01:16 Найти цитируемый пост)
Их осталось столько же.Был один "звездный" объект мы его заменили другим объектом путем прямого редактирования кода объектов.Статическая зависимость, которая якобы мешала ТДД осталась.

как это осталось столько же? Была куча звездных объектов, выполненных в качестве Sinleton'ов, вместо них остался один toolkit
Цитата

Начав с одиночек, мы быстро осознали их недостатки в модульном тестировании, и попробовали реализовать версию Service Locator, которая бы была удобной в использовании и не мешала тестированию.


Цитата(Simpliest @  2.10.2009,  01:16 Найти цитируемый пост)
Надо будет опять поменять - мы будем или редактировать эти объекты или будем увеличивать "звездность" и запутанность Service Locator.А представьте, если нам нужно будет добавить новый функционал не затронув старого для соседей?В случае Injection я просто в конкретном месте передам новый объект реализующий нужный интерфейс.В случае Locator -  мне придется выдумывать пляски с бубном.  Мне нужен объект с интерфейсом IA, а какой конкретно из 2х - хрен его знает. Смысла телодвижений 0. Оставались бы уже с Singleton.

не думаю, что это распространенная задача в TDD. У нас есть тесты. Можно исправить tool и тех, кто его использует. Но даже если мы хотим это оставить на потом, ничто не мешает добавить нам исправленный tool под другим именем в toolkit

Цитата(bars80080 @  2.10.2009,  14:18 Найти цитируемый пост)
а в трёх фразах можно же?

вот, например, статическая зависимость
Код

class Server{ 
  function serve(){
    […]
    $log = Log::get_instance();
    $log->logOk(‘Served Ok’);
  }
}

т.е. Server напрямую обращается к объекту. Но можно избавить его от лишней информации
Код

class Server(){
  protected $log;
 
  public function __construct($log){
    $this->log = $log;
  }
 
  public function serve(){
    [...]
    $this->log->logOk(‘Served Ok’);
  }
}

при этом мы сможем не меняя класс Server передать ему другой объект. Для одного клиента это не так важно, но когда клиентов много...
PM   Вверх
bars80080
Дата 2.10.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



так это здесь получилось копирование объекта?
а зачем? пусть один объект для всех идёт
PM MAIL WWW   Вверх
youri
Дата 2.10.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это не копирование, обьекты в php передаются по ссылке (упрощенно) 
PM   Вверх
bars80080
Дата 2.10.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



всегда, что ли?
PM MAIL WWW   Вверх
youri
Дата 2.10.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в 5-ой версии
PM   Вверх
nerezus
Дата 3.10.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

всегда, что ли?
 Да, всегда. Пора бы уже и основы PHP знать.

Цитата

в 5-ой версии
 Во всех актуальных. Т.е. в 5 и 6(ее уже пора принимать во внимание).


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
bars80080
Дата 3.10.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(nerezus @  3.10.2009,  09:34 Найти цитируемый пост)
Пора бы уже и основы PHP знать.

почему?
PM MAIL WWW   Вверх
youri
Дата 3.10.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



зато у bars80080 одна награда есть smile 
PM   Вверх
nerezus
Дата 3.10.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

почему?
 Что почему? Что объекты всегда передаются по ссылке?

Цитата

зато у bars80080 одна награда есть  
 А у авторов inphp.org есть сайт inphp.org, и что? Это еще не значит, что они хорошо знают php ;)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
bars80080
Дата 3.10.2009, 20:38 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(nerezus @  3.10.2009,  16:31 Найти цитируемый пост)
Что почему? Что объекты всегда передаются по ссылке?

почему отношение такое негативное? вы не кушали сегодня йогурт "нежный"? или вы опять кому-то отказали?
PM MAIL WWW   Вверх
Simpliest
Дата 5.10.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(youri @  2.10.2009,  18:17 Найти цитируемый пост)
как это осталось столько же?

Речь шла о конкретном объекте.

Для приложения пачка Singleton (почему появилась эта самая пачка - тот еще вопрос) хуже чем один Service Locator - это очевидно.

Цитата(youri @  2.10.2009,  18:17 Найти цитируемый пост)
добавить нам исправленный tool под другим именем в toolkit

А потом унаследовать класс и переопределить метод где мы вызывали этот самый tool на toolkit?

Старый класс
Код

class A
{
    public function __construct()
    {
        $this->service = ServiceLocator:getTool('tool');
    }
}


Новый класс
Код

class B extends A
{
    public function __construct()
    {
        $this->service = ServiceLocator:getTool('toolkit');
    }
}


Не проще ли
Код

class A
{
    public function __construct($service)
    {
        $this->service = $service;
    }
}

$a = new A(new Service('tool');
$b = new A(new NewService('toolkit'));
// можно даже так
$c = new A(ServiceLocator::getTool('toolkit'));


Почуствуйте разницу и уровень завязанности кода.


--------------------
user posted image
PM   Вверх
youri
Дата 6.10.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Simpliest @  5.10.2009,  17:31 Найти цитируемый пост)
Речь шла о конкретном объекте.

минутку. Где шла речь об одном объекте? Класс Server
Код

class Server{ 
  function serve(){
    […]
    Log :: logOk(‘Served Ok’);
  }
}

упоминается при описании характера зависимостей
и в том же разделе указывается один из вариантов обеспечения инверсии зависимостей
Код

class Client(){
  protected $server;
 
  public function __construct(){
    $this->server = Locator :: instance()->getServer();
  }
 
  public function action(){
    [...]
    $this->server->serve();
    [..]
  }
}

дальше идет более подробное обсуждение. В этом же разделе особого сравнения нету

Цитата(Simpliest @  5.10.2009,  17:31 Найти цитируемый пост)
А потом унаследовать класс и переопределить метод где мы вызывали этот самый tool на toolkit?

вы вырвали фразу из контекста. Я говорил об этом как о временном решении. А вообще, конечно, в данной ситуации dependency injection удобнее. Но такой подход имеет и недостатки
Цитата

Передача объектов по цепочке - решение, при котором часто используемые объекты передаются по цепочке на сколь угодную глубину. Нами этот способ раньше использовался, например, для передачи объектов Запроса и Ответа приложения. В целом этот способ имеет слишком большие недостатки тем, что раздувает количество передаваемых параметров в конструкторы или методы классов. Пытаясь преодолеть этот недостаток, некоторые вводят понятие контекста. Такой подход предусматривает создание такого весьма тяжелого контейнера, который в себе хранит (может также отвечать за инициализацию) все нужные приложению объекты. Этот контекст передается между всеми объектами приложения, если тем нужно что-либо из этого контекста. Как правило, контекст содержит четкий предопределенный набор объектов и четкий интерфейс. Такой подход применяется в php-фреймворках Symfony и CodeIgniter. Передача объектов по цепочке – push прием (Constructor Injection или Setter Injection), хотя в случае с контейнером уже двойной Inject + Lookup.

Цитата

Передача объектов по цепочке с использованием контейнера - в целом очень неплохой прием, который обеспечивает четкий интерфейс получения «звездных» объектов клиентским кодом. При необходимости расширения базового контейнера можно создать дочерний класс. Такой контейнер позволяет легко обеспечить lazy initialization часто используемых объектов.

Цитата

Я нашел следующие недостатки глобальных контейнеров:

    *
      Практика показала, что в такие контейнеры также загоняются и дополнительные сервисные и фабричные методы. В тестах иногда нужно иметь возможность изменить поведение этих методов. Однако при реализации контейнера, как в Symphony, мы имеем фактически статическую зависимость клиентского кода от класса контейнера, и эту подмену осуществить не удастся.
    *
      Если же контейнер не является одиночкой, а передается всегда явно, тогда нужно реализовать метод его получения из любого места приложения, так как делать метод setContext($context) в каждом классе не слишком приятно.

В принципе, для преодоления этих недостатков, достаточно сделать главный контейнер, в котором будет храниться набор конкретных контейнеров. В этом случае получится вариант решения, который мы долго использовали в Limb3 до появления современной версии пакета Toolkit (об этом чуть ниже). 


Это сообщение отредактировал(а) youri - 6.10.2009, 09:19
PM   Вверх
Simpliest
Дата 6.10.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(youri @  6.10.2009,  09:18 Найти цитируемый пост)
минутку. Где шла речь об одном объекте?


Да вот же...
вы тут их и привели. Что непонятного?

Был класс Server с  1й статической зависимостью
Код

Log :: logOk(‘Served Ok’);


Мы показываем пример (используя другой класс), как избегать статических зависимостей, и... о чудо
Код

$this->server = Locator :: instance()->getServer();

приводим пример с Client с 1й статической зависимостью...

Я не понимаю smile  Куда вы пытаетесь мыслью уплыть?


--------------------
user posted image
PM   Вверх
youri
Дата 6.10.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да, не внимательно прочитал тот раздел. Там приводиться пример статической зависимости класса Server от класса Log. Затем сравниваются статические и динамические зависимости. Затем приводиться примеры избавления от статических зависимостей (с предыдущими примерами практически не связаны). Пример для Service Locator показывает как избавиться для некоторого абстрактного класса от статической зависимости от одного из "звездных" объектов - класса Server. В чем проблема? Было много "звездных" объектов и статических зависимостей от них. В результате получили одну статическую зависимость от Service Locator
PM   Вверх
Simpliest
Дата 6.10.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(youri @  6.10.2009,  13:27 Найти цитируемый пост)
 В чем проблема? Было много "звездных" объектов и статических зависимостей от них. В результате получили одну статическую зависимость от Service Locator 

Проблема в подаче и материале.

Избавиться от статических зависимостей
и 
Уменьшить число статических зависимостей

Разные вещи. Не так ли?


--------------------
user posted image
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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