返回类型的具体类型或接口?

时间:2010-04-21 00:02:33

标签: oop methods design-principles

今天我遇到了对象编程风格,具体类型或接口的基本悖论。

对于方法的返回类型更好的选择:具体类型还是接口?

在大多数情况下,我倾向于使用具体类型作为方法的返回类型。因为我相信具体类型更灵活,可以进一步使用并提供更多功能。

黑暗的一面:耦合。 天使之一:具体类型包含您最初将要返回的界面以及额外的功能。

你拇指的规则是什么?

这有什么编程原则吗?


BONUS :这就是我的意思ReadOnlyCollection or IEnumerable for exposing member collections?

3 个答案:

答案 0 :(得分:7)

经验法则,在返回类型中,尽可能具体,参数类型尽可能不具体。也喜欢接口,因为如果需要,您可以稍后交换您的实现,而无需更改API的客户端。

答案 1 :(得分:5)

我的经验法则:

1)最初,我让方法返回接口类型,因为如果需要,以后总是很容易将其更改为具体类型。更难以回到其他方面。

2)即使声明方法返回具体类型,我也会尽可能地将调用者编码为使用接口类型:
InterfaceType i = xyz.methodThatReturnsConcreteType();

3)我是否拥有调用代码也有所不同(内部与公共API):

  • 如果我拥有调用相关方法的代码(即内部API),那么我就更愿意返回具体类型。
  • 如果我不控制调用此方法的代码(例如公共API),则更有可能返回接口类型。 返回具体类型是一种承诺,一般而言,我承诺的越少越容易。

其他考虑因素:

  • 使用接口可以更轻松地进行测试,因为我可以使用实现接口的模拟对象。
  • 我有机会回复proxy object(现在我真的找借口了)

总之,

  • 我通常返回接口类型,因为我觉得松散耦合的好处超过了完全访问具体类型的便利性。
  • 但是,每当方便性超过松散耦合的好处时,我并不反对在具体情况下切换到返回具体类型

答案 2 :(得分:1)

有趣的问题。我相信你必须问问自己如何使用返回数据。如果你有

那么使用古老的汽车比喻
public AccelerationResponse PressAccelerator(float force) {}

您可能希望返回界面而不是类。您可以根据特定条件不同地解释此响应。

如果保证您的返回只能以具体实现所期望的方式使用,那么使用该类是有意义的。我不确定任何被广泛接受的原则,但我的经验法则是,如果返回类型可以在不同的实现中重用,那么界面更有意义。