2016-06-27 4 views
0

Я собираюсь спросить, возможно, простой вопрос дизайна OO.Где создать реализацию интерфейса?

Представьте, что мы инвертировали зависимость между двумя конкретными классами (Foo и Hoo) с помощью интерфейса (IHoo), где Hoo реализует интерфейс, а Foo использует эту реализацию.

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

Так что, возможно, мы связываем клиент и реализацию интерфейса в классе мастера (или более высокого уровня), таком как контроллер или так? Каким будет ваш подход?

Thx.

+0

[metasyntactic variable] (https://en.wikipedia.org/wiki/Metasyntactic_variable), следующий за _foo_, обычно является _bar_. ;) – jaco0646

+0

Как ответил @samoht, просто передайте Foo ссылку на экземпляр IHoo, который создается где-то в другом месте. http://www.jamesshore.com/Blog/Dependency-Injection-Demystified.html – Fuhrmanator

+0

@Fuhrmanator Да, получил это :). – zgulser

ответ

3

Взгляните на концепцию composition root. Здесь все должно быть подключено.

Заводы могут использоваться там, где реализация известна только во время выполнения.

+0

Я собираюсь посмотреть на него и вернуться к вам. – zgulser

0

В дополнение к другим ответам, и чтобы попасть на вопрос Где создать реализацию интерфейса?GRASP Creator pattern говорит (я изменил его для контекста Hoo):

Класс B должен быть ответственным за создание экземпляров класса Hoo, если один или несколько из следующих действий:

  • экземпляры B содержат или композитно совокупные экземпляры Hoo
  • экземпляров B записей экземпляров Hoo
  • Экземпляры B тесно используются экземпляры Hoo
  • У экземпляров B есть данные инициализации для экземпляров Hoo и передать их при создании.

ответ Дэвида Осборна указывает (как ГРАСП Творца), вы можете также использовать завод.

Смежные вопросы