接口是否应该放在单独的封装中?[已关闭]

2022-08-31 11:23:00

我是一个团队的新手,他们正在处理一个相当大的项目,有很多组件和依赖项。对于每个组件,都有一个包,其中放置了该组件的公开接口。这是一种很好的做法吗?interfaces

我通常的做法一直是接口和实现在同一个包中。


答案 1

放置接口和实现是很常见的地方,似乎不是问题。

以Java API为例 - 大多数类都在同一个包中包含两个接口及其实现。

java.util包为例:

它包含诸如 、 等接口,同时还具有 、 和 等实现。SetMapListHashSetHashMapArrayList

此外,Javadocs 被设计为在这些条件下运行良好,因为它在显示包的内容时将文档分离到“接口”和“类”视图中。

只有接口的包实际上可能有点过分,除非有大量的接口。但是,仅仅为了这样做而将接口分离到它们自己的包中听起来像是一种不好的做法。

如果需要将接口的名称与实现区分开来,则可以使用命名约定以使接口更易于识别:

  • 在接口名称前面加上 I 前缀。此方法适用于 .NET 框架中的接口。很容易看出这是列表的界面。IList

  • 使用 -able 后缀。这种方法在 Java API 中很常见,例如 、 、 和 仅举几例。ComparableIterableSerializable


答案 2

对于任何语言,将它们放在同一个包中都可以。重要的是暴露在外部世界之外的东西,以及它从外面看起来如何。没有人会知道或关心实现是否在同一包中。

让我们看一下这个特定的实例。

如果一个包中包含所有公共内容,而另一个未公开的包中包含私有内容,则库的客户端将看到一个包。如果将私有内容移动到包含公开内容的包中,但不从包中公开它们,则客户端看到的是完全相同的内容。

因此,这有一种没有充分理由的规则的味道:它是根据公开可见的东西做出决定,而该决定对公开可见的内容没有任何影响。

也就是说,如果在任何特定情况下,将接口和实现拆分为单独的包似乎是一个好主意,请继续前进并执行此操作。想到这样做的原因是包很大,或者您可能想要链接的替代实现而不是标准实现。