【问题标题】:Concrete Types or Interfaces for return types?返回类型的具体类型或接口?
【发布时间】:2011-02-10 09:24:59
【问题描述】:

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

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

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

这方面的阴暗面:耦合。 天使般的:具体类型本身包含您最初将要返回的接口,以及额外的功能。

你的拇指规则是什么?

这有什么编程原理吗?


奖励:这是我的意思的一个例子ReadOnlyCollection or IEnumerable for exposing member collections?

【问题讨论】:

    标签: oop methods design-principles


    【解决方案1】:

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

    【讨论】:

    • 感谢您的意见 Dominik +1
    • A MyCustomExtendedArrayListList 更具体。你会返回什么?
    • @BalusC:取决于它是 List 的另一个实现还是提供一些自定义方法。如果只能通过强制转换来使用,那么返回一个专门的类有什么意义?
    • 你可能想要一个接口,比如ExtendedArrayList作为返回类型,然后返回一个MyCustomExtendedArrayList的实例。
    【解决方案2】:

    有趣的问题。相信你要问问自己,返回的数据怎么用。如果有的话,请使用旧车类比

    public AccelerationResponse PressAccelerator(float force) {}
    

    您可能希望返回一个接口而不是一个类。根据某些条件,您可能会以不同的方式解释此响应。

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

    【讨论】:

    • 谢谢 Jeremy,特别感谢“......如果返回类型可以在不同的实现中重用,那么接口更有意义”部分 +1
    【解决方案3】:

    我的经验法则:

    1) 最初,我让该方法返回接口类型,因为以后如有必要,它总是很容易将其更改为具体类型。更难回到另一条路。

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

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

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

    其他注意事项:

    • 使用接口进行测试可能更容易,因为我可以使用实现接口的模拟对象。
    • 有一个外部机会,我想返回 proxy object(现在我真的在找借口)

    总之,

    • 我通常返回接口类型,因为我觉得松散耦合的好处超过了完全访问具体类型的便利。
    • 但是,只要方便大于松散耦合的好处,我不反对根据具体情况切换到 返回具体类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2018-06-07
      • 2016-05-31
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多