我有一种情况,我正在重构旧代码,将旧的怪物项目拆分并将其(由于各种原因)拆分为较小的子项目。一个项目最终将包含接口,而其关联的实现在另一个项目中,我不确定设置包结构的最佳方法。
我应该去
org.company.interfaceproject.util.InterfaceClass 和
org.company.implementationproject.util.ImplementationClass 的
或
org.company.project.util.InterfaceClass 和
org.company.project.util.ImplementationClass 的
其中第一个实现具有指出文件属于哪个项目的优点,而第二个实现不会混合文件完全位于不同项目中的事实。
我想这里没有对错,但我很好奇是否有人对此事有任何意见。
答案 0 :(得分:2)
是的,您需要提出一个命名约定。通常两者的结合使我们公司能够避免歧义。例如,假设你有一个界面:
org.company.service.UserService
然后,我们将使用以下内容来连接或具有spring依赖项的实现类:
org.company.service.spring.UserServiceImpl
这两个观点都是最好的:
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,在这种情况下,如果它们具有相似的名称就很好。