【问题标题】:Modules vs Layers in Java package structureJava 包结构中的模块与层
【发布时间】:2011-06-16 19:22:51
【问题描述】:

我以前把所有东西都放在这样的包里:

com.company.app.module1
com.company.app.module2

但它使基于包的 AOP 切入点变得困难,并导致需要 IDE 才能理解的庞大包。

所以现在我意识到我需要一个更深层次的包结构,但我经常被撕裂。像这样给模块优先级?

com.company.app.module1.domain
com.company.app.module1.logic
com.company.app.module1.persistence
com.company.app.module2.domain
com.company.app.module2.logic
com.company.app.module2.persistence

或者像这样给图层优先级?

com.company.app.domain.module1
com.company.app.domain.module2
com.company.app.logic.module1
com.company.app.logic.module2
com.company.app.persistence.module1
com.company.app.persistence.module2

各有优缺点?

【问题讨论】:

    标签: java architecture aop packages


    【解决方案1】:

    按模块组织允许开发人员专注于作为交付单元的功能集,而不是技术基础架构。如果您根据模块进行分解,那么扩展您的代码库可能会更容易——我看过的一些开源项目(例如 Artifactory 和 Continuum)以这种方式组织事物,但我没有足够了解这是否是大势所趋。

    这可能确实取决于您的代码库大小。

    【讨论】:

    • 这也是隔离与代码共享之间的选择。如果您使用模块结构(在自己的包中包含所有域对象、服务、daos 以及任何用于单独功能的东西),那么您将属于所有模块的东西放在哪里?您最终将创建一个共享包,其中还包含所有共享域对象、服务、daos 等等。如果有很多共享代码,它会变得臃肿,你最终可能会将它们分成几层,真的。这是我至少面临的一个问题:/
    【解决方案2】:

    我承认,我从来没有真正做过很多(正式的)AOP。

    就我个人而言,我会把模块放在第一位。

    这样,如果您稍后将模块拆分为多个 JAR/WAR 文件(例如,拆分为单独的 maven 项目),它们已经位于正确的目录结构中,可以按模块拆分。

    【讨论】:

      【解决方案3】:

      我会逐层组织包层次结构,以使您的工具能够正常工作。每个模块都将使用自己的源文件夹进入自己的项目。这使您的 IDE 和开发人员可以轻松进行面向模块的分组,而您的运行时工具可以轻松进行面向层的分组

      【讨论】:

        【解决方案4】:

        模块优先。

        我有一个最初是分层优先的项目,但它变得过于庞大而无法阅读和维护,因此我们对其进行了重构。它也使用了 AOP——没有任何问题。我们只是在包定义的中间使用了..(我们使用了带有aspectj语法的spring aop)。下面是它的样子:

        execution(* com.foo.app.modules..service..*.*(..))
        

        这匹配modules.module1.servicemodules.module2.service

        【讨论】:

          【解决方案5】:

          我也宁愿把模块放在首位,但在我看来,这样做你必须在任何地方引用所有内容。这可能是开发人员之间产生这种混淆的原因。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-09
            • 1970-01-01
            • 1970-01-01
            • 2020-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多