依赖注入与不使用全局变量有何不同?

Zub*_*air 16 dependency-injection

我一直在阅读很多关于依赖注入的想法,认为它可能是一些非常先进的编程方式,但我看不出只是避免全局状态之间的区别,因为当没有全局状态时,你被迫传递所有依赖项对象.

有人可以向我解释,因为我认为我可能会忽略关于什么是依赖注入的问题?

die*_*dha 22

依赖注入是关于解耦代码.

当你通过传递参数来避免使用全局变量时,你正在解耦代码.您正在删除代码对全局变量的依赖性.

你可以将这种解耦概括为不仅仅是避免使用全局变量.请使用以下代码:

def foo(arg):
   return ClassBar(arg).attr

foo(1)
Run Code Online (Sandbox Code Playgroud)

该函数foo依赖于紧密耦合 ClassBar.这不好的原因是你将被迫更新foo:

  • 构建ClassBar变革的论据
  • 你想改变ClassBar别的东西
  • 另一段代码想要attr从另一个对象访问

如果代码被重写:

def foo(instanceBar):
   return instanceBar.attr

foo(ClassBar(1))
Run Code Online (Sandbox Code Playgroud)

您已将耦合推送到呼叫者.这消除了对定义的依赖性foo.这使您无需foo在上述情况下进行更新.解耦的代码越多,您需要进行的代码更改就越少.

  • 它总是比其他任何可能去的地方更模糊(除了其他无意义的话).例如,如果您使用了区域和圆形,或矩形和八边形,或SomeFunction和somevar,它会立即明确表示AnotherFunction和somevar是不同的概念,或者至少不是不同情况下相同单词的良好候选者,例如使用圆圈和圆圈看起来显然令人困惑,对吧?类似的东西.对于每个使用它们的人来说,它们都不如说好. (3认同)
  • -1不仅仅使用传统上不好的例子foo和bar,而是使用它们区分大小写!:$ (2认同)
  • 有史以来最清晰、最简洁的描述!:) (2认同)

Maj*_*ifi 5

我对依赖注入的理解是你忽略了创建对象的细节,只声明需要这样的对象.例如,框架将在需要之前设置此对象.

所以这里的价值就是关注点的分离.这对于测试何时注入真实对象的模型非常有用.