Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 返回类型的具体类型或接口?_Oop_Methods_Design Principles - Fatal编程技术网

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

Oop 返回类型的具体类型或接口?,oop,methods,design-principles,Oop,Methods,Design Principles,今天,我谈到了对象编程风格、具体类型或接口的一个基本悖论 对于方法的返回类型,最好的选择是什么:具体类型还是接口 在大多数情况下,我倾向于使用具体类型作为方法的返回类型。因为我相信具体类型对于进一步的使用更加灵活,并且公开了更多的功能 这其中的阴暗面:耦合。 angelic类型:具体类型本身包含最初要返回的接口,以及额外的功能 你的拇指法则是什么 这有什么编程原则吗 奖金:这是我的意思的一个示例经验法则,在返回类型中,尽可能具体,在参数类型中,尽可能不具体。也更喜欢接口,因为如果需要,您可以稍

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

对于方法的返回类型,最好的选择是什么:具体类型还是接口

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

这其中的阴暗面:耦合。 angelic类型:具体类型本身包含最初要返回的接口,以及额外的功能

你的拇指法则是什么

这有什么编程原则吗



奖金:这是我的意思的一个示例

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

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

public AccelerationResponse PressAccelerator(float force) {}
您可能希望返回接口而不是类。根据特定条件,您可能会以不同的方式解释此响应

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

我的经验法则:

1) 最初,我让该方法返回接口类型,因为如果需要的话,以后将其更改为具体类型总是很容易的。从另一个方向回去更难

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

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

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

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

  • 我通常返回接口类型,因为我觉得松耦合的好处大于完全访问具体类型的方便
  • 然而,我并不反对在方便性超过松耦合的好处时,切换到逐个返回具体类型

感谢您的意见Dominik+1A
MyCustomExtendedArrayList
列表更具体。你会返回什么?@BalusC:取决于它是List的另一个实现还是提供了一些自定义方法。如果一个专门的类只能通过强制转换使用,那么返回它又有什么意义呢?您可能需要一个接口,比如说
ExtendedArrayList
作为返回类型,然后返回
MyCustomExtendedArrayList
的一个实例。特别感谢Jeremy“…如果返回类型可以在不同的实现中重用,则接口更有意义”第1部分