是否有(Java)包组织的最佳实践?

是否有(Java)包组织的最佳实践?,java,package,naming-conventions,Java,Package,Naming Conventions,不久前,我看到这里回答了一个关于java包的细粒度组织的问题。例如,my.project.util,my.project.factory,my.project.service,等等 我现在找不到,所以我不妨问这个问题 关于Java中包的组织以及包中包含的内容,是否有最佳实践 如何在Java项目中组织类 例如,我正在与几个人合作的一个项目有一个名为beans的包。它一开始是一个包含简单bean的项目,但最终(由于经验不足和缺乏时间)包含了所有内容(几乎)。通过将一些工厂类放在工厂包中(使用创建be

不久前,我看到这里回答了一个关于java包的细粒度组织的问题。例如,
my.project.util
my.project.factory
my.project.service
,等等

我现在找不到,所以我不妨问这个问题

关于Java中包的组织以及包中包含的内容,是否有最佳实践

如何在Java项目中组织类

例如,我正在与几个人合作的一个项目有一个名为beans的包。它一开始是一个包含简单bean的项目,但最终(由于经验不足和缺乏时间)包含了所有内容(几乎)。通过将一些工厂类放在工厂包中(使用创建bean的静态方法的类),我对它们进行了一些清理,但我们还有其他类执行业务逻辑,其他类执行简单处理(不使用业务逻辑),比如从属性文件中检索代码的消息


非常感谢您的想法和评论。

我不知道软件包组织的标准实践。我通常会创建一些涵盖范围相当广的包,但我可以在项目中进行区分。例如,我目前正在处理的一个个人项目有一个专门用于我的定制UI控件的包(全是swing类的子类)。我有一个专门用于数据库管理的包,我有一个用于我创建的一组侦听器/事件的包,等等

另一方面,我让一位同事为他所做的几乎所有事情创建了一个新的包。他想要的每个不同的MVC都有自己的包,而且MVC集似乎是同一个包中唯一允许的类分组。我记得有一次他有5个不同的包,每个包中都有一个类。我认为他的方法有点极端(当我们无法处理它时,团队强迫他减少包数),但对于一个非平凡的应用程序,将所有内容放在同一个包中也是如此。这是你和你的队友必须为自己找到的平衡点


你可以做的一件事是试着退一步思考:如果你是项目的新成员,或者你的项目是作为开源或API发布的,那么找到你想要的东西有多容易/困难?因为对我来说,这才是我真正想要的包:组织。与我将文件存储在计算机文件夹中的方式类似,我希望能够在不必搜索整个驱动器的情况下再次找到它们。我希望能够找到我想要的类,而不必搜索包中所有类的列表。

包组织或包结构通常是一个热烈的讨论。以下是一些简单的包命名和结构指南:

  • 跟随java
  • 根据软件包的功能角色和业务角色构建软件包
    • 根据软件包的功能或模块对其进行细分。e、 g.
      com.company.product.modulea
    • 进一步的细分可能基于软件中的层。但是,如果包中只有很少的类,那么将所有类都包含在包中是有意义的。e、 g.
      com.company.product.module.web
      com.company.product.module.util
    • 避免过度结构化,IMO避免对例外情况、工厂等进行单独包装,除非有迫切需要
  • 如果您的项目很小,请使用少量软件包保持简单。e、 g.
    com.company.product.model
    com.company.product.util
  • 请看一些流行的开源项目。了解他们如何为各种规模的项目使用结构化
  • 还考虑命名时的构建和分布(允许您在不同的包中分发API或SDK,参见servlet API)

经过一些实验和尝试,你应该能够想出一个你感到舒服的结构。不要拘泥于一个惯例,要乐于接受变化。

我按功能组织包,而不是按模式或实现角色组织包。我认为这样的包装:

  • bean
  • 工厂
  • 收藏
你错了

例如,我更喜欢:

  • 订单
  • 存储
  • 报告
因此,我可以通过包可见性隐藏实现细节。订单工厂应位于
订单
包中,因此有关如何创建订单的详细信息将被隐藏

关于Java中包的组织以及包中包含的内容,是否有最佳实践

不完全是。有很多想法,很多观点,但真正的“最佳实践”是运用你的常识

(请阅读以了解“最佳实践”的观点和推广者。)

然而,有一个原则可能被广泛接受。您的包结构应该反映应用程序的(非正式的)模块结构,并且您的目标应该是最小化(或者完全避免)模块之间的任何循环依赖关系

(包/模块中类之间的循环依赖关系很好,但包间循环往往使您难以理解应用程序的体系结构,并可能成为代码重用的障碍。特别是,如果您使用Maven,您会发现循环的包间/模块间依赖关系意味着整个互连的混乱必须e一个Maven人工制品。)

我还应该补充一点,对于包名,有一种被广泛接受的最佳做法。那就是,包名应该以组织的域名开头,顺序相反。如果遵循这一规则,则可以降低likeli
com/company/module
  + feature1/
    - MainClass          // The entry point for exploring
    + api/               // Public interface, used by other features
    + domain/
      - AggregateRoot
      + api/             // Internal API, complements the public, used by web
      + impl/ 
    + persistence/       
    + web/               // presentation layer 
    + services/          // Rest or other remote API 
    + support/            
  + feature2/
  + support/             // Any support or utils used by more than on feature
    + io
    + config
    + persistence
    + web