我正在阅读Code Complete,在本书的最后,在关于重构的章节中,作者列出了一些你应该做的事情,以便在重构时提高代码的质量。返回具体或抽象数据类型?
其中一个观点是返回集合,迭代器等,所以当人们总是返回的特定类型的数据尽可能,尤其是,正如我的理解,而不是返回,说,Collection<String>
,你应该返回HashSet<String>
,如果您在该方法内使用该数据类型。
这让我感到困惑,因为这听起来像是在鼓励人们打破信息隐藏规则。现在,我在谈论访问器时明白这一点,这是一个明确的案例。但是,当计算和修改数据时,并且该方法的抽象级别意味着没有直接的数据结构,我发现尽可能抽象的数据类型返回,只要数据不会分开(我wouldn例如,返回Object
而不是Iterable<String>
)。
所以,我的问题是: Code Complete的建议总是有一个更深的理念,即始终以特定的数据类型返回,并允许向下转换,而不是维持需要知道的基础,即I只是不明白?
是的,在某些情况下,返回LinkedList有一个很好的理由。但是,一旦出现特定需求,经过充分的考虑,而不是默认情况下,我会改变返回类型。 – 2009-05-25 07:07:42
那是错误的做法,你应该总是返回列表。如果你知道客户端会从你的列表中删除很多,那么返回LinkedList是明智的。 返回一个具体的类型而不是一个接口是大多数时候从来都不是正确的做法。方法是关于合同的,合同说我要返回一个X的列表。该列表如何做它的事情并不重要。 – 2009-05-25 07:21:12
是的,但是如果(例如)客户必须迭代列表呢?通过使签名(因此文档)使用LinkedList作为返回类型,客户端知道他们不应该将列表视为随机访问列表。因此,即使所有列表都有List.get(int index),他们也知道要避免在返回的列表中使用该方法。基本上,当调用者有合理需要知道时,指定的返回类型应提供信息。 – 2009-05-25 08:15:13