在Java项目中组织包的利弊

在Java项目中组织包的利弊,java,package,organization,Java,Package,Organization,随着我正在从事的项目越来越大,我开始对将类划分为包的问题非常不确定。假设项目有很多层,这些层中有接口和实现,甚至还有更多的子层(组件)。我总是会收到很多让人有点困惑的包裹 所以我想知道其他人使用软件包的方法。您更喜欢有很多包和很少的类,还是有几个包和很多的类?您喜欢将实现与接口分开吗?等等一般来说,你每天使用软件包的习惯以及你的方法的优缺点 谢谢你的帖子。软件包旨在帮助你找到东西 如果他们让事情变得更加混乱,那说明你做得不太对。如果包结构不直观,那么实际上查找类可能比在平面结构中更困难 据我所知

随着我正在从事的项目越来越大,我开始对将类划分为包的问题非常不确定。假设项目有很多层,这些层中有接口和实现,甚至还有更多的子层(组件)。我总是会收到很多让人有点困惑的包裹

所以我想知道其他人使用软件包的方法。您更喜欢有很多包和很少的类,还是有几个包和很多的类?您喜欢将实现与接口分开吗?等等一般来说,你每天使用软件包的习惯以及你的方法的优缺点


谢谢你的帖子。

软件包旨在帮助你找到东西

如果他们让事情变得更加混乱,那说明你做得不太对。如果包结构不直观,那么实际上查找类可能比在平面结构中更困难

据我所知,有两所基本的学校可以将课程分为两部分:

  • 先按模块组织。在这里,您的高级包是系统的不同模块,您可以按功能进一步拆分它
  • 按功能组织。在这里,您首先按功能进行组织(例如,一个包中的所有控制器类,另一个包中的所有数据容器等),并可以选择按模块进行细分
  • 这两种系统都有优点和缺点,我发现它们大致相同,尽管我稍微喜欢模块方法

    不过,真正重要的是遵循一种制度,不要将其与另一种制度混为一谈。不要把类塞进它们不属于的包中,如果新类似乎不属于任何现有类,也不要害怕创建新包

    如果一个包看起来太大了,您可能需要拆分它。但一个包是否应该被拆分的决定应该取决于其中的类之间是否有明确的概念划分,而不是数字。一个只有一个类的包和一个有三十个类的包一样好,如果它们存在的原因显而易见的话

    至于分离接口和实现,首先,我可能会质疑是否需要它们。我经常遇到只有一个合理实现的接口,这使我怀疑它们存在的原因。(有时有很好的理由,但通常没有。)

    但是如果给定接口有多个实现,那么是的,我会将它们分开。接口将是
    com.foo.Bar
    ,实现类似于
    com.foo.Bar.CrowBar
    com.foo.Bar.TaskBar
    。显然,如果您的实现属于不同的模块,那么您会将其更改为
    com.foo.moduleX.bar.CrowBar
    com.foo.bar.moduleX.CrowBar
    ,具体取决于您所遵循的系统


    重读这一切,听起来确实有点复杂,但可能第一句话是最重要的:不要盲目遵循打包原则,包应该帮助您找到类,而不是阻碍您。

    我更喜欢尽可能将类和方法的范围限制为私有或包保护(所以它们不会弄乱Eclipse的autocomplete:),这自动意味着包可以包含相当多的类

    我更喜欢将业务数据对象(DAO)与其存储库/检索服务分离,后者与业务逻辑对象和视图分离

    由于我倾向于重用逻辑,没有交叉依赖关系的相关功能集倾向于放在它们自己的工件中。当您开始使用OSGi和独立服务时,特别方便


    有一点很重要,即公开导出的接口(公共接口、枚举和类)需要有一定的关联性,因此包文档显示了一些内聚性。

    谢谢您详尽的回答。我有一个问题。关于模块中的子模块,您也为它们创建包吗?例如
    com.foo.moduleX.submoduleX.
    com.foo.moduleX.submoduleY。