大多数企业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种类型的类。 即

  1. 域对象
  2. 商业服务
  3. 数据检索逻辑
  4. 数据表示逻辑

如果我们使用PBF,它将为我们提供良好的结构表示,但不会提供任何功能表示。 我们需要我们的体系结构以类似于问题域。 因此最好使用“按功能打包”样式。 我们可以使用诸如MyFeatureDAOMyFeatureService之类的命名约定在内部对类进行分类。 这样我们就可以传达课程的意图。

我发现了有关此主题的一些讨论,希望对您有所帮助。

  1. Java实践文章
  2. Hibernate核心实现的经验教训
  3. 更改Java包名称如何改变我的系统架构
  4. 演讲者:Kostis Kapelonis
  5. OOD的原理Bob叔叔
  6. 文章说它更好地按层使用软件包
  7. 关于SO的问题按功能打包是否良好?
参考:在The Object Oriented Life博客中, 按功能而不是按层打包来自我们JCG合作伙伴 Manu PK的类。

翻译自: https://www.javacodegeeks.com/2013/04/package-your-classes-by-feature-and-not-by-layers.html

按功能而不是按层打包课程相关推荐

  1. 李宏毅 课程打包_按功能而不是按层打包课程

    李宏毅 课程打包 大多数企业Java应用程序在设计上都有一些相似之处. 这些应用程序的打包通常由它们使用的框架(如Spring,EJB或Hibernate等)驱动.或者,您可以按功能对打包进行分组. ...

  2. Spring项目的按层打包已过时

    我认为Spring应用程序不应该以逐层方法构建. 在我看来,按功能打包更有意义. 首先,让我简要描述每种方法. "按层打包"(在非Java世界中为"按类型折叠" ...

  3. spring api层打包_Spring项目的按层打包已过时

    spring api层打包 我认为Spring应用程序不应该以逐层方法构造. 在我看来,按功能打包更有意义. 首先,让我简要描述每种方法. "按层打包"(在非Java世界中为&qu ...

  4. C语言编程>第十四周 ⑦ 请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回。

    例题:请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回. 例如,若有5门课程的成绩是88.92.80.61.5.55:则函数的值为75.30. 请勿改动主函数main与其 ...

  5. 音频中间件的7大功能 您无法抗拒的wwise好课程

    原文标题:Dear Devs, 7 Reasons why your Game may need Audio Middleware 开发者们,您需要音频中间件的7个理由 市场上有几种音频中间件程序. ...

  6. osi七层网络层_OSI层速成课程

    osi七层网络层 介绍 (Introduction) Have you ever wondered how data is sent through the network from one mach ...

  7. 试用UE4新的地形编辑功能:地形编辑层与Landmass中的地形蓝图笔刷

    注意: 本篇只是对Landmas地形蓝图笔刷进行了最低程度的试用,内容也较乱. 最近我重新看了下这方面的内容,在<学习制作UE的地形蓝图笔刷(Landmass)>有对相关知识进行了更系统的 ...

  8. java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...

    我目前正在阅读<Head First Design Patterns>一书,在"Decorator"一章中有以下示例: 在书中,conditionmentDecorat ...

  9. 保利威视频播放器功能抽取,仅作为播放课程资源使用,去除多余功能

    由于项目中所使用的场景,除了直播和回放,还有一个就是简单的课程资源播放器,然后取出整体的冗余,使用一个较为简单播放器来进行播放操作.保利威直播的demo和开发文档,在实际调试过程中,让人非常头疼,在g ...

最新文章

  1. LINUX下PHP使用PDO访问MYSQL的连接设置注意事项
  2. 022_Jedis的事物
  3. linux 系统arp检测工具,linux网络常用诊断工具
  4. Android版哆啦A梦连连看游戏源码完整版
  5. java有理数类的封装_java实验报告有理数的类封装.doc
  6. linux中nodejs后台运行工具forever
  7. 数据模型和数据库系统的模型结构
  8. 系统调用和库函数调用
  9. 报错:使用java api连接redis集群时报错 READONLY You can't write against a read only slave....
  10. localhost方式提交作业到spark运行
  11. eeglab和matlab,EEGLAB for Matlab(一)--初识EEGLAB
  12. 自学单片机入门学习建议
  13. 按摩器具抽查三成不合格 选购需注意哪些?
  14. 如何保证手机APP兼容性覆盖测试
  15. 免费FTP解决方案之FileZilla
  16. 项目 编码规则(编写代码规则)
  17. python需要电脑多大内存合适_编程用surface怎么样发(学python要多大内存)
  18. C语言问题:0xC0000005: 写入位置 0xFFFFFFCC 时发生访问冲突。
  19. 李嘉诚汕头大学毕业典礼上致辞:无心睡眠
  20. 什么是API? [如何编写和阅读API文档]

热门文章

  1. drawroundrect java_Canvas中drawRoundRect()方法介绍
  2. 如何获得即时编译器(JIT)的汇编代码(linux环境下)
  3. ReviewForJob——深度优先搜索的应用
  4. MySQL的CRUD操作+使用视图
  5. 后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如
  6. java 正则表达式 开头_如何在Java中修复表达式的非法开头
  7. c 应用程序开发框架_企业应用程序开发框架的分类
  8. 不同的Hibernate命名策略
  9. dagger2 注入_使用Dagger 2在GWT中进行依赖注入
  10. 在Java中使用FileChannel和ByteBuffer对文件进行读写