Какая-либо потребность во внедрении зависимости на Динамических Языках?

Для написания тестируемого кода C# я использую DI в большой степени.

Однако в последнее время я бездельничал с IronPython и нашел, что, поскольку можно дразнить любые методы/классы/функции и т.д...., Вам нравится, потребности в DI не стало.

Имеет место это для динамического langagues, такого как Python?

Вместо:

class Person(Address) {
...

Вы можете иметь:

class Person() {
...
    // Address initialised in here.

Для динамических языков и поэтому после manaual DI для динамического langagues просто не нужно.

Совет относительно этого?

12
задан Finglas 24 December 2009 в 00:43
поделиться

4 ответа

Внедрение зависимостей также связано с тем, как вы соединяете вещи вместе, что не имеет ничего общего с имитацией зависимых объектов. Там' Есть разница между наличием экземпляра Foo , которому требуется Bar -соединение некоторого вида, создающего его напрямую, и тем, что он полностью игнорирует то, как он получает это соединение, пока оно имеет его.

Если вы используете внедрение зависимостей, вы также получите лучшую тестируемость. Но обратное неверно. Более простая тестируемость за счет возможности перезаписать что-либо не дает других преимуществ внедрения зависимостей. Именно по этим причинам доступно множество компонентных / DI-фреймворков для Python.

t принести другие преимущества внедрения зависимостей. Именно по этим причинам доступно множество компонентных / DI-фреймворков для Python.

t принести другие преимущества внедрения зависимостей. Именно по этим причинам доступно множество компонентных / DI-фреймворков для Python.

10
ответ дан 2 December 2019 в 19:31
поделиться

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

Основное различие состоит в том, что DI в динамически типизированных языках выполняется легко и безболезненно: вам не нужен тяжелый фреймворк и миллионы строк конфигурации XML.

В Ruby, например, есть только две структуры DI. Оба были написаны Java-программистом. Ни один из этих двух фреймворков не используется в одном единственном проекте. Даже автор этих фреймворков.

Однако DI используется повсеместно в Ruby.

Джеймис Бак, автор обеих этих фреймворков, выступил с докладом под названием Восстановление с Enterprise на RubyConf 2008 о том, как и почему он написал эти фреймворки и почему это была плохая идея, за которой стоит посмотреть. Также есть сопутствующее сообщение в блоге , если вы хотите прочитать. (Просто заменяйте «Python» каждый раз, когда он говорит «Ruby», и все будет так же верно.)

кто является автором этих фреймворков, выступил с докладом под названием Восстановление с предприятия на RubyConf 2008 о том, как и почему он написал эти фреймворки, и почему это была плохая идея, которую стоит посмотреть. Также есть сопутствующее сообщение в блоге , если вы хотите прочитать. (Просто заменяйте «Python» каждый раз, когда он говорит «Ruby», и все будет так же верно.)

Кто является автором обоих этих фреймворков, выступил с докладом под названием Восстановление с предприятия на RubyConf 2008 о том, как и почему он написал эти фреймворки и почему это была плохая идея, которую стоит посмотреть. Также есть сопутствующее сообщение в блоге , если вы хотите прочитать. (Просто заменяйте «Python» каждый раз, когда он говорит «Ruby», и все будет так же верно.)

10
ответ дан 2 December 2019 в 19:31
поделиться

Я думаю, вы задаете вопрос, который, кажется, связан с передовой практикой, но на самом деле касается производительности во время выполнения.

Избавиться от внедрения зависимостей? Как может менеджер выпуска программного обеспечения спать по ночам?

Проверки на выполнение функций обязательно должны замедлить программу на один или два шага.

// my generic function entry point - IronPython
if func="a":
  ...
if func="b":
  ...
if func="c":
  ...

Вы можете использовать стандартный Python с классами ... или вы можете назначить указатели на функции членам указателя функций. Что это за зверь ... ?? Я знаю я знаю. Python, я думаю, трудно определить, но мне он нравится. И я люблю и высоко отношусь к внедрению зависимостей, не то чтобы я давно уже думал присвоить этой практике такое длинное имя.

-2
ответ дан 2 December 2019 в 19:31
поделиться

Я попробую еще раз. Мой последний ответ пропустил вопрос на милю и увеличил масштаб темы.

Используя псевдокод, зависимость Injection говорит с:

class Person
  def Chat() { 
    someOperation("X","Y","Z")
  end
end
...
Person.new().Chat()

и с:

class Person
  initialize(a,b,c)
    @a=a
    @b=b
    @c=c
  end
  def Chat()
    someOperation(@a,@b,@c)
  end
end
...
Person.new("X","Y","Z").Chat()

,... и вообще с помещением объекта и вызовом в различные файлы для целей SCM.

Будь то "X", "Y" или "Z", могут быть высмеяны (... если бы они были объектами...(!)...(!)...) вообще не имеют никакого отношения к тому, хорош ли DI. Действительно. :-)

DI просто проще на Python или Ruby, как и многие другие задачи, потому что есть больше скриптового подхода, как говорит Йорг; а также, конечно, меньше культуры и тенденции, говорящей, что константы и адаптеры должны быть заселены в модели и глобальные константы.

В практическом плане для меня DI - это первый шаг к разделению этих параметров приложения, констант API и фабрик на отдельные файлы, чтобы помочь сделать ваш отчёт по отслеживанию ревизий менее спагетти-подобным ("Были ли эти дополнительные проверки на AppController, чтобы изменить конфигурацию?..? Или чтобы обновить код...?") и более информативным, и более легким для чтения.

Моя рекомендация: Продолжайте использовать DI... :-)

.
0
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: