Вопрос

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

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

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

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


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

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

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

Это было полезно?

Решение

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

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

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

i = GetServiceOrInterfaceOrObject(...)

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

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

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

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

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

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

 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 определяет возвращаемые реализации сервиса?

В папке вашего проекта создайте папку с именем META-INF/сервисы и создайте файл с именем dependencyinjection.FooService.Этот файл содержит строку, указывающую на реализацию сервиса.В таком случае:dependecyinjection.FooImpl

Об этом пока широко неизвестно.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top