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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Паттерн Внедрение Зависимости 
:(
    Опции темы
solenko
Дата 16.7.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не так давно появился сайт Symfony Components, на который авторы фреймверка symfony выкладывают библиотеки, которые написаны в процессе разработки фреймверка, но могут быть использованы отдельно.

Один из таких компонентов -- Symfony Service Container.
Это компонент, который реализует паттерн Контейнер Внедрения Зависимостей.
Также была написана небольшая книга, которая описывает принципы работы компонента.

Книгу стоит почитать даже если вы не собираетесь использовать компонент -- первые главы описывают сам паттерн, а не конкретный компонент.

Мой вариант превода книги: http://madbee.ukr.su/solenko/dependency-injection/

ksnk и Sanchezzz - очень рекомендую для прочтения (после тем о загрузке классов).

Буду благодарен за критику перевода -- как-никак первый опыт.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 16.7.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



solenko, Там есть орфографических ошибок. Можно внедрить систему орфус и корректировать прямо по прочтении...

А вообще - спасибо! Не  дочитал, но пока - интересно smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 16.7.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Паттерн, вообще говоря, требует перепроектирование уже спроектированной системы :-( 

К примеру, разнообразные плагины CMS'ки в редкие моменты своего функционирования желают воспользоватся функцией mail. Мы, как умные ООП программисты обернули mail в показавшуюся нам удобной в тот момент обертку.
Строки, работающие с классом выглядят как 
Код

$mail = new mail();
... // send mail 


В дальнейшей жизни нам показалось недостаточной реализация mail и родилась обертка mail2.
Рассматриваются варианты внедрения новой обертки в уже существующие тексты плагинов с минимальной правкой исходного кода...

Рассматриваемый паттерн предлагает нам подставлять уже проинициализированный элемент класса mail2 в объект, не взирая на то, что этот класс реально может и не понадобится? Это ли тру ООП?

Это сообщение отредактировал(а) ksnk - 16.7.2009, 18:31


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 16.7.2009, 19:15 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



в статье Контейнеры Внедрения Зависимостей автор путает паттерн фабрика с паттерном "Внедрения зависимостей" smile 

Вообще, это паттерн-ориентированное программирование - тупик. Нужно сначала писать код, а потом уже угадывать в его контурах тот или иной паттерн  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 16.7.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ksnk @  16.7.2009,  17:30 Найти цитируемый пост)
Рассматриваемый паттерн предлагает нам подставлять уже проинициализированный элемент класса mail2 в объект, не взирая на то, что этот класс реально может и не понадобится? Это ли тру ООП?


Заивисимость != может использовать. Т.е. если ваш класс не может работать без какого-либо другого, то имеет смысл использовать внедрение зависимости. В вашем же случае -- нет.


Цитата(ksnk @  16.7.2009,  18:15 Найти цитируемый пост)
в статье Контейнеры Внедрения Зависимостей автор путает паттерн фабрика с паттерном "Внедрения зависимостей" 

Похоже вы путаете то, что автор называет Dependency Injection и Dependency Injection Container. Непосредственно внедрению зависимостей посвящена только первая глава.

Паттерн фабрика предназначен не для разрешения проблеммы зависимостей. Фабрика просто создает какой-либо из подтипов (наследников) более общего типа. При этом ничего не зная о том как его инициализировать и о его зависимостях.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 16.7.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(solenko @  16.7.2009,  19:59 Найти цитируемый пост)
Dependency Injection Container

в статье - это чистой воды фабрика. объект пользователь спрашивает у объекта фабрики - "Дай мне экземпляр объекта mail"... То что этот вопрос формулируется в виде вызова функции контейнера никак не влияет на фабричность... smile Описывемый в первой главе паттерн - это да, это Dependency Injection. А остальное к нему имеет не очень большое отношение. 
Польза Dependency Injection в том, что есть единственное место (сонфигурационный файл), в котором в экземпляр - контейнер  вставляют необходимые ему для работы уже проинициированные компоненты. 
А естл эти компоненты сокрыты в непонятно где лежащем отдельном объекте контейнер, "инициализация" которого делается типично фабричным методом, то и называть такой контейнер стоит фабрикой...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 16.7.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ksnk @  16.7.2009,  19:06 Найти цитируемый пост)
в статье - это чистой воды фабрика. объект пользователь спрашивает у объекта фабрики - "Дай мне экземпляр объекта mail"... То что этот вопрос формулируется в виде вызова функции контейнера никак не влияет на фабричность...

Вот только не просто создается объект mail (фабрика), а еще и выполняется его конфигурирование -- создается объект mail_transport (контейнер).

Основная разница как раз в том, что фабрика подразумевает самоконфигурирование объектов, а контейнер -- конфигурирует их.

Добавлено через 2 минуты и 28 секунд
Кроме того, фабрика порождает объекты какого-либо одного класса (т.е. возвращает экземпляры подклассов одного класса), а контейнер работает с произвольными классами. Хотя ключевая разница -- конфигурирование.

Добавлено через 5 минут и 1 секунду
Кстати, перефодом я занялся после прочтения http://habrahabr.ru/blogs/php/64061/
Там рассматривается разница фабрики и контейнера.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
youri
Дата 16.7.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  16.7.2009,  19:15 Найти цитируемый пост)
Вообще, это паттерн-ориентированное программирование - тупик. Нужно сначала писать код, а потом уже угадывать в его контурах тот или иной паттерн   

и какой смысл "потом" в паттернах? Это какое-то антипаттерн-ориентированное программирование ;)
PM   Вверх
ksnk
Дата 16.7.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



youri, Ну дык откуда взялись-то паттерны? Просто их "отцы-создатели" анализировали большое количество кода и обнаружили, что приемы программирования, вообще говоря можно классифицировать. Примерно та-же фигня, как и в биологии. Типо - хордовые, покрытосемменные, парнокопытные... Сильно обрадовались биологи и начали все обзывать по новой классификации, ан не тут-то было. природа она завсегда всякой классификации найдет свое исключение... smile 

Цитата(youri @  16.7.2009,  21:45 Найти цитируемый пост)
Это какое-то антипаттерн-ориентированное программирование ;) 

"Здравый смысл"-ориентированное программирование!  

Цитата(solenko @  16.7.2009,  20:14 Найти цитируемый пост)
 а еще и выполняется его конфигурирование -- создается объект mail_transport 

Да ну? Вот квинтэссенция статьи "Контейнеры Внедрения Зависимостей". Тру-ООП код, размещенный предпоследним (последний пример - несущественная для ООП мутация в сторону синглтона)
Код

class Container
{
  // ...
 
  public function getMailer()

  {
    $class = $this->parameters['mailer.class'];
 
    $mailer = new $class();
    $mailer->setDefaultTransport($this->getMailTransport());

 
    return $mailer;
  }
}
 
$container = new Container(array(

  'mailer.username' => 'foo',
  'mailer.password' => 'bar',
  'mailer.class'    => 'Zend_Mail',

));
$mailer = $container->getMailer();

Чем, скажите мне, этот код не фабрика? "Фабричный класс" имеет четко определенный (пустой) конструктор. Сам конструктор обязан инициализироваться, выковыривая из некоей "регистри" собственные параметры. Чужой дядя, обращается к контейнеру со словами "getMailer" - дай мне почтальона... Причем тут еще какой-то Dependency Injection? Тем что этот код мутациями и издевательствами из него трансформировали?

Добавлено через 12 минут и 23 секунды
А в статейке-затравке мне понравился вот такой код-конфигурация:
Код

$injector = new Phemto(); 
$injector->whenCreating('Page')->forVariable('session')->willUse(new Reused('Session')); 
$injector->whenCreating('Page')->forVariable('continuation')->willUse('Continuation'); 
$injector->whenCreating('Page')->forVariable('alerts')->willUse('Alert'); 
$injector->whenCreating('Page')->forVariable('accounts')->willUse('Accounts'); 
$injector->whenCreating('Page')->forVariable('mailer')->willUse('Mailer'); 
$injector->whenCreating('Page')->forVariable('clock')->willUse('Clock'); 
$injector->whenCreating('Page')->forVariable('request')->willUse('Request'); 
return $injector;

 Есть в этом некая благородная креза! Хотя обильное повторение некоторых слов портит все впечатление... А вот если переписать этого монстра с помощью ассоциированного массива, может получится радующая мой глаз конструкция
Код

$injector = new Phemto(array(
  'Page'=>array(
       'session'=>new Reused('Session'), 
       'continuation'=>'Continuation', 
       'alerts'=>'Alert',
... 
)));
return $injector;



Это сообщение отредактировал(а) ksnk - 16.7.2009, 22:48


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
  Дата 17.7.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



Цитата

$injector = new Phemto(array(
  'Page'=>array(
       'session'=>new Reused('Session'), 
       'continuation'=>'Continuation', 
       'alerts'=>'Alert',
... 
)));
return $injector;

По мне фабрика лучше выглядит, когда ты только передаешь названия нужных тебе для подключения классов и через другую функцию получаешь нужный тебе экземпляр или на прямую через массив классов.
Меньше леса получается да и читается код с легкостью




--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Sanchezzz
  Дата 17.7.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



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


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
youri
Дата 17.7.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  16.7.2009,  22:47 Найти цитируемый пост)
Сильно обрадовались биологи и начали все обзывать по новой классификации, ан не тут-то было. природа она завсегда всякой классификации найдет свое исключение...  

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

Цитата(ksnk @  16.7.2009,  19:15 Найти цитируемый пост)
Нужно сначала писать код, а потом уже угадывать в его контурах тот или иной паттерн   

я просто не понимаю, зачем после написания кода угадывать в нем какие-то паттерны. И для чего тогда паттерны вообще?
PM   Вверх
ksnk
Дата 17.7.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(youri @  17.7.2009,  09:11 Найти цитируемый пост)
Вот у тебя в разработке есть такой этап как проектирование?

Вот у меня в разработке есть такой этап как перепроектирование на ходу ;-) если проект живет достаточно долго, для него, imho, в обязательном порядке наступит такой этап. Продуманная изначально архитектура позволит пережить этот этап с допустимыми потерями.

А вообще, раз и навсегда спроектированные приложения, это такая-же абстракция как и чистые, незамутненные паттерны и сферические кони. Они никому не нужны, так как не существуют в природе.

А паттерны нужны для анализа получившегося кода на этапе "доводка напильником после проектирования". Паттерны - достаточно удачные решения в каких-то ситуациях. Их нужно знать Можно "поугадывать контуры" в реальных монстрах и, если это принесет пользу, "откорректировать мутацию"...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
youri
Дата 17.7.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  17.7.2009,  10:57 Найти цитируемый пост)
А вообще, раз и навсегда спроектированные приложения, это такая-же абстракция как и чистые, незамутненные паттерны и сферические кони. Они никому не нужны, так как не существуют в природе.

а где я говорил, про навсегда спроектированные приложения? Ведь придумали же такую штуку как проектирование... навреное не просто так... или ты думаешь, что думать перед тем как что-то делать - абсолютно бессмысленное занятие?
PM   Вверх
icewind
Дата 17.7.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



solenko, спасибо. Пока что бегло просмотрел. Чуть позже прочту полностью.


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


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



youri, Вопрос "проектируете ли вы свое приложение?" напоминает мне "как часто вы бьете свою жену?". Какой ответ предполагается услышать?  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
  Дата 17.7.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



 smile ksnk  smile .
youri,да тут дураку понятно что "без проектирования и мысленного представления как это будет работать далеко не удишь."



--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
fesor
Дата 17.7.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Штука интересная но неимет смысла ее использовать.
PM MAIL WWW   Вверх
youri
Дата 17.7.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  17.7.2009,  13:02 Найти цитируемый пост)
youri, Вопрос "проектируете ли вы свое приложение?" напоминает мне "как часто вы бьете свою жену?". Какой ответ предполагается услышать?   

вроде ж ты ответил уже
просто я тебя понял так, что проектирование - ненужная вещь
PM   Вверх
solenko
Дата 17.7.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



fesor, а обосновать?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
fesor
Дата 17.7.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну например тм рассматривается пример:
В класс системы пользователей передают 2 класа: для работы с БД и управление сессиями. Там же используется такой код: $this->db->execute  к примеру. Это уже задает ограничение на интерфейс класса (ну тобиш названия методов меняться не будут уже. Можно только добавить новых а иначе снова искать и убирать лишнее). Почему бы тогда не воспользоваться чем-то вроде system:: db()->execute() (кстати это довольно похоже на класс-контейнер) или db::execute() вообще...

Ну со своим высказыванием я погорячился, этот паттер много где встречается и в моих проектах, просто я незнал что это типа "фишка" (я конкретно про контейнеры). А так это надо знать чтобы потом повыпендриваться. Всеравно насколько я знаю мало кто придерживается каки-хто святых стандартов и паттернов когда у вас дедлайн через 3 часа)

Это сообщение отредактировал(а) fesor - 17.7.2009, 14:30
PM MAIL WWW   Вверх
ksnk
Дата 17.7.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(youri @  17.7.2009,  13:30 Найти цитируемый пост)
просто я тебя понял так, что проектирование - ненужная вещь 

Ненужная вешь - проектировать "под паттерны". Нужно расписывать задачи, которые предстоит решать и представить себе пути их решения. Потом решение можно откорректиовать, имея ввиду уже наработанный багаж решений, которые зазываются "паттернами".
Впрочем это уже философия и метафизика... Оно все само как-то поолучается  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 17.7.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(fesor @  17.7.2009,  13:29 Найти цитируемый пост)
Там же используется такой код: $this->db->execute  к примеру. Это уже задает ограничение на интерфейс класса (ну тобиш названия методов меняться не будут уже. Можно только добавить новых а иначе снова искать и убирать лишнее).

Оограничения по интерфейсу есть всегда, даже в разговорной речи. Главное чтобы при смене реализации этот интерфейс не менялся.
 
Цитата(fesor @  17.7.2009,  13:29 Найти цитируемый пост)
Почему бы тогда не воспользоваться чем-то вроде system:: db()->execute() (кстати это довольно похоже на класс-контейнер) или db::execute() вообще...

system:: db()->execute() -- вводятся новые зависимости. Теперь ваш класс зависит от некоего system, от db и от того проинициализирован ли класс db в system.
db::execute()  -- кто занимается инициализацией класса db? Каким образом работать с несколькими базами данных?

Добавлено через 6 минут и 35 секунд
Цитата(ksnk @  16.7.2009,  21:47 Найти цитируемый пост)
Чем, скажите мне, этот код не фабрика? "Фабричный класс" имеет четко определенный (пустой) конструктор. Сам конструктор обязан инициализироваться, выковыривая из некоей "регистри" собственные параметры. Чужой дядя, обращается к контейнеру со словами "getMailer" - дай мне почтальона... Причем тут еще какой-то Dependency Injection? Тем что этот код мутациями и издевательствами из него трансформировали?


Dependency Injection в данном случае -- установка класса транспорта.

Не все то, что пораждает объекты, зовется фабрикой. Суть фабрики в том, чтобы прозрачно для клиента решить какой из подттипов объета вернуть. Фабрика не работает с любыми типами объектов. То что вы приводили в темах о подключении модулей к фабрике имеет слабое отношение.

Суть контейнера в том, чтобы:
1. Создать все объекты-зависимости
2. Создать сам запрашиваемый объект
3. Выполнить инициализацию объекта, передав все зависимости и начальные настройки.

Фабрика из всего этого выполняет лишь второй пунт.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
youri
Дата 17.7.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  17.7.2009,  14:51 Найти цитируемый пост)
Ненужная вешь - проектировать "под паттерны"

Цитата(ksnk @  16.7.2009,  19:15 Найти цитируемый пост)
Нужно сначала писать код, а потом уже угадывать в его контурах тот или иной паттерн

т.е., обдумывая пути решения задачи, мы должны отбросить пути решения с помощью паттернов (даже если знаем, что их надо будет потом использовать). Это меня, собственно, и смущает. Это твоя позиция?
PM   Вверх
ksnk
Дата 17.7.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(solenko @  17.7.2009,  15:27 Найти цитируемый пост)
1. Создать все объекты-зависимости

Тутошний контейнер не создает, а знает как создавать. Разница, в некоторых случаях значительная...
Цитата(solenko @  17.7.2009,  15:27 Найти цитируемый пост)
3. Выполнить инициализацию объекта, передав все зависимости и начальные настройки.

В каком месте в отквоченном мной коде производится инициализация объекта? инииализацией объекта занят сам объект... 

Ну вот, нужно начинать с определений smile Что есть фабрика, что есть регистри, а что есть Dependency Injection и его контейнер? Желательно просто и понятно, как Аристотелево определение человека...

Следует иметь ввиду, что "паттерны программирования", а не "паттерны ООП программирования". То есть в определении слово "класс" и "объект" должно иметь значение "черный ящик", с определенным списком свойств.

К примеру:
Регистри - ящик, имеющий 2 функции. 
-- по имени (возможно строковому, но не обязательно) и значению сохраняет где-то в себе эту пару,  
-- по имени может выдать сохраненное значение.
Примерная дисциплина использования - любой объект может чего-то сохранить, любой объект может чего-то запросить...

Фабрика - это регистри, отягченная ограничениями.
-- не все имеют право (кроме специально обученных объектов-конфигурации) изменять соответствие имя-значение.

Фабрика объектов - выдаваемое фабрикой значение - объекты с унифицированным ( с одинаковым смыслом и порядком параметров) конструктором.


Это сообщение отредактировал(а) ksnk - 17.7.2009, 17:15


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 17.7.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ksnk @  17.7.2009,  16:14 Найти цитируемый пост)
В каком месте в отквоченном мной коде производится инициализация объекта? инииализацией объекта занят сам объект... 

вот в этой:
Цитата(ksnk @  16.7.2009,  21:47 Найти цитируемый пост)

Код

$mailer->setDefaultTransport($this->getMailTransport());


Сам объект не запрашивает какой ему пранспорт использовать.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 17.7.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(solenko @  17.7.2009,  17:20 Найти цитируемый пост)
вот в этой:

Это я упустил ;-(

Однако так получается, что у нас знания о классе - мейлере размазаны по большому количеству кода. если вообразить, что нам понадобился класс, реализованный вообще без параметров (на встроенном mail'е) нам придется править конфиг $container = new Container ... (ну это уж необходимо)
и придется править метод getMailTransport в описателе некоего контейнера неизвестно где описанного... 

Это я про то, что если проявить должную дисциплину при создании обертки, получившийся фабричный элемент был бы более Тру-ООпным. Править пришлось бы только в одном месте, в конфигурации...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 17.7.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ksnk @  17.7.2009,  17:13 Найти цитируемый пост)
Однако так получается, что у нас знания о классе - мейлере размазаны по большому количеству кода.

Знания о нем сосредоточены в одном месте -- контейнере. А в идеале -- файле-конфигурации контейнера. Собственно, в этом и смысл контейнера.

Цитата(ksnk @  17.7.2009,  17:13 Найти цитируемый пост)
сли вообразить, что нам понадобился класс, реализованный вообще без параметров (на встроенном mail'е) нам придется править конфиг $container = new Container ... (ну это уж необходимо)и придется править метод getMailTransport в описателе некоего контейнера неизвестно где описанного... 


Вообще-то достаточно удалить вызов $mailer->setDefaultTransport(). При использовании Symfony Service Container -- удалить одну строку его конфига.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
fesor
Дата 18.7.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

system:: db()->execute() -- вводятся новые зависимости. 

Ну допустим класс system является главным в системе и в него все загружается (как в контейнер). Допустим где-то понадобилось вызвать базу данных. Сделав доступ к функции db() класса system мы смотрим, загружен ли класс для работы с БД и если нет - загружаем. Ну и отдаем его. Мне такая реализации кажется достаточно простой и не напряжной в плане расширения.
PM MAIL WWW   Вверх
solenko
Дата 18.7.2009, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(fesor @  17.7.2009,  23:11 Найти цитируемый пост)
Ну допустим класс system является главным в системе

В какой системе? В той, которую вы пишите именно сейчас? А как испоьзовать ваши классы, расчитанные на system Sanchezzz-у, который любит называть свой мегакласс, содержащий все, 
Core? Прелесть внедрения зависимостей как раз в том, что класс не знает с каким именно классом он работает -- важен интерфейс. И прелесть контейнера в том, что класс не знает о его существовании -- нет зависимости от контейнера.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
fesor
Дата 18.7.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну ладно... тогда стоит рассмотреть этот вариант.
PM MAIL WWW   Вверх
Sanchezzz
  Дата 20.7.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



solenko мои классы и работаю и отдельно вне зависимости от моего мега-класса которого я люблю называть "core", бери и подключай.

Мой "core" не случайно называется так, при разработки велосипеда мои задачи были такие:
Нужно было сделать класс который будет подрубать классы и раздавать что первое и получилось.
Затем нужно было создать в ядре функцию которая будет отвечать за подключение зависимых классов, такие классы служат в роли компонентов которые отвечают за контент: новости, блоги, форумы итд.
Также эти компоненты получают доступ к функциям ядра и способность использовать подрубленные классы или подключать их.
Минус в них то они имеют обязательных 2 функции одна из ник подключение шаблона логики для вывода информации и функция вызова, которая  готовит данные для шаблона логики. 

Так выглядит у меня зависимый класс
Код

class news {
 function includeTemplate($name){
  // ... include
 }

 function create($parms = array()){
   /* способ 1*/
   $this->core->initModel('block'); // возращяет также класс      
   $block = new $this->core->class['block']; //Копия блоков это контейнеры информации
   $block->db = this->core->db; // обоьект БД

   /* способ 2*/
   $block  = $this->core->initModel('block');
   $block->db = this->core->db; // обоьект БД

   $arrData = $block->getElementByBlockID($parms['ID']);
   /* подключение вывода */
   $this->includeTemplate($parms['tmp1']);

 }
}


Сча я стараюсь доделать это дело до совершенства сделать как можно меньше зависимости.



Это сообщение отредактировал(а) Sanchezzz - 20.7.2009, 08:06


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
fesor
Дата 20.7.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



код очень похож на мой первый фреймворк)
PM MAIL WWW   Вверх
Sanchezzz
  Дата 20.7.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



ну это не фреймворк это кусок компонента. (зависимый класс от ядра ((( так для наглядности )
Цитата

код очень похож на мой первый фреймворк)

и что стало с твоим первым фреймворком полетел в топку? или дышит до сих пор?

Это сообщение отредактировал(а) Sanchezzz - 20.7.2009, 09:18


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
fesor
Дата 20.7.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну я понял.

Мой фреймворк? Ну я сделал на нем пару проектов и еще надо наверное будет сделать штуки 3... но наверное я его буду переписывать с нуля и попробую написать с его помощью небольшую CMS (мол Joomla c ТРУ MVC+ActiveRecord, блэкджеком и... девушками...)

для нее например контроллер будет выглядеть примерно так:
Код

class PostController extends Controller
{
    public function actionShow()
    {
         $criterias = array(
              array('post_id', $GET['id']),
              array('published', true),
         );
         $post = Post::model()->with('comments', 'profiles')->find($criterias);
         view::render('fullview', $post);
    }
}


Но я еще неуверен что это самый красивый вариант, а ничего красивее не придумалось(

Это сообщение отредактировал(а) fesor - 20.7.2009, 09:32
PM MAIL WWW   Вверх
solenko
Дата 20.7.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Sanchezzz @  20.7.2009,  07:04 Найти цитируемый пост)
solenko мои классы и работаю и отдельно вне зависимости от моего мега-класса которого я люблю называть "core", бери и подключай.

Да, передавая ссылку на Core во все классы, вы используете паттерн внедрения зависимости и не зависите от имени класса )
Вот только вы вводите зависимость от core + всех классов, от которых данный компонент действительно зависит. И просто "бери и подключай" не получится, т.к. класс c интерфейсом Core таки необходим.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sanchezzz
  Дата 20.7.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



прочитай внимательнее я написал что у меня 2 типа классов которые не зависят от ядра и есть зависимые которые ваше подключаются через другую функцию и зачем мне подрубать компоненты независимо от ядра если они под мою систему заточены? на то они и кмпоненты.
Цитата

И просто "бери и подключай" не получится, т.к. класс c интерфейсом Core таки необходим.
.
со вторым типом классов да не получится и мне это не так сильно важно.
а с первым все работает на ура.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
IZ@TOP
Дата 14.8.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Мега тема! Особенно про "мега класс, который Сначез любит называть Core" - валялся) И про девушек с блэкджеком - супер)
А вообще, автору респект. Интересные моменты уловил, для себя заметки сделал.

P.S. А вы знаете чем больше всего полезны паттерны? Мы их все знаем и при необходимости изучения/дополнения чужого гоvнокода своим, вполне сможем его понять и с ним работать  smile  smile 


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

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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