Комментарии 31
Ну в редакторе же есть тэг, code. А за перевод, спасибо!
+1
highlight.hohli.com/ — вот здесь например, поставьте галочку для Хабрахабра и смело вставляйте то, что он сгенерит
+1
спасибо
0
Эти велосипеды ломают подсветку в кастомных темах, например. А всего навсего надо было использовать тег
P.S. сорри за АП, статью привели как пример поломанной подсветки.
<source>
require_once('phemto/phemto.php');
$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;
P.S. сорри за АП, статью привели как пример поломанной подсветки.
+1
Хорошая статья, спасибо!
0
Минус. Причем самому паттерну.
Потому-что в процессе работы люди используют автозавершение по типам.
Именно поэтому в итоге на C# удобнее работать, нежели на нативном PHP.
Это я со временем понял и теперь на PHP все время использую только какой-нить Ecplise с завершением по типам.
Так что данный паттерн считаю верхом абстракционизма, но уже того абстракционизма, который делается только ради абстракционизма.
Либо автор неудачные примеры привел.
Потому-что в процессе работы люди используют автозавершение по типам.
Именно поэтому в итоге на C# удобнее работать, нежели на нативном PHP.
Это я со временем понял и теперь на PHP все время использую только какой-нить Ecplise с завершением по типам.
Так что данный паттерн считаю верхом абстракционизма, но уже того абстракционизма, который делается только ради абстракционизма.
Либо автор неудачные примеры привел.
-1
Пожалуйста ответьте более развернуто.
Что такое завершение по типам, и как оно решает ту задачу, что описана в этой статье?
Как именно помогает Eclipse справиться с зависимостями между классами?
Что такое завершение по типам, и как оно решает ту задачу, что описана в этой статье?
Как именно помогает Eclipse справиться с зависимостями между классами?
0
1. Завершение — это когда мы к примеру в сишарпе создаем объект:
Human petya = new Human();
// Потом пишем
petya.
// и нажимаем Ctrl + Space
// IDE выдает нам все методы и свойства класса Human
Аналогично в eclipse и прочих IDE.
2. Eclipse никак не помогает справится с зависимостями.
Я вообще не увидел здесь никакой проблемы.
Пожалуйста проблему почетче опишите.
Human petya = new Human();
// Потом пишем
petya.
// и нажимаем Ctrl + Space
// IDE выдает нам все методы и свойства класса Human
Аналогично в eclipse и прочих IDE.
2. Eclipse никак не помогает справится с зависимостями.
Я вообще не увидел здесь никакой проблемы.
Пожалуйста проблему почетче опишите.
-1
Посмотрите пожалуйста примеры использования во второй части статьи, особенно вот этот:
— Пусть мы хотим написать реализацию Authentication на основе интерфейса фреймворка…
Наш компонент будет использовать общее с фреймворком подключение к БД, и еще мы хотим взять кэширующий компонент третьей стороны.
— на мой взгляд это потенциально трудное место весьма элегантно программируется с помощью этого паттерна.
я, в свою очередь, совсем не понял к чему тут автозавершение, которое дает IDE? Где паттерн мешает работе с методами и интерфейсами?
— Пусть мы хотим написать реализацию Authentication на основе интерфейса фреймворка…
Наш компонент будет использовать общее с фреймворком подключение к БД, и еще мы хотим взять кэширующий компонент третьей стороны.
— на мой взгляд это потенциально трудное место весьма элегантно программируется с помощью этого паттерна.
я, в свою очередь, совсем не понял к чему тут автозавершение, которое дает IDE? Где паттерн мешает работе с методами и интерфейсами?
0
= По завершению =
$controller = $injector->create('MyController');
В ПХП это позволительно. Но потом каким образом указать IDE, что тип $controller — MyController?
Обычно это указывается в самом методе create, как @return {MyController}.
В СиШарпах и проч. можно сделать так:
MyController controller = ((MyController)injector->create('MyController'));
И далее работать с объектом.
В Eclipse по-мойму можно сделтаь так:
/**
* @type {MyController}
*/
$controller = $injector->create('MyController');
Но это опять же гемор, только сбоку.
Вторую часть читаю.
$controller = $injector->create('MyController');
В ПХП это позволительно. Но потом каким образом указать IDE, что тип $controller — MyController?
Обычно это указывается в самом методе create, как @return {MyController}.
В СиШарпах и проч. можно сделать так:
MyController controller = ((MyController)injector->create('MyController'));
И далее работать с объектом.
В Eclipse по-мойму можно сделтаь так:
/**
* @type {MyController}
*/
$controller = $injector->create('MyController');
Но это опять же гемор, только сбоку.
Вторую часть читаю.
+1
Про IDE понял. Мда. Но с другой стороны это получается ради IDE корячиться с кодом. Ну блин, а как же с полиморфизмом, т.е. возвращает тебе фабрика разные типы объектов с одинаковым интерфейсом? Ну наверное для жавы и сишарп IDE умеет это отследить… угу. Для PHP такого пока нет.
Хорошо, что я на это не подсел, хихик, хотя признаю, что удобно.
Хорошо, что я на это не подсел, хихик, хотя признаю, что удобно.
0
:) Для ПХП такое тоже по-мойму возможно:
/**
* @type {MyController}
*/
$controller = $injector->create('MyController');
С кодом не надо корячиться — надо сначала моделировать, а потом его генерить.
Всё.
Зато потом, когда проект начинает быть «пипец» каким большим, то весьма это помогает.
Исптытайте, тык скыть эффект масштаба.
А подсесть на это Вам придется со временем.
Напр., когда выйдет нормальная IDE, в которой это всё есть сразу, а не надо корячиться и собирать её.
/**
* @type {MyController}
*/
$controller = $injector->create('MyController');
С кодом не надо корячиться — надо сначала моделировать, а потом его генерить.
Всё.
Зато потом, когда проект начинает быть «пипец» каким большим, то весьма это помогает.
Исптытайте, тык скыть эффект масштаба.
А подсесть на это Вам придется со временем.
Напр., когда выйдет нормальная IDE, в которой это всё есть сразу, а не надо корячиться и собирать её.
0
>С кодом не надо корячиться — надо сначала моделировать, а потом его генерить.
оно конечно здорово, но код живет и развивается, все заранее не спроектируешь. Если бы так было, как Вы говорите, то рефакторинг нужен бы не был.
оно конечно здорово, но код живет и развивается, все заранее не спроектируешь. Если бы так было, как Вы говорите, то рефакторинг нужен бы не был.
+1
отвечает пользователь Eclipse(plug. PHPE)
@return datatype description
@return datatype description
0
Неа, не получится.
Из того метода мы не знаем заранее, что вылезет.
Так что именно так для нормальных методов делают.
А здесь — ненормальный :)
Из того метода мы не знаем заранее, что вылезет.
Так что именно так для нормальных методов делают.
А здесь — ненормальный :)
0
код все-таки первичен ИМХО.
0
:) первична задача, которая оплачивается заказчиком.
А код — это всего лишь «один из».
И вообще по мне первичен не код, а его качество.
Это как бэ смещение акцентов:
«Деньги — не главное. Главное их количиство».
Так что работайте в этом направлении ещё усиленней. Либо набирайтесь опыта. Кароче это как бэ дзен. Оно пришло ко мне с неба :)
А код — это всего лишь «один из».
И вообще по мне первичен не код, а его качество.
Это как бэ смещение акцентов:
«Деньги — не главное. Главное их количиство».
Так что работайте в этом направлении ещё усиленней. Либо набирайтесь опыта. Кароче это как бэ дзен. Оно пришло ко мне с неба :)
0
вторая часть тут:
habrahabr.ru/blogs/php/64078/
habrahabr.ru/blogs/php/64078/
0
Ничто не мешает сделать сервисный класс, знающий и отдающий нужные типы, а внутри использующий SC, IOC.
0
Как бэ вернулись к тому же, отчего якобы уходим?
Вообще этот подход уже начинает больше склоняться к аспект-ориентированному подходу, нежели, к объектно-ориентированному.
Причем я всё еще не улавливаю сути его?
Это типа для тех иррационалов, которые сначала делают, а потом думают???
Цель!!! Для каждого движения нужна цель.
Здесь я понимаю цель такая, чтобы вначале делать, а потом думать.
Вообще этот подход уже начинает больше склоняться к аспект-ориентированному подходу, нежели, к объектно-ориентированному.
Причем я всё еще не улавливаю сути его?
Это типа для тех иррационалов, которые сначала делают, а потом думают???
Цель!!! Для каждого движения нужна цель.
Здесь я понимаю цель такая, чтобы вначале делать, а потом думать.
0
Только сейчас наткнулся на статью, так что откомменчу через 1.5 года только :-)
1. Для .net точно так же есть ninject/castle windsor.
2. Представьте себе задачу: у вас есть приложение, которое по каким-то событиям отправляет почту.
Очевидно, что во время отладки/разработки по настоящим живым адресам рассылать ничего не надо.
Как я решил такую проблему с ninject: в зависимости от окружения (dev/stage/prod) у меня инжектятся разные классы для уведомлений: SmtpTransport или FileTransport.
Таким образом единственное место, которое мне пришлось изменить для решения — это код, конфигурирующий контейнер.
Каким будет ваше решение?
1. Для .net точно так же есть ninject/castle windsor.
2. Представьте себе задачу: у вас есть приложение, которое по каким-то событиям отправляет почту.
Очевидно, что во время отладки/разработки по настоящим живым адресам рассылать ничего не надо.
Как я решил такую проблему с ninject: в зависимости от окружения (dev/stage/prod) у меня инжектятся разные классы для уведомлений: SmtpTransport или FileTransport.
Таким образом единственное место, которое мне пришлось изменить для решения — это код, конфигурирующий контейнер.
Каким будет ваше решение?
0
Вот кстати ещё две неплохие статьи на эту тематику
0
wiki.agiledev.ru/doku.php?id=ooad:dependency_injection
wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code
Что-то с хабром у меня сегодня не лады :(
wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code
Что-то с хабром у меня сегодня не лады :(
+2
Ага, я знаю, хорошие статьи.
Однако есть существенный недостаток, он же причина, по которой я полез переводить именно эту статью — они сложны. Они академически охватывают типы инъекций, разновидности и т.п. А для использования паттерна надо схватить суть. Почувствовать, что да-дада, вот так работает, вот так круто! А для этого пример должен быть прямолинеен, как вертикаль власти и тупой, как пробка.
Потом можно уже дополнительное почитать.
Вот это я тут как раз и увидел. Возможно малость язык у меня тяжеловат, но я старался: по-английски многим лень чиатать, да и саму статью еще вытащить надо из архива.
Вот еще одна презентация, которая обладает таким свойством, но опять же на англ.:
Презентация Джеффа Мура на PHP-tek, 2007
Однако есть существенный недостаток, он же причина, по которой я полез переводить именно эту статью — они сложны. Они академически охватывают типы инъекций, разновидности и т.п. А для использования паттерна надо схватить суть. Почувствовать, что да-дада, вот так работает, вот так круто! А для этого пример должен быть прямолинеен, как вертикаль власти и тупой, как пробка.
Потом можно уже дополнительное почитать.
Вот это я тут как раз и увидел. Возможно малость язык у меня тяжеловат, но я старался: по-английски многим лень чиатать, да и саму статью еще вытащить надо из архива.
Вот еще одна презентация, которая обладает таким свойством, но опять же на англ.:
Презентация Джеффа Мура на PHP-tek, 2007
+1
>Ссылку на оригинал дать не могу, оригинал внутри дистрибутива :)
Вспомнил как то __autoload вынесли в класс потом хотели его загрузить ))
Вспомнил как то __autoload вынесли в класс потом хотели его загрузить ))
0
Если честно, особой пользы для себя не увидел. Хотя не удивлюсь, если просто не сталкивался с подобной необходимостью или просто использовал другой подход.
0
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Phemto и Паттерн Dependency Injection. Часть 1