大多数企业Java应用程序在设计上都有一些相似之处。 这些应用程序的打包通常由它们使用的框架(如Spring,EJB或Hibernate等)驱动。或者,您可以按功能对打包进行分组。 像其他任何有关建模的项目一样,这也不是没有任何问题。 让我们讨论一些权衡以及如何解决它们。 在这篇文章中,我们将讨论两种方法在常见使用场景下的利弊。
逐层封装(PBL)
这是开发人员在创建企业应用程序时将其拆分为多个层(如DAO,SERVICE,VIEW等)时要做的第一件事。
当我们在不同的层使用不同的框架时,代码分离。 例如,如果我要使用Hibernate,Spring和JSF,那么我的所有Hibernate依赖代码将在DAO层中,而JSF相关的代码将在VIEW层中。 万一我只需要在视图层或DAO层上迁移到新框架,这很好。
按功能打包(PBF)
逐功能包使用程序包来反映功能集。 它将与单个功能(仅该功能)相关的所有项目放置在单个目录/程序包中。 这导致包装具有高内聚性和高模块化性,并且包装之间的耦合最小。 紧密协作的项目彼此相邻放置。 它们不会散布到整个应用程序中。 这也增加了一致性,因为一个类的依赖性的很大一部分位于该类附近。
比较方法
让我在下面的维度中比较这两种方法。
1.添加新功能。
在必须将PBL代码添加到VIEW,SERVICE和DAO层的情况下,这可能很麻烦。 PBF通过将与同一功能相关的所有代码分组到一个目录中来解决此问题。
2.更改所使用的框架。
如前所述,由于所有相关代码都保存在同一位置,因此PBL使更改框架变得更加容易。 在这里,我们确切地知道更改的范围及其影响。 对于PBF,我们需要深入研究所有功能集以查看与框架相关的类。 如果选择逐模块迁移框架模块,则可能会认为PBF比PBL更好。
3.代码导航。
由于开发人员大多数时候需要使用这些功能,因此使用PBF进行代码导航更加容易。 当您确切知道该做什么时,它没有太大的优势。
4.保留通用代码。
每个应用程序都将具有一些组件,这些组件将在功能中重复使用,即,这些功能并不总是排他的。 在这种情况下,如果我们分别打包所有功能,则它们之间的交互可能会非常混乱。 作为一般原则,我们需要减少这种相互作用并增加包装内部的凝聚力。 我们可以通过将此类实体添加到通用包中来解决这种情况。 在包括Hibernate在内的许多项目中都使用了这种方法。
结论
大多数应用程序将具有4种类型的类。 即
- 域对象
- 商业服务
- 数据检索逻辑
- 数据表示逻辑
如果我们使用PBF,它将为我们提供良好的结构表示,但不会提供任何功能表示。 我们需要我们的体系结构以类似于问题域。 因此最好使用“按功能打包”样式。 我们可以使用诸如MyFeatureDAO或MyFeatureService之类的命名约定在内部对类进行分类。 这样我们就可以传达课程的意图。
我发现了有关此主题的一些讨论,希望对您有所帮助。
- Java实践文章
- Hibernate核心实现的经验教训
- 更改Java包名称如何改变我的系统架构
- 演讲者:Kostis Kapelonis
- OOD的原理Bob叔叔
- 文章说它更好地按层使用软件包
- 关于SO的问题按功能打包是否良好?
翻译自: https://www.javacodegeeks.com/2013/04/package-your-classes-by-feature-and-not-by-layers.html