有关方法参数类型,返回类型和属性类型的具体性的规则


9

前一段时间,我读到一种关于方法参数类型,返回类型和属性类型的具体性的“经验法则”,但我只是不记得了。

它说了一些有关使返回类型尽可能具体,而参数类型尽可能抽象的事情……反之亦然。

我不知道这实际上是一个好建议还是坏建议,因此,如果您对此有自己的想法,请发表评论。

干杯。

Answers:



7

具有抽象的输入和具体的输出使您的功能更加通用。这意味着可以以更多方式使用它。另一方面,它对您的方法施加了更严格的约束,从而限制了该方法将来的实现方式。因此,这是不同目标之间的权衡。


4

可能是您听到了Postel法则的推论:“对您发送的内容保持保守,对您接受的内容保持自由。”

通常,这是关于最大化代码的可重用性。很容易拿出案例来说明为什么有帮助。以Java Iterable<T>为例。如果您的方法唯一要做的事情是遍历所有Ts,则将Iterable<T>as作为参数类型可让您将该方法与60多个内置类一起使用,更不用说实现该接口的任何自定义类了。如果将其限制为,Vector<T>则任何调用方法的代码都必须转换为Vector<T>第一个。

在另一方面,返回Iterable<T>从方法限制的代码,可以使用您的返回值是那些采用量Iterable<T>参数。如果返回一个非常具体的类型,比如Vector<T>,那么你的返回值可以传递到了需要的任何方法SerializableCloneableIterable<T>Collection<T>List<T>RandomAccessVector<T>AbstractList<T>,或者AbstractCollection<T>,它会正常工作。


在“最大的软件工程错误”列表中,Postel的定律非常重要。
CodesInChaos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.