Внедряется ли зависимость зависимостей от ООП? - PullRequest
1 голос
/ 27 февраля 2012

Мне кажется, что использование Dependency Injection меняет способ написания моего объектно-ориентированного кода.Например, ниже то, что я сделал бы без DI

Interface: DataAdapter
SqliteDataAdapter implements DataAdapter
XMLDataAdapter    implements DataAdapter
OracleDataAdapter implements DataAdapter

// Initialization
DataAdapter adapter = new SqliteDataAdapter();
DataAdapter adapter = new XMLDataAdapter();
DataAdapter adapter = new OracleDataAdapter();

, но используя DI, моя структура кода была бы:

Interface: DataAdapter
SqliteDataAdapter implements ISqliteDataAdapter,  DataAdapter
XMLDataAdapter    implements IXMLDataAdapter, DataAdapter
OracleDataAdapter implements IOracleDataAdapter, DataAdapter

// Initialization
ISqliteDataAdapter adapter = new SqliteDataAdapter();
IXMLDataAdapter    adapter = new XMLDataAdapter();
IOracleDataAdapter adapter = new OracleDataAdapter();

Причина этого изменения в том, что в моем модуле я могу привязать 1 интерфейс к 1 классу .Это плохая практика?Если да, каково правильное решение?

Разве DI не меняет цели использования интерфейсов?

РЕДАКТИРОВАТЬ: Ниже приведена моя привязка для контейнера DI

bind(ISqliteDataAdapter.class).to(SqliteDataAdapter.class);
bind(IXMLDataAdapter.class).to(XMLDataAdapter.class);
bind(IOracleDataAdapter.class).to(OracleDataAdapter.class);

Если я сделаю, как предложено, как я смогу использовать несколько адаптеров?Что, если мне нужно использовать и XMLDataAdapter, и SQLDataAdapter в моем приложении?

bind(DataAdapter.class).to(SqliteDataAdapter.class);

Редактировать:

Вот текущий вызов для получения экземпляра:

@inject protected ISqliteDataAdapter dataAdapter;

Вот как я должен это сделать, имея только 1 интерфейс:

@inject protected DataAdapter dataAdapter;
// In this case I don't have a choice on which type of data adapter It's going to create
// It's already defined in my module file and it's pointing to one of the 3 DataAdapters

Итак, я пытаюсь понять, как я могу структурировать свой код так, как у меня естьконтроль над типом объекта, который он вводит, без интерфейса для каждого типа DataAdapter.

Ответы [ 2 ]

5 голосов
/ 27 февраля 2012

Я бы сказал, что DI является естественным следствием наличия интерфейсов.Причина, по которой у нас есть интерфейсы, заключается в том, что мы можем писать код, который не зависит от конкретного класса, а работает с множеством классов без каких-либо изменений.Даже если мы ожидаем, что будет только один класс, который нам нужен, это может измениться в будущем.Программируя интерфейс, мы можем даже учитывать изменения, которые мы не можем себе представить.

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

Тем не менее, я думаю, что следует дать одно предупреждение любому, кто связан с такими системами.Существует опасность, что мы напишем полноценные классы, такие как SqliteDataAdaptor, а затем нажмем кнопку «извлечь интерфейс», чтобы получить интерфейс ISqliteDataAdaptor.Эта практика очень плоха, особенно если это часто случается.Вместо этого сначала следует разработать ISqliteDataAdaptor, а затем написать разумную реализацию.

1 голос
/ 27 февраля 2012

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

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

...