【问题标题】:Spring - Package structure - [.../compontent/layer] vs [.../layer/component] [closed]Spring - 包结构 - [.../component/layer] vs [.../layer/component] [关闭]
【发布时间】:2021-11-04 10:28:39
【问题描述】:

我们目前有一个更大的 Spring 项目,它由不同的项目组件组成。可惜目前封装比较不利,所以我要重构整个东西。

我们的基本框架使用逐层封装,这就是为什么我 - 至少目前 - 想在我们的项目中坚持使用它。我想问一下您认为哪种更有用:

变体 1:

- src/main/java
     - com/company/core
       - dao
         - CoreThing1Repository
         - CoreThing2Repository
       - domain
         - CoreThing1
         - CoreThing2
       - dto
       - service
         - CoreThing1Service
         - CoreThing2Service
     - com/company/component1
       - dao
         - Thing1Repository
         - Thing2Repository
       - domain
         - Thing1
         - Thing2
       - dto
       - service
         - Thing1Service
         - Thing2Service
     - com/company/component2
       - dao
         - Thing3Repository
         - Thing4Repository
       - domain
         - Thing3
         - Thing4
       - dto
       - service
         - Thing3Service
         - Thing4Service
     - com/company/component3
       - dao
         - Thing5Repository
         - Thing6Repository
       - domain
         - Thing5
         - Thing6
       - dto
       - service
         - Thing5Service
         - Thing6Service

变体 2:

- src/main/java
     - com/company/dao
       - core
         - CoreThing1Repository
         - CoreThing2Repository
       - component1
         - Thing1Repository
         - Thing2Repository
       - component2
         - Thing3Repository
         - Thing4Repository
       - component3
         - Thing5Repository
         - Thing6Repository
     - com/company/domain
       - core
         - CoreThing1
         - CoreThing2
       - component1
         - Thing1
         - Thing2
       - component2
         - Thing3
         - Thing4
       - component3
         - Thing5
         - Thing6
     - com/company/dto
       - core
         - CoreThing1Repository
         - CoreThing2Repository
       - component1
         - Thing1Repository
         - Thing2Repository
       - component2
         - Thing3Repository
         - Thing4Repository
       - component3
         - Thing5Repository
         - Thing6Repository
     - com/company/service
       - core
         - CoreThing1Service
         - CoreThing2Service
       - component1
         - Thing1Service
         - Thing2Service
       - component2
         - Thing3Service
         - Thing4Service
       - component3
         - Thing5Service
         - Thing6Service

在内容方面,我非常喜欢变体 1,因为组件出来的更好——但整个事情既不是按功能封装,也不是按层封装?你甚至应该做这样的混合吗?

您会选择哪种变体或在您的环境中使用哪种变体?

【问题讨论】:

    标签: spring design-patterns package


    【解决方案1】:

    我非常喜欢变体 1。原因是您可以更好地控制类方法的可见性。

    DAO 类就是一个很好的例子。通常,您不希望 DAO 类被其他服务访问,而不是关于相同业务逻辑的服务(在您的情况下是关于相同组件)。如果您使用变体 2,则不能这样做,因为所有方法都必须是公共的,以便相应的 Service 能够调用 DAO 类。但是您实际上可以在 Java 中通过不使用修饰符或受保护的修饰符来做到这一点。这将使您的代码更具可读性和组织性。此外,添加或删除组件会更容易,因为它的所有逻辑都在同一个包中。

    【讨论】:

    • 不幸的是,上面只显示了包结构。然后,这些文件位于包结构下方。结果,我遇到了必须访问 /com/company/core/dao/ThingRepo.java 的问题,例如来自/com/company/core/service/ThingService.java。我不知道有什么包修饰符?
    • 啊,对不起,我误会了。不,该特定情况没有访问修饰符。尽管如此,我的观点仍然成立。如果组件的数量呈指数增长(假设您有 20 个组件),您的代码组织将与变体 2 混为一谈。我肯定会选择变体 1,即使您没有 DAO、Service、DTO 等包,但在不同的子包中。代码会更好地组织。
    • 完美 - 感谢您的反馈。我已经调整了我上面的帖子。 :)
    • 如果我的回答对您有任何帮助,请考虑投票和/或接受它作为正确答案;)谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多