代码之家  ›  专栏  ›  技术社区  ›  Finglas

是否需要动态语言中的依赖注入?

  •  12
  • Finglas  · 技术社区  · 15 年前

    为了编写可测试的C代码,我大量使用DI。

    但是最近我一直在处理Ironpython,发现您可以模拟任何方法/类/函数等…你喜欢,对DI的需求已经不复存在了。

    这是动态语言(如python)的情况吗?

    而不是:

    class Person(Address) {
    ...
    

    你可以拥有:

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

    对于动态语言,因此不需要遵循动态语言的ManualDI。

    有什么建议吗?

    4 回复  |  直到 6 年前
        1
  •  10
  •   Alex Brasetvik    15 年前

    依赖注入还涉及到如何将事物连接在一起——这与依赖对象的可模拟性无关。有一点不同 Foo -需要一个 Bar -连接 一些 类直接实例化它,让它完全忽略它 得到 只要有这种联系 它。

    如果你使用依赖注入 获得更好的可测试性。但事实并非如此。通过覆盖任何内容来实现更容易的可测试性不会带来依赖注入的其他好处。出于这些原因,有许多针对Python的组件/DI框架可用。

        2
  •  10
  •   frzng    6 年前

    我强烈反对您的声明,即在动态类型语言中不需要依赖注入。DI之所以有用和必要,完全独立于语言的类型规则。

    主要的区别在于动态类型语言中的DI既简单又轻松:您不需要一个重量级的框架和大量的XML配置行。

    例如,在Ruby中,只有两个DI框架。两者都是由Java程序员编写的。这两个框架都不是由 单一的 项目。甚至没有 作者 这些框架。

    然而,DI在Ruby中被广泛使用。

    JamisBuck,这两个框架的作者,发表了一个名为 Recovering from Enterprise 在2008年的Rubyconf大会上,他谈到了他如何和为什么写这些框架,以及为什么这是一个坏主意,这值得关注。还有一个 accompanying blog post 如果你想读书的话。(每次他说__ruby_时都要用__python_代替,一切都会一样有效。)

        3
  •  0
  •   martinr    15 年前

    我再试一次。我的最后一个回答把问题漏了一英里,偏离了主题。

    使用伪代码时,依赖项注入表示:

    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中更简单,就像许多其他任务一样,因为有更多的脚本方法,如J_ rg所说;当然,也没有文化和倾向于说常量和适配器将被填充到模型和全局常量中。

    实际上,对于我来说,DI是将这些应用程序参数、API常量和工厂分离为单独的文件的第一步,它有助于使修订跟踪报告看起来不那么像意大利面(“AppController上的额外签入是否用于更改配置…”或者更新代码…?“)更多信息,更容易阅读。

    我的建议是:继续使用DI…-)

        4
  •  -2
  •   martinr    15 年前

    我认为您提出的问题似乎是关于最佳实践,但实际上是关于运行时性能。

    摆脱依赖注入?软件发布管理器如何在夜间睡眠?

    要执行的功能测试肯定会使程序慢下来一两个TAD。

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

    您可以将标准的python与类一起使用…也可以将函数指针分配给函数指针成员。这是什么样的野兽…?我知道,我知道。我认为很难定义python,但我喜欢它。我喜欢并高度重视依赖性注入,而不是我很久以前就想给这个实践取这么长的名字。