1

我有一种情况,我正在重构旧代码,拆开一个旧的怪物项目并将其(出于各种原因)拆分为更小的子项目。一个项目最终将包含大部分接口,而它们的相关实现在另一个项目中,我不确定设置包结构的最佳方法。

我应该去吗

org.company.interfaceproject.util.InterfaceClass
org.company.implementationproject.util.ImplementationClass

或者

org.company.project.util.InterfaceClass
org.company.project.util.ImplementationClass

其中第一个实现的优点是指出文件属于哪个项目,而第二个实现并没有混合文件在不同项目中的事实。

我想这里没有对错,但我很好奇是否有人对此事有任何意见。

4

5 回答 5

2

是的,您只需要提出一个命名约定。通常两者的结合适合我们公司以避免歧义。例如,假设您有一个接口:

org.company.service.UserService

然后,我们将对由 spring 依赖项连接或具有 spring 依赖项的实现类使用以下内容:

org.company.service.spring.UserServiceImpl

那么这两种观点中最好的:

  1. 您将这些类干净地放在一个单独的包中
  2. 使用这个类名约定,很明显它是 的实现UserService,即使在导入两个包时仍然可以区分。
于 2009-05-06T14:15:56.003 回答
1

两者都有优点。这最终取决于您对项目的意图。如果您的意图是最终创建接口的替代实现,则使用选项 1 可能更有意义。如果这将是接口的唯一实现,则选项 2 会更合理。

于 2009-05-06T12:50:32.933 回答
1

Sun 有命名约定。对于包裹:

唯一包名的前缀总是用全小写的ASCII字母写的,应该是顶级域名之一,目前是com, edu, gov, mil, net, org,或者是英文的两字母代码之一识别 ISO 标准 3166, 1981 中指定的国家/地区。

包名称的后续组成部分根据组织自己的内部命名约定而有所不同。此类约定可能会指定某些目录名称组件是部门、部门、项目、机器或登录名。

所以我更喜欢您指定项目名称的第二个选项。或者我会像这样合并两者:

org.company.project.interfacepackage.util.InterfaceClass and
org.company.project.implementationpackage.util.ImplementationClass
于 2009-05-06T13:00:15.140 回答
0

如果可以的话,您应该将接口类放入单独的插件/包中。当您使用接口时,大多数时候您将拥有该接口的多个实现。

我更喜欢选项1

于 2009-05-06T12:55:30.690 回答
0

大多同意克林顿的观点。

最终,就 Java 而言,每个包名称都是一个孤岛,但根据在构建时组装的内容和内容来分隔事物会很方便,如下所示:

com.foo.client.*
com.foo.server.*
com.foo.common.*

大多数情况下,这会使您的 ant 文件集保持简单。请注意,即使由于构建方式或其他原因,源文件的布局完全不同,这也适用。我要说的唯一一件事是注意不要在多个源目录中获取相同的包!这可能很丑陋,而且很容易意外地做到。

因此,除非这种想法促使您创建单独的高级包,否则我喜欢将实现包放在接口包中的风格,给 impl 包起一个表明它是如何专业化的名称,并为实现命名FooImpl。您几乎从不需要导入多个实现,但有时您确实希望同时导入接口和实现,在这种情况下,如果它们具有相似的名称会很好。

于 2009-05-06T14:33:34.620 回答