Нужно ли вводить зависимости в динамических языках?
Для написания тестируемого кода на C# я активно использую DI.
Однако в последнее время я возился с IronPython и обнаружил, что, поскольку вы можете издеваться над любыми методами / классами / функциями и т. Д.... вам нравится, необходимость в DI исчезла.
Это касается динамических языков, таких как Python?
Вместо:
class Person(Address) {
...
Вы можете иметь:
class Person() {
...
// Address initialised in here.
Для динамических языков и, следовательно, следования мануальному DI для динамических языков не требуется.
Любой совет по этому поводу?
4 ответа
Внедрение зависимостей также связано с тем, как вы объединяете вещи, что не имеет ничего общего с надёжностью использования зависимых объектов. Есть разница между Foo
экземпляр, который нуждается в Bar
-подключение какого- то рода напрямую создает его и заставляет полностью игнорировать, как он получает это соединение, пока оно у него есть.
Если вы используете внедрение зависимостей, вы также получаете лучшую тестируемость. Но обратное неверно. Более простая тестируемость за счет возможности перезаписи чего-либо не дает других преимуществ внедрения зависимости. Существует множество компонентных /DI-фреймворков для Python, доступных именно по этим причинам.
Я категорически не согласен с вашим утверждением о том, что внедрение зависимостей не требуется в динамически типизированных языках. Причины, по которым DI полезен и необходим, совершенно не зависят от дисциплины ввода языка.
Основное различие заключается в том, что DI в динамически типизированных языках прост и безболезнен: вам не нужны тяжелые фреймворки и тысячи строк конфигурации XML.
В Ruby, например, есть только две структуры DI. Оба были написаны программистом Java. Ни одна из двух платформ не используется одним проектом. Даже автором этих рамок.
Тем не менее, DI используется повсеместно в Ruby.
Джамис Бак, автор обеих этих платформ, выступил с докладом под названием " Восстановление из Enterprise" на RubyConf 2008 о том, как и почему он написал эти фреймворки и почему это плохая идея, которую стоит посмотреть. Есть также сопроводительное сообщение в блоге, если вы хотите прочитать. (Просто заменяйте "Python" каждый раз, когда он говорит "Ruby", и все будет так же верно.)
Я попробую еще раз. Мой последний ответ пропустил вопрос на милю и уменьшил масштаб за пределами темы.
Используя псевдокод, инъекция зависимостей говорит:
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...:-)
Я думаю, что вы задаете вопрос, который, кажется, о лучшей практике, но на самом деле о производительности во время выполнения.
Избавиться от внедрения зависимости? Как менеджер по выпуску программного обеспечения может спать по ночам?
Проверка работоспособности должна обязательно замедлить программу на один или два шага.
// my generic function entry point - IronPython
if func="a":
...
if func="b":
...
if func="c":
...
Вы можете использовать стандартный Python с классами... или вы можете назначить указатели на функции указателям на функции. Что это за зверь такой? Я знаю я знаю. Я думаю, что Python сложно определить, но мне это нравится. И я люблю и высоко ценю внедрение зависимостей, а не то, что у меня было много времени, когда я мог бы придумать такое длинное имя для практики.