Зависимость от инъекций?

Есть ли обратная сторона? Сейчас я чувствую себя почти зависимым от этого. Всякий раз, когда проект достигает определенного размера, вы почти чувствуете аллергическую реакцию на стандартные шаблоны и немедленно подключаете его к фреймворку Dependency Injection.

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

Кроме того, я бы чувствовал себя намного лучше, если бы это было частью языка, который я использовал. Хотя, по крайней мере, для Java, есть пара очень легких библиотек, которые вполне хороши.

Мысли? Плохой опыт? Или просто перестань об этом беспокоиться?


[РЕДАКТИРОВАТЬ] Re: Описание самого внедрения зависимостей

Извините за расплывчатость. Мартин Фаулер, вероятно, описывает это НАМНОГО лучше, чем я когда-либо мог ... не нужно тратить силы.

По совпадению, это подтверждает одну точку зрения о том, что это все еще не широко практикуется и может стать препятствием при работе с командами, если все не в курсе.

Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Лучшие практики использования Guice в ваших Java-проектах
Лучшие практики использования Guice в ваших Java-проектах
Guice от Google - это популярная система инъекции зависимостей для Java-приложений. Он помогает разработчикам создавать более ремонтопригодный,...
12
0
1 630
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Единственный недостаток, о котором я могу думать, - это крошечное снижение производительности из-за постоянных виртуальных вызовов :)

Не могли бы вы добавить пару ссылок, чтобы объяснить, что на самом деле представляет собой внедрение зависимостей, для тех из нас, кто играет дома? статья в Википедии развлекательный, но не очень поучительный.

@Finglas, так и должно было быть, но этот ответ был оставлен до того, как были добавлены комментарии.

Blorgbeard 13.02.2011 17:07
Ответ принят как подходящий

Я попытался описать некоторые из возможных недостатков в сообщении в блоге здесь: http://kevin-berridge.blogspot.com/2008/06/ioc-and-di-complexity.html

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

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

Я большой сторонник ввода-вывода, однако я видел несколько проектов с огромными файлами конфигурации xml, которые никто не понимал. Так что остерегайтесь программирования в xml.

Внедрение зависимостей через XML - величайшее зло, нанесенное Java-программистам, по крайней мере, для меня. Это затрудняет отладку, понимание, поддержку и, как правило, делает код очень уродливым.

nflacco 29.01.2013 00:15

@Blorgbeard: http://www.martinfowler.com/articles/injection.html, наверное, одна из лучших статей на эту тему

Просто перестань об этом беспокоиться. Я считаю, что со временем методы IoC станут второй натурой для большинства разработчиков. Я пытаюсь научить разработчиков здесь, на работе, и мне трудно донести мысль, потому что это кажется неестественным по сравнению с тем, как мы всегда делали что-то ... что, как оказалось, было неправильным путем. Кроме того, разработчикам, как новичкам в IoC, так и новичкам в проектах, которые я считаю, еще труднее. Они привыкли использовать IDE для отслеживания зависимостей, чтобы понять, как все это «скреплено». Эта информация часто записывается в загадочный XML.

Also, I'd feel much better if it were a part of the language I was using.

К вашему сведению, в составе JDK 6 есть очень простая и функциональная инъекция зависимостей. Если вам нужна легкая и понятная инъекция зависимостей, используйте ее.

Используя класс ServiceLoader, вы можете запросить сервис (или множество его реализаций) на основе класса:

 package dependecyinjection;  
 import java.util.ServiceLoader;  

 public abstract class FooService {  

     public static FooService getService() {  
         ServiceLoader<FooService> loader = ServiceLoader.load(FooService.class);  

         for (FooService service : loader) {  
             return provider;  
         }  

         throw new Exception ("No service");  
     }  

     public abstract int fooOperation();  

 }  

 package dependecyinjection;  
 public class FooImpl extends FooService {  
     @Override  
     public int fooOperation() {  
         return 2;  
     }  
 }  

Как ServiceLoader определяет возвращаемые реализации служб?

В папке вашего проекта создайте папку с именем МЕТА-ИНФ / услуги и создайте файл с именем dependencyinjection.FooService. Этот файл содержит строку, указывающую на реализацию службы. В этом случае: dependencecyinjection.FooImpl

Пока об этом мало что известно.

Разве этот паттерн не называется «локатором сервисов», а не «внедрением зависимостей»? См. martinfowler.com/articles/injection.html для описания обоих.

Wim Coenen 29.04.2009 05:49

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

mathieu 31.07.2012 13:55

Проблема с DI - та же проблема, что и с COM, и с любым кодом, который выглядит примерно так:

i = GetServiceOrInterfaceOrObject(...)

Проблема в том, что такую ​​систему невозможно понять из кода. Где-то должна быть документация [еще], которая определяет, какую службу / интерфейс / объект может запросить служба / интерфейс / объект X. Эта документация должна не только поддерживаться, но и быть доступной так же легко, как и исходный код.

Если документ не написан очень хорошо, часто бывает непросто увидеть отношения между объектами. Иногда отношения временны, что затрудняет их обнаружение.

Мне нравится принцип KISS, и я твердо верю в использование правильного инструмента для работы. Если преимущества DI для данного проекта перевешивают необходимость писать понятный код, чем использовать его.

Я только что понял, что, похоже, воскресил этот вопрос. Это был не я! Это было на первой странице, когда я его нашел =)

Tergiver 12.02.2011 23:26

Другие вопросы по теме