2012-06-05 56 views
10

在依赖注入中,我们针对抽象进行编程。避免违反重用抽象原则

根据我的经验,我可以说应用程序中的大多数抽象与他们的实现有1:1的关系。这违反了重用抽象原则

马克·西曼在他的一些帖子,我们可以有抽象空对象执行情况,以便建议避免RAP冲突(这从马克西曼的建议可能是我的推断。请纠正我,如果我错了引用马克在这)。我的问题在于。

  1. 如何做空对象实现?
  2. 可以违反RAP吗?

回答

16

我个人觉得它有用来划去的抽象即使有只有一个生产实施。特别是:

  • 即使你只有一个生产实现,你可能有其他实现测试,无论是全面的假货或动态创建的嘲笑
  • 它的依赖比更清晰的表达在很多情况下取决于具体的类别。例如,具体的类可能会暴露一些其他公众成员,其中不是依赖,由于各种原因。

你要知道,这是一个虚假陈述入手:

在依赖注入,我们对编程抽象。

您可以非常容易地使用具体类的依赖注入。有没有什么可以说你为你的依赖创建接口。依赖注入更多的是关于你的类如何获得的依赖关系,而不是它用来表示它们的抽象级别。

所以基本上:

  • 不要小看“测试双打”的实施抽象的重要性,即使你只有一个生产实施
  • 不要害怕依赖于具体的实现如果你真的想要,但注入依赖关系仍然比在类中创建它更干净,那么它确实是一个“适当的”依赖关系
  • 不要试图注入所有内容 - 如果依赖关系的行为isn'真的是一个英寸那么你可能不想注入它。例如,不要开始注入“收集提供者”,以避免创建List<T>的实例 - 例如,您不需要为了测试目的而将您的类与List<T>的行为隔离开来。
+2

测试! 98%的测试是让我在课堂上抽象出的东西。而嘲笑/假人确保至少有两个“实现”。尽管如此,仍然感到很奇怪我不明白你关于“互动”的最后一点。什么是互动,什么是互动? – stmax

+0

+1测试也是实现计数的两倍 –

+0

@stmax:我意识到我没有解释得非常好 - 很难指出差异。如果感觉像一些描述(包括文件系统等)的* service *,那么感觉就像一个交互。如果它只是一个“没有复杂行为的数据容器”,我们需要忽略测试(例如集合),那么通常不需要注入它。 –