如何对来自不同项目的关联类进行排序

时间:2009-05-06 12:43:33

标签: java packaging

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

我应该去

  

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

  

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

其中第一个实现具有指出文件属于哪个项目的优点,而第二个实现不会混合文件完全位于不同项目中的事实。

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

5 个答案:

答案 0 :(得分:2)

是的,您需要提出一个命名约定。通常两者的结合使我们公司能够避免歧义。例如,假设你有一个界面:

org.company.service.UserService

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

org.company.service.spring.UserServiceImpl

这两个观点都是最好的:

  1. 您可以在一个单独的包中干净地使用这些类
  2. 使用此类名约定,显然它是UserService的实现,即使导入了两个包,仍然可以区分。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

Sun有Naming conventions。对于包裹:

  

唯一包名的前缀始终以全小写ASCII字母书写,应该是顶级域名之一,目前是com,edu,gov,mil,net,org,或者是英语中的一个 - ISO标准3166,1981中规定的国家代码。

     

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

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

org.company.project.interfacepackage.util.InterfaceClass and
org.company.project.implementationpackage.util.ImplementationClass

答案 3 :(得分:0)

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

我更喜欢选项1

答案 4 :(得分:0)

主要赞同克林顿。

最终,就Java而言,每个软件包名称都是一个孤岛,但根据构建时的内容来分隔事物可能很方便,如:

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

大多数情况下,这会使您的ant文件集变得简单。请注意,即使源文件的布局完全不同,由于构建方式或其他方式,这也适用。我唯一要说的是小心不要在多个源目录中获得相同的包!这可能是丑陋的,很容易偶然发生。

因此,除非这种想法推动你创建单独的高级包,我喜欢将实现包放在接口包中的样式,给impl包一个名称,表明它是如何专门化的,并命名为实施FooImpl。你几乎不需要导入多个实现,但是你偶尔也想要导入接口和impl,在这种情况下,如果它们具有相似的名称就很好。