|
|
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
svenomТо есть с момента публикации статьи понятия Inversion of Control, Dependency Injection и Service Locator как-то принципиально изменились? При чем здесь вообще это? Я твои скажем прямо, не совсем авторитетные статьи прочитал, а вот ты даже не удосужился взглянуть на мою ссылку, ибо если бы удосужился, может бы наконец осознал, что ты говоришь глупость, точнее не глупость, а не совсем правду. Сначала пара логических утверждений: DI это IoC = true Если мы говорим про DI, следовательно мы говорим про IoC = true Это ты сам себя в чем то убедил видимо, ну да ладно:) А теперь по поводу вашей фразы, выделенной жирным - к сожалению, она бессмысленна. Поясните вот эти моменты: 1) Что такое "обычный ход выполнения программы"? Значит есть "необычный"? Как их отличить друг от друга и в чем заключаются их характерные черты? 2) Что значит "отдается на откуп фреймворкам"? Вот я попросил Spring заинжектить мне бин? Это "откуп"? А вот я попросил Хибер вытащить мне инфу из БД. Это "откуп"? Еще раз, максимально сжато: IoC - это способ снижения связанности классов путем делегирования процесса установления зависимсотей между объектами от самих объектов к некому стороннему компоненту. Я не знаю, как это можно еще проще объяснить Ок, я программист а не писатель и иногда свои мысли доношу не совсем правильно, но постараюсь обьяснить на пальцах. Сам термин Inversion of Control - неужели не наводит тебя на мысль, что IoC - это способ снижения связанности классов путем делегирования процесса установления зависимсотей между объектами от самих объектов к некому стороннему компоненту - ну скажем так слишком упрощенное определение? Если бы IoC включал только это , то его было бы логичнее назвать Inversion of Instantiation или еще как-либо в этом духе. Итак, что же такое "обычный ход выполнения программы" - это неудачный перевод термина flow of control of programm. Под этим термином подразумевается процедурный ход выполнения программы, для примера(который кстати у Фаулера), Код: ruby 1. 2. 3. 4. 5. 6. В этом случае твой код всегда находится под твоим контролем, ты решаешь когда задать вопрос, как на него отреагировать, когда завершить программу. Inversion of control происходит когда ты пробуешь перенести свою программу на оконный интерфейс, ты создаешь методы по обработке ввода пользователя, создаешь контролы и биндишь методы на события, тебя больше ничего не волнует. Ты "отдаешься на откуп" оконной системе, именно она будет гонять вечный цикл в ожидании ввода пользователя, диспетчиризации событий и т.п., твой же код будет вызван только тогда когда это будет необходимо, и будет делать только то, что ты указал - таким образом flow of control переходит от тебя к оконной системе(в данном контексте ее можно назвать фреймворком). Все это называется так называемым Принципом Голливуда - не звони нам, мы сами тебе позвоним. Таким образом контроль выполнения инвертирован - не ты вызываешь оконную систему, а она вызывает твои методы, когда нужно, всю работу с инфраструктурой оконная система берет на себя. IoC - это главное отличие библиотек от фреймворков(хотя термин фреймворк тоже достаточно расплывчат), библиотека функций - это набор классов и методов, которые ты непосредственно вызываешь, они делают полезные вещи, а потом возвращают контроль тебе. В отличие от них фреймворки обладают некоторой дополнительной функциональностью и имеют некий абстрактный дизайн, его ты можешь только сконфигурировать, и обьяснить когда и в какие моменты времени фреймворк должен вызвать твой код, это и есть IoC. Великолепным примером IoC являются EJB2, когда ты создаешь сессионный EJB бин, то ты определяешь методы ejbPassivate() и т.д.. но ты не вызываешь их напрямую, они будут вызваны тогда, когда нужно, тебе не нужно заботиться об этом - опять тот же Принцип Голливуда. Классическим примером IoC кстати является паттерн Template Method, как ни странно. Не волнуйся, ты не первый кто неправильно трактует этот термин, он очень размыт, но первоначальное его определение было именно таким. Что касается - автор2) Что значит "отдается на откуп фреймворкам"? Вот я попросил Spring заинжектить мне бин? Это "откуп"? А вот я попросил Хибер вытащить мне инфу из БД. Это "откуп"? Таким образом, когда Spring инжектит бин - это IoC, когда хибер достает данные из базы - это скорее вызов библиотеки, хотя граница тут очень размыта. Более того, ServiceLocator исходя из этого, вовсе никакое не IoC, а вот Dependency Injection - да. В общем DI - это всего лишь подмножество IoC, о чем я тебе и пытаюсь обьяснить. Таким образом декларативные транзакции и управлением скоупами жизни бина - это как раз и есть IoC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 02:20:20 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Есть у тебя компонент, который должен взаимодействовать с другими. Как ему их найти? Компоненту приходилось самому их искать "контейнер дай мне". Но для того чтобы это сделать у компонента должна быть ссылка на контейнер, а это лишняя зависимость. Появились IoC Container-ы, которые "по тихому" делают инекцию в компонент нужных ресурсов. И ты "магическим образом" получаешь полностью готовый компонент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 02:22:16 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Видеотуториал по Спрингу (и ИоК в частности): http://www.youtube.com/user/ytkach#p/c/B0276A0A62BDEF06 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 03:41:17 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
забыл ник , По поводу вышей поправки, что IoC это более широкое понятие - согласен. И Template туда пролезет, по сути любой колбак есть IoC. забыл никБолее того, ServiceLocator исходя из этого, вовсе никакое не IoC, а вот Dependency Injection - да. http://en.wikipedia.org/wiki/Inversion_of_control - поиск по словам Service Locator http://msdn.microsoft.com/en-us/library/ff648478.aspx - поиск по словам Service Locator http://martinfowler.com/articles/injection.html#UsingAServiceLocator забыл никВ общем DI - это всего лишь подмножество IoC, о чем я тебе и пытаюсь обьяснить.Так я же уже раза 3 об этом сказал забыл никТаким образом декларативные транзакции и управлением скоупами жизни бина - это как раз и есть IoC.Ваша правда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 09:21:45 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Я в java пока почти полный ноль, но попробую ответить на вопрос ТС "Какие приемущества использования IoC контейнера? " так как я это понял для себя, в первом приближении. У нас есть интерфейс: Код: java 1. 2. 3. И есть несколько классов реализующих его: Код: java 1. 2. 3. 4. 5. Код: java 1. 2. 3. 4. 5. Код: java 1. 2. 3. 4. 5. А это наш "главный" класс который выполняет "полезную" работу. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Так вот ему совершенно похер, каким конкретно перевозчиком будет отправлен груз, он знать о нем ничего не знает кроме того что он может его доставить. И вот тут IoC контейнер по сути делает всю работу за нас, включая создание конкретного экземпляра перевозчика, мы просто указываем в конфигурационном файле какого перевозчика сейчас использовать. А если нам захотелось изменить перевозчика то достаточно внести изменения в конфигурационный файл и не надо компилировать приложение. Как то так. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 13:27:33 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Pavel KurakinТак вот ему совершенно похер, каким конкретно перевозчиком будет отправлен груз, он знать о нем ничего не знает кроме того что он может его доставить. И вот тут IoC контейнер по сути делает всю работу за нас, включая создание конкретного экземпляра перевозчика, мы просто указываем в конфигурационном файле какого перевозчика сейчас использовать. А если нам захотелось изменить перевозчика то достаточно внести изменения в конфигурационный файл и не надо компилировать приложение. Как то так. :) Это вы сейчас сказали часть от паттерна Factory, часть от полиморфизма, и часть от Hot Swap. Как-то так:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 13:53:30 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
kiR@chЭто вы сейчас сказали часть от паттерна Factory, часть от полиморфизма, и часть от Hot Swap. Как-то так:)Я бы сказал - это паттерн Visitor в чистом виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:08:11 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Ну дела. Тут нет паттерна Factory - где метод newInstance()? Тут нет паттерна Visitor - где классического вызова visitor.visit(this)?. Тут нет никакого Hot Swap. Что это вообще такое? Если меняется xml с определением бинов, то да, проект не надо перекомпилировать, но его все равно надо пересобирать и передеплоивать. Тут есть только полиморфизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:15:10 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
svenom, Есть такое понятие, называется "ирония":) Вообще, тяжело жить без чувства юмора, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:16:31 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Visitorом тут не пахнет. Как и Hot swap. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:17:50 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Кто позвал зануд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:20:48 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Factory кстати есть - только это скрыто от наших глаз:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:21:05 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Если ты не видел мы занудим тут уже не первый день:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:21:32 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
забыл ник, Видел, видел:) Всё это мне напоминает уроки литературы в школе. "А что хотел сказать автор своим произведением?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:25:26 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
забыл никFactory кстати есть - только это скрыто от наших глаз:) Неправда. Не все Сreational Pattern'ы это фабрика. Контейнер спринга нельзя подогнать под конкретный паттерн. В нем присутствует функционал: Синглтона - http://en.wikipedia.org/wiki/Singleton_pattern Прототипа - http://en.wikipedia.org/wiki/Prototype_pattern Ожбэкт пула - http://en.wikipedia.org/wiki/Object_pool_pattern ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:27:35 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
А вот фабрики в нем как раз таки нет вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:28:00 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
svenom, чтобы стать синглтоном - объект то должен кто-то создать? То же самое с пулом. Прототип тоже не подходит в этом случае. А вот newInstance() и привидение к интерфейсу, где-то внутри спринга как раз есть) Хотя этот спор бессмысленен, потому что он бестолковый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:33:59 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
svenomТут нет паттерна Visitor - где классического вызова visitor.visit(this)?. visit(this) вот: Код: java 1. 2. 3. 4. 5. 6. Вызова visitor.visit(this), действительно, нет. Эта функция возложена на клиентский класс. . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:35:19 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
Не, это всего лишь делегирование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:37:38 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
XEugenevisit(this) вот: Код: java 1. 2. 3. 4. 5. 6. то есть в параметре не this конечно. Но очень близко к идее Visitor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:39:06 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
забыл никsvenom, чтобы стать синглтоном - объект то должен кто-то создать?Верно, но я повторю вам - creational pattern'ов много: Builder Factory Method Abstract Factory Singleton Multiton Object Pool и т.д. Они все создают объекты. Но это же не значит, что они все фабрики? забыл никТо же самое с пулом.Вы знаете в чем object pool заключается? Инстацировать объекты, положить их куда-то, а потом выдавать пользователю. Это именно то, что делает спринг при развертывании контекста. Все синглтоны инстанцируются и прикрепляются к контексту. забыл никПрототип тоже не подходит в этом случае. Прототип относится только к тем бинам, у которых указано scrope="prototype". Они инстанцируются заново при каждом вызове context.getBean(). Прототипом в этом случае выступает xml-описание бина: какие объекты куда подставить. забыл никА вот newInstance() и привидение к интерфейсу, где-то внутри спринга как раз есть)В классическом Factory Method newInstance() не имеет параметров, всегда выдает новый объект, и выдает инстанс объекта строго определенного типа. Наверняка в спринге есть что-то типа newInstance(Class class), но только это не делает его фабрикой в классическом понимании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:43:29 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
XEugeneВызова visitor.visit(this), действительно, нет. Эта функция возложена на клиентский класс. . Это вы уже сами придумали. XEugeneто есть в параметре не this конечно. Но очень близко к идее Visitor. Вообще ни разу не близко. В паттерне Visitor именно visit(this) и является ключевой его частью. А тут идет просто вызов какого-то метода какого-то объекта без параметров. А следовательно объект, чей метод вызывают не может быть визитором по определению, так как он не знает, кого "визитить" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:47:15 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
А кто говорил про классическую фабрику? Ты опять что-то придумал. Я ж не спорю что ты знаешь много creational patternов, я их тоже знаю - и когда и зачем использовать. Если быть точным, то спринг использует что-то вроде фабрики в сочетании с object pool, но опять же спор ни о чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 14:48:57 |
|
||
|
Какие приемущества использования IoC контейнера?
|
|||
|---|---|---|---|
|
#18+
svenomВообще ни разу не близко. В паттерне Visitor именно visit(this) и является ключевой его частью. А тут идет просто вызов какого-то метода какого-то объекта без параметров. А следовательно объект, чей метод вызывают не может быть визитором по определению, так как он не знает, кого "визитить" Он "визитит" конкретную реализацию интерфейса ПЕРЕВОЗЧИК, которую клиентский код передал в setBailee и вызывает у него метод ДОСТАВИТЬ(). Заявление, что это "Visitor в чистом виде", было немного провокационным с моей стороны, но это тот случай, когда используют Visitor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2011, 15:08:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37565379&tid=2132896]: |
0ms |
get settings: |
13ms |
get forum list: |
27ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
389ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
91ms |
get tp. blocked users: |
3ms |
| others: | 369ms |
| total: | 923ms |

| 0 / 0 |
