![]() |
1
8
正如其他人所提到的,您不必关心库是如何实现功能的,以减少耦合和增加库的可维护性。 如果您作为一个库客户机,能够证明实现对您的用例的性能不好,那么您可以联系负责人,讨论要遵循的最佳路径(此用例的新方法或只是更改实现)。 也就是说,您的示例充满了过早优化的味道。 如果方法是或可以是关键的,那么它可能会在文档中提到实现细节。 |
![]() |
2
29
返回适当的接口以隐藏实现详细信息。您的客户机应该只关心您的对象提供了什么,而不是您如何实现它。如果您从一个私有的arraylist开始,稍后再决定其他一些东西(如linkedlisk、skip list等)更合适,那么如果您返回接口,您可以在不影响客户端的情况下更改实现。当你返回一个具体类型时,机会就消失了。 |
![]() |
3
7
在OO编程中,我们希望尽可能多地封装数据。尽可能隐藏实际实现,尽可能高地抽象类型。 在这种情况下,我会回答 只返回有意义的内容 . 返回值是具体类是否有意义?在你的例子中,问问你自己:有人会对foo的返回值使用LinkedList特定的方法吗?
代码越抽象,更改后端时所需的更改就越少。就这么简单。 另一方面,如果您最终将返回值强制转换为具体类,那么这是一个很强的迹象,表明您可能应该返回具体类而不是具体类。你的用户/队友不必知道多少隐含的契约:如果你需要使用具体的方法,为了清晰起见,只需返回具体的类。 简而言之:代码 摘要 但是 明确地 :) |
![]() |
4
6
通常,对于面向公共的接口(如API),返回接口(如
A的使用
没有理由不在实现中使用具体的类,除非有充分的理由相信
对于消费者来说,图书馆本身应该是一个黑匣子,因此他们不必担心内部的情况。这也意味着图书馆的设计应该使其按照预期的方式使用。 |
![]() |
5
6
在设计课程的时候,我总是信奉“接受最少派生的,返回最派生的”这句咒语,而这些年来,这句话一直让我很受欢迎。 我想这意味着,就接口和具体返回而言,如果您试图减少依赖性和/或去耦,返回接口通常更有用。但是,如果具体类实现 更多 对于方法的调用方来说,将具体类(即“最派生的”)返回通常比返回该接口更有用,而不是将它们限制在返回对象功能的一个子集上,除非实际上 需要 限制他们。同样,您也可以增加接口的覆盖范围。像这样不必要的限制,我把它比作轻率地封闭类;你永远不会知道。只需稍微讨论一下这句咒语的前一部分(对于其他读者而言),接受派生最少的部分也可以为方法的调用者提供最大的灵活性。 -奥辛 |
![]() |
6
4
通常,如果我在一个库的一些私有的、内部的工作中,我只会返回内部实现,即使这样也很谨慎。对于所有公共的、可能从模块外部调用的东西,我都使用接口,以及工厂模式。 以这种方式使用接口已经被证明是编写可重用代码的一种非常可靠的方法。 |
![]() |
7
4
主要问题已经回答,您应该始终使用该接口。不过,我想对
如果您返回的数据结构具有较差的随机访问性能(O(N),并且通常是大量数据),那么您应该指定其他接口而不是列表,例如iterable,这样使用库的任何人都将完全意识到只有顺序访问可用。 选择要返回的正确类型不仅仅是关于接口与具体实现,还涉及选择正确的接口。 |
![]() |
8
3
不管API方法是返回接口还是返回具体的类,这都无关紧要;尽管这里的每个人都这么说,但一旦编写了代码,您几乎永远不会更改实现类。 更重要的是:始终为方法使用最小范围的接口 参数 !这样,客户机拥有最大的自由度,可以使用您的代码甚至不知道的类。
当API方法返回时
|
![]() |
9
2
很抱歉不同意,但我认为基本规则如下:
因此,在本例中,您希望将实现声明为:
理论基础 : 输入案例已经被所有人知道并解释:使用接口,句点。然而,输出情况看起来可能与直觉相反。 您希望返回实现,因为您希望客户机拥有关于接收内容的最多信息。在这种情况下, 知识越多权力越大 . 示例1:客户希望获得第5个元素:
示例2:客户端希望删除第5个元素:
因此,使用接口是一个很好的事实,因为它促进了可重用性,减少了耦合,提高了可维护性,让人们感到高兴……但仅当用作 输入 . 因此,同样,规则可以表述为:
所以,下次,请返回实现。 |
![]() |
10
1
您可以使用接口从实际实现中抽象出来。接口基本上只是实现可以做什么的蓝图。 接口是很好的设计,因为它们允许您更改实现细节,而不必担心它的任何使用者都会受到直接影响,只要您的实现仍然按照接口所说的做。 要使用接口,您可以这样实例化它们:
现在,iparser将是您的接口,解析器将是您的实现。现在,当您从上面处理解析器对象时,您将处理接口(iparser),而该接口反过来又将处理您的实现(解析器)。 这意味着您可以随心所欲地更改解析器的内部工作方式,它不会影响针对您的iparser解析器接口工作的代码。 |
![]() |
11
1
通常,如果您不需要具体类的功能,那么在所有情况下都使用该接口。注意,对于列表,Java添加了 RandomAccess marker类主要用于区分算法可能需要知道get(i)是否为常量时间的常见情况。 对于代码的使用,上面的michael是对的,在方法参数中尽可能地通用通常更重要。这在测试这种方法时尤其如此。 |
![]() |
12
0
您会发现(或者已经发现)当您返回接口时,它们会渗透到您的代码中。例如,您从方法A返回一个接口, 有 然后将接口传递给方法B。 你所做的是按合同编程,尽管方式有限。 这为您提供了很大的范围来更改覆盖下的实现(前提是这些新对象满足现有合同/预期行为)。 考虑到所有这些,您在选择实现以及如何替换行为(例如,测试-使用模拟)方面都有好处。如果你没有猜到,我都支持这个,并尽可能减少到(或引入)接口。 |
![]() |
Giffyguy · 如何限制在构造向量后调用'resize()'? 3 年前 |
![]() |
vytaute · 返回表类型时Oracle函数中的类型错误 3 年前 |
![]() |
bbgghh · 在scala中连接两个列表时如何处理不匹配的键 3 年前 |
![]() |
dev-chicco · Laravel系列寻找常见物品 3 年前 |
![]() |
Mitch · Laravel-雄辩的单品合并系列 6 年前 |
![]() |
Kieran · 为什么类X可以从集合继承<X> 7 年前 |
![]() |
John · 如何在不返回集合本身的情况下返回集合的数据? 7 年前 |
![]() |
Niklas Mertsch · 在泛型集合中实现移除(对象o) 7 年前 |