(当使用一个具体的类时,使用具体类编程到接口v / s)

时间:2009-09-08 16:24:57

标签: java oop design-principles

在OO组件中,当一个类只有一个实现可用且该类未“发布”到其他组件时,是否仍然建议使用接口并使用该接口?

我完全了解'编程到接口'的设计原则,并且也广泛使用它。

最近,我一直在观察,大多数情况下,从不需要不同的实现(尽管可能并且有意义)。由于总是使用接口,应用程序代码将有相当数量的接口,每个接口只有一个实现,接口似乎是一种开销。

相反,是否最好只使用具体类并仅在需要第二个实现时引入接口?无论如何,现在使用IDE提取界面是轻而易举的。当引入新接口时,可以更改对旧具体类的引用以使用新接口。

您怎么看?

6 个答案:

答案 0 :(得分:13)

即使只有一个实现,我继续编程接口的一个原因是因为它使我的测试编写更容易很多。我可以设置代理来测试我想要测试的任何东西,我不必担心紧耦合。

这并不总是可取的,但是当你想要决定时,这是值得考虑的事情。你认为你需要对这个类/对象进行广泛的测试吗?如果你认为你将会更容易处理界面而不是具体的类。

替代方法是不使用接口和子类化具体类,这也是有效的,但它又取决于它。

答案 1 :(得分:6)

为具体类型创建接口是一种微妙的平衡行为,因为您可以轻松创建一个没有任何好处的接口爆炸,并且只会使冗余类型的域空间复杂化。

我的经验法则是仅为面向公众的API的类型创建接口。所有专门用于实现API并且从不从API公开的类型都不需要接口。

答案 2 :(得分:3)

接口应该进化,而不是创建。在创建接口之前,您应该特别需要接口。如果您不需要多个实现,则不需要接口。永远记住,YAGNI

答案 3 :(得分:0)

据我所知,有三种情况说接口是合理的:

  1. 这是架构的一部分(我承认这个架构没有很好地定义)。
  2. 您有多个实施。
  3. 这是一个公共界面。
  4. 不要害怕使用具体课程。 不要为每一个类机械地生成一个接口。

答案 4 :(得分:0)

除了已经给出的好答案(易于测试和公共API)之外,我喜欢使用界面,因为它更容易关注你的课程应该做什么,而不是“他们如何”这样做。

答案 5 :(得分:0)

通常:否。如果您只是实现一次功能,则不需要接口。 像所有东西这样的接口都有一个权衡:他们引入了更多的工作(成本),并可能会带来更多的好处。如果成本超过收益,你可能不应该这样做!