按功能而不是按层打包课程
大多数企业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
按功能而不是按层打包课程相关推荐
- 李宏毅 课程打包_按功能而不是按层打包课程
李宏毅 课程打包 大多数企业Java应用程序在设计上都有一些相似之处. 这些应用程序的打包通常由它们使用的框架(如Spring,EJB或Hibernate等)驱动.或者,您可以按功能对打包进行分组. ...
- Spring项目的按层打包已过时
我认为Spring应用程序不应该以逐层方法构建. 在我看来,按功能打包更有意义. 首先,让我简要描述每种方法. "按层打包"(在非Java世界中为"按类型折叠" ...
- spring api层打包_Spring项目的按层打包已过时
spring api层打包 我认为Spring应用程序不应该以逐层方法构造. 在我看来,按功能打包更有意义. 首先,让我简要描述每种方法. "按层打包"(在非Java世界中为&qu ...
- C语言编程>第十四周 ⑦ 请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回。
例题:请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回. 例如,若有5门课程的成绩是88.92.80.61.5.55:则函数的值为75.30. 请勿改动主函数main与其 ...
- 音频中间件的7大功能 您无法抗拒的wwise好课程
原文标题:Dear Devs, 7 Reasons why your Game may need Audio Middleware 开发者们,您需要音频中间件的7个理由 市场上有几种音频中间件程序. ...
- osi七层网络层_OSI层速成课程
osi七层网络层 介绍 (Introduction) Have you ever wondered how data is sent through the network from one mach ...
- 试用UE4新的地形编辑功能:地形编辑层与Landmass中的地形蓝图笔刷
注意: 本篇只是对Landmas地形蓝图笔刷进行了最低程度的试用,内容也较乱. 最近我重新看了下这方面的内容,在<学习制作UE的地形蓝图笔刷(Landmass)>有对相关知识进行了更系统的 ...
- java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...
我目前正在阅读<Head First Design Patterns>一书,在"Decorator"一章中有以下示例: 在书中,conditionmentDecorat ...
- 保利威视频播放器功能抽取,仅作为播放课程资源使用,去除多余功能
由于项目中所使用的场景,除了直播和回放,还有一个就是简单的课程资源播放器,然后取出整体的冗余,使用一个较为简单播放器来进行播放操作.保利威直播的demo和开发文档,在实际调试过程中,让人非常头疼,在g ...
最新文章
- LINUX下PHP使用PDO访问MYSQL的连接设置注意事项
- 022_Jedis的事物
- linux 系统arp检测工具,linux网络常用诊断工具
- Android版哆啦A梦连连看游戏源码完整版
- java有理数类的封装_java实验报告有理数的类封装.doc
- linux中nodejs后台运行工具forever
- 数据模型和数据库系统的模型结构
- 系统调用和库函数调用
- 报错:使用java api连接redis集群时报错 READONLY You can't write against a read only slave....
- localhost方式提交作业到spark运行
- eeglab和matlab,EEGLAB for Matlab(一)--初识EEGLAB
- 自学单片机入门学习建议
- 按摩器具抽查三成不合格 选购需注意哪些?
- 如何保证手机APP兼容性覆盖测试
- 免费FTP解决方案之FileZilla
- 项目 编码规则(编写代码规则)
- python需要电脑多大内存合适_编程用surface怎么样发(学python要多大内存)
- C语言问题:0xC0000005: 写入位置 0xFFFFFFCC 时发生访问冲突。
- 李嘉诚汕头大学毕业典礼上致辞:无心睡眠
- 什么是API? [如何编写和阅读API文档]
热门文章
- drawroundrect java_Canvas中drawRoundRect()方法介绍
- 如何获得即时编译器(JIT)的汇编代码(linux环境下)
- ReviewForJob——深度优先搜索的应用
- MySQL的CRUD操作+使用视图
- 后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如
- java 正则表达式 开头_如何在Java中修复表达式的非法开头
- c 应用程序开发框架_企业应用程序开发框架的分类
- 不同的Hibernate命名策略
- dagger2 注入_使用Dagger 2在GWT中进行依赖注入
- 在Java中使用FileChannel和ByteBuffer对文件进行读写