2010-04-21 77 views
6

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

最好的方法的返回类型是什么:具体类型或接口?

在大多数情况下,我倾向于使用具体类型作为方法的返回类型。因为我相信一个具体的类型对于进一步的使用更加灵活,并且暴露更多的功能。

这个阴暗面:耦合。 天使之一:一个具体的类型包含你最初将要返回的接口和额外的功能。

你的拇指规则是什么?

这是否有任何编程原则?


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

回答

4

我的经验法则:

1)首先,我有方法返回的接口类型,因为它总是容易在以后如果需要更改为具体类型。更难以回到其他方式。

2)即使该方法被声明为返回具体类型,我会编写调用方以尽可能使用接口类型:
InterfaceType i = xyz.methodThatReturnsConcreteType();

3)无论是我自己调用代码有差别太大(内部VS公共API):

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

其他注意事项:

  • 测试可能与接口更容易,因为我可以使用实现该接口的模拟对象。
  • 有一个外部的机会,我希望回到一个proxy object(我现在真的很深远的借口)

综上所述,

  • 我通常返回接口类型因为我认为松耦合的好处超过了充分利用混凝土类型的便利性。
  • 但是,我不反对切换到返回具体类型在个案的基础上,只要方便超过松耦合的好处。
7

规则,在返回类型的例子,是尽可能具体,在参数类型尽可能非特异性。也更喜欢接口,因为如果需要的话,稍后可能会更改您的实现,而无需更改API的客户端。

+0

感谢您的意见Dominik +1 – SDReyes 2010-04-21 00:09:06

+0

'MyCustomExtendedArrayList'比'List'更具体。你会回来什么? – BalusC 2010-04-21 00:15:49

+2

@BalusC:取决于List的另一个实现,或者它提供了一些自定义方法。如果它只能通过投射来使用,那么它会返回一个专门的类有什么意义? – Dominik 2010-04-21 01:45:56

1

有趣的问题。我相信你必须问自己如何使用回报数据。使用古老的汽车来比喻,如果你有

public AccelerationResponse PressAccelerator(float force) {} 

有机会,你会想返回一个接口,而不是一类。您可能会根据特定条件对此响应进行不同解释。

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

+0

谢谢Jeremy,特别是“...如果返回类型可以在不同的实现中重用一个接口更有意义”部分+1 – SDReyes 2010-04-21 00:15:45