按功能而不是按层打包课程

大多数企业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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go mod依赖离线安装_Go语言go mod包依赖管理工具使用详解

go modules 是 golang 1.11 新加的特性。现在 1.12 已经发布了,是时候用起来了。Modules 官方定义为: 模块是相关 Go 包的集合。modules 是源代码交换和版本控制的单元。go 命令直接支持使用 modules,包括记录和解析对其他模块的依赖性。modules 替换旧的基于 GOPATH 的方法…

总是助手服务器失败怎么回事,《遇见逆水寒》连接服务器失败解决方法汇总 服务器连接失败问题原因...

导读遇见逆水寒连接服务器失败怎么回事,近期不少小伙伴都在反映遇见逆水寒助手连接服务器失败,一直登不上去是怎么回事,小编这就为大家分享下遇见逆水寒连接服务器失败解决方法。遇见逆水寒连接服务器失败解决方法...遇见逆水寒连接服务器失败…

Linux常用开发环境软件-redis安装

linux下安装redis3.2.11版本  1、安装编译环境 yum install gcc  //安装编译环境 2、到官网下载redis 官网地址:https://redis.io/download 3、用WinScp工具,将下载好的redis-3.2.11.tar.gz传输到linux服务器下的opt目录下(opt就相当于window的d://so…

小程序css

样式导入 import /** common.wxss **/ .small-p { padding:5px; } /** app.wxss **/ import "common.wxss"; .middle-p { padding:15px; } 全局样式跟局部样式 定义在 app.wxss 中的样式为全局样式,作用于每一个页面。在 page 的 wxss 文件中定义的样式…

项目第十一天

站立式会议: 燃尽图: 项目: 项目进展:系统完成,进行测试。 问题:测试的时候发现不知道如何进行系统的测试,所以测试内容的比较乱。 体会:从无到有完成一个项目,需要很多步…

JPA:确定关系的归属方

使用Java Persistence API(JPA)时,通常需要在两个实体之间创建关系。 这些关系是通过使用外键在数据模型(例如数据库)中定义的,而在我们的对象模型(例如Java)中则使用注释来定义关联…

huffman编码python_Huffman coding python实现

python实现的Huffman coding,给26个英文字母编码,inspired by Dave. 他只给出了Huffman tree的构建,并将walk_tree留给了提问者自己完成。我将walk_tree实现了一下并输出结果,做个记录,也顺便分享给有需要的同学。impo…

服务器芯片镜像测试,模拟镜像服务器磁盘问题的两个测试【转】

我们知道在高安全模式下,在主服务器上提交的事务必须同时在镜像服务器上提交成功,否则该事务无法在主数据库上提交。在上面的图中,一个事务在主数据库上提交的步骤包含:客户端程序将事务发送给主数据库服务器SQLServer主数据库服务…

运用Arc Hydro提取河网

Arc hydro 插件需要 spatial analyst 支持: 解决方法:Tools菜单>>Extensions...,勾选Spatial Analyst 1.设置存储路径 ApUtilities-set target locations 2.导入dem 3.拼接dem Dataset Name 设置为.tif,即存为tif格式,否则…

Java EE CDI依赖注入(@Inject)教程

在本教程中,我们将向您展示如何在CDI管理的Bean中实现依赖注入。 特别是,我们将利用CDI API提供的Inject批注将CDI bean注入另一个bean。 这样,可以在应用程序(例如JavaServer Faces应用程序)中使用bean。 CDI提供了几…

js 字符串减去字符串_JS去掉字符串前后空格或去掉所有空格的用法

1、 去掉字符串前后所有空格:代码如下:function Trim(str){return str.replace(/(^\s*)|(\s*$)/g, "");}说明:如果使用jQuery直接使用$.trim(str)方法即可,str表示要去掉前后所有空格的字符串。2、 去掉字符串中所有空…

文本强制不换行并隐藏

记录一个简单的css样式,重点:style"width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;",必须要有个宽度,white-space:nowrap;禁止换 行,overflow:hidden;隐藏多余的文本,text-overfl…

服务器性能是什么,什么是服务器性能的显卡,怎么理解?

什么是服务器性能的显卡,怎么理解?如果单说“”二字就是个伪命题,服务分不同的性能级别,有些刀片器的性能甚至还不如某些发烧级的游戏台式机,那它所用的显卡性能也会比较一般,如果是说哪些显卡是专门为服务…

JSON处理的Java API(JSR-353)–流API

Java很快将具有一组标准的API,作为Java EE 7的一部分处理JSON。此标准定义为JSR 353 – JSON处理的Java API (JSON-P),目前正在最终批准投票中。 JSON-P提供面向对象和基于流的方法,在本文中,我将介绍流API…

判的质数的三种方法

方法一&#xff1a;bool判断法 Console.Write("q请输入一个数&#xff1a;"); int aint.Parse(Console.ReadLine()); bool isFind false; for (int i 2; i < a - 1; i) {   if (a % i 0)   {     isFind true;     break;   } } if (isFind tr…

记录工作中常用的CSS3

1.边框圆角,边框阴影 border-radius:6px; // border-radius:50%; //圆形 box-shadow: 1px 1px 1px #666; //box-shadow: h-shadow v-shadow blur spread color inset(outset); 2.背景图片的大小 background-size: 100% 100%; //对背景图片进行拉伸&#xff0c;使其完成填充内…

pcb成型板aoi检测_基于AOI技术的PCB常见质量缺陷检测

..优质资料..基于AOI技术的PCB常见质量缺陷检测摘要&#xff1a;印制电路板简称PCB&#xff0c;作为电子元器件的支撑体和电子元器件电气连接的载体&#xff0c;是重要的电子部件&#xff0c;由于它采用的是电子印刷术制作的&#xff0c;所以被称为印制电路板。AOI全称自动光学…

直接从JBoss AS 7组件使用JGroups

JGroups是Bela Ban的用于可靠消息交换的软件&#xff0c;该软件高度可配置&#xff0c;可以使用TCP或UDP作为传输协议。 基本上&#xff0c;您在多个客户端上运行JGroup&#xff0c;它们构成一个集群&#xff0c;它们可以在集群内发送和接收消息。 JGroups由JBoss Infinispan内…

LeetCode(28): 实现strStr()

Easy&#xff01; 题目描述&#xff1a; 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack "hello"…

vue2.0 配置build项目打包目录、资源文件(assets\static)打包目录

vue项目默认的打包路径&#xff1a;根目录下的dist文件夹下&#xff1b; 但是在项目开发中&#xff0c;我们肯定希望项目提交到svn目录或者git目录下&#xff0c;否则每次复制过去&#xff0c;太麻烦了&#xff1b; 那怎么配置打包路径呢&#xff1f;下面来看看&#xff1b; 我…