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

SDR*_*yes 5 oop methods design-principles

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

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

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

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

你拇指的规则是什么?

这有什么编程原则吗?


奖励:这是我用于暴露成员集合的ReadOnlyCollection或IEnumerable的一个例子吗?

Dom*_*nik 7

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

  • @BalusC:取决于它只是List的另一个实现还是它提供了一些自定义方法.如果它只能通过投射使用,那么返回专门的类会有什么意义呢? (2认同)

Ber*_*t F 6

我的经验法则:

1)最初,我有方法返回接口类型,因为如果需要,它总是很容易将其更改为具体类型.更难以回到另一个方向.

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

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

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

其他考虑:

  • 接口测试可能更容易,因为我可以使用实现接口的模拟对象.
  • 我有机会回到代理对象(现在我真的找借口了)

综上所述,

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