包装类型与包装类别_包装的重要性

包装类型与包装类别

我记得大约15年前开始学习Java的时候。 我读到了很多有关“包装”和“命名空间”的东西,但我完全不了解。 可悲的是:虽然包装的某些方面几乎为行业中的每个人所了解,但其他方面却不是。 因此,让我们看一下哪些软件包最适合。

命名空间:

通过为您的所有程序包加上您所控制的域的前缀,可以确保您的类名是唯一的。 这对于数量惊人的开源项目的成功至关重要。 每个项目都可以(并且可能在某个阶段进行定义)定义一个“ Filter”类,而不会干扰该类的所有其他同名类(除了可怜的开发人员,他们从网络上复制了一些没有导入语句的代码,现在以找出实际引用了哪个Filter类)。 这是一个很好的理解,而且我还没有看到根软件包的任何相关用法。

组织:

我儿子有一大盒乐高积木。 可能有成千上万个。 当他寻找简单的2×4砖块时,这不是问题。 但是,当他正在搜索仅在集合中存在4次甚至只有一次的特殊砖块时? 可能需要很长时间才能找到它。 将其与药剂师柜子比较。 数百种药物,通常只需几秒钟即可找到合适的药物。 而且他们甚至都没有使用Google! 它们只是每种药物所属的严格订购原则,包括一条规则,即如何确定新药的正确框。 由于涉及的每个人都知道该原理,因此很容易确定要在其中找到毒品的正确盒子。 当在项目早期建立时,这样的排序原则将非常有用。
当定义这样的原则时,一个标准在大多数时间是不够的。 但是,如果您使用更多的规则,则使规则正交,以确保它们不会干扰。 这意味着没有规则说:“所有数据库访问代码都必须放入软件包x中”,而另一条规则规定“与客户相关的所有代码都必须放入软件包y中”。 否则,您将不知道将CustomerDAO放在哪里。 而是在包树的不同深度上应用正交规则。 我的默认包结构如下所示:

<organisational-prefix>.<application>.<deployment-unit>.<module>.<layer>.<optional further substructure if needed>

这将导致软件包名称,例如com.mycompany.theCoolApp.server.user.persistencecom.mycompany.theCoolApp.client.shoppingCart.presentation

如果您查看这样的包结构,则很明显新类属于什么地方,或者类似的东西已经存在的地方。 如果避免使用诸如utilmisc类的名称,它们可能会或多或少地隐藏所有内容,则效果会更好。 您也可以查看这些软件包并立即了解有关体系结构的知识。 一旦看到一个名为clientwebserverbatchserver的软件包级别,您就会在脑海中形成一个模型,说明应用程序的结构以及名称的选择是否正确。 由于在每个module中都应用了相同的layers规则,因此您也可以在较低的软件包中找到有关应用程序结构的更多信息。

之间的module传达应用程序要处理的领域的类型。 很自然,重要的概念会得到自己的包装,从而使每个检查代码的人都可以声明:这是此应用程序中的重要概念。

我还喜欢添加规则,“一个包应包含ab类,但不得包含c或更多类”,并为a,b和c设置适当的值。 随着应用程序的增长,这将强制创建新的软件包,从而使每个软件包保持可管理的大小。

当然,在较小的应用程序中,结构可能会缩小。 例如,如果只有一个部署单元,则无需为该分类使用单独的程序包级别。

包的最后一种用法是最被忽略的: 中间建模块 :Joe Average Developer主要关注类和方法以及单行代码,同时尝试在该级别上提出适合应用程序需求的代码结构。 通常,有些架构师会弄清楚如何部署应用程序,从而确定必要的部署单元(请考虑单独的jar)。 如果您查看这些工件的规模,可能会发现一些有趣的东西:

  • 1种方法由大约10行代码组成。
  • 1类包括大约10种方法。
  • 1罐子大约包含100 – 1000类。

如果没有人照顾包裹,则至少会缺少一种结构,常常会缺少两层结构! 可以并且应该用包装来填补这个空白。 这不仅意味着包装应该存在并且具有合理的尺寸,还意味着它们应该遵循通用的设计准则。 特别是“ 单一责任原则”和对依赖项的正确处理:

单一责任原则:

通过上面提出的命名方案,完成了兑现SRP的大量工作。 如果软件包的内容符合其名称说明,那么在此方面一切都很好。

依赖性管理:

是更强悍的野兽。 Java当前没有提供适当的系统来控制软件包之间的依赖关系,尤其是超级软件包,即包含多个其他软件包的软件包。 有OSGI ,但是我发现使用它很麻烦 ,特别是因为我不需要所有的动态加载内容,但是却遭受了类加载器问题的困扰。 也有拼图,但还不存在。 因此,我更喜欢使用自定义测试来定义和验证所使用的应用程序的程序包结构。 我选择的工具是JDepend 。 它为您提供了程序包之间的依赖关系列表,您可以使用它们将它们与您定义的规则进行比较。 有人创建了从程序包A到程序包B的依赖关系,该依赖关系不应该存在? 动臂,测试变成红色。
那么对程序包依赖性有用的规则是什么? 第一:无周期。 不在包级别上,也不在layer级别上或module级别上,如上所述。 第二:模块和层具有严格的顺序,在顺序上它们可以相互依赖,其他所有内容均被禁止。

这些规则极大地限制了开发人员的自由度。 但是以我的经验,它消除了违反“单一责任原则”的情况,该原则经常以循环依赖的形式出现。 例如,如果您有一个Order模块和一个Customer模块,则感觉这两个需要彼此了解。 如果您有订单,则想知道该订单所属的客户。 如果您有客户,您必须能够告诉她所下的订单。 对? 很可能是。 但是,您是否需要两侧都有完整的对象和功能? 可能不是。 例如,通过提供一个界面包,其中仅包含订购模块所需的客户功能的最核心部分,以及一个单独的完整的具有参考订单的客户模块, 可以打破这些依赖关系并在您的需求中实现更强的关注分离包装结构。

当您尝试开发应用程序时,这反过来会有所帮助。 今天的软件包有一天可能会成长为一个部署单元,如果您在部署单元之间存在循环依赖关系,则会遇到一些严重的问题。 也许您的团队成长为多个团队。 有了如上所述的干净的程序包结构,当团队必须坐在一起讨论由多个团队使用的程序包的更改时,您将有明显的界限可以拆分,并且还有明显的标准。

参考:来自Schaderhaft博客的JCG合作伙伴 Jens Schauder 的软件包重要性 。

翻译自: https://www.javacodegeeks.com/2013/01/the-importance-of-packages-3.html

包装类型与包装类别

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

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

相关文章

isinstance和issubclass

目录 一、isinstance与type二、issubclass一、isinstance与type 在游戏项目中&#xff0c;我们会在每个接口验证客户端传过来的参数类型&#xff0c;如果验证不通过&#xff0c;返回给客户端“参数错误”错误码。 这样做不但便于调试&#xff0c;而且增加健壮性。因为客户端是可…

animation动画不生效_你可能不知道的Animation动画技巧与细节

引言在 web 应用中&#xff0c;前端同学在实现动画效果时往往常用的几种方案&#xff1a;css3 transition / animation - 实现过渡动画setInterval / setTimeout - 通过设置一个间隔时间来不断的改变图像的位置requestAnimationFrame - 通过一个回调函数来改变图像位置&#xf…

eclipse查看jar包源代码

方法一&#xff1a;将jd-gui集成在Eclipse中 https://jingyan.baidu.com/article/b24f6c8275536686bfe5daed.html 下载2个反编译文件&#xff0c;实际操作未解决 https://www.cnblogs.com/jianshuai520/p/9267273.html 反编译器的位置&#xff0c;发生改变 方法二&#xf…

微服务系列:MicroProfile和Apache TomEE

介绍 MicroProfile是一项由知名供应商于2016年9月发起的举措&#xff0c;目的是基于JEE平台构建微服务架构。 任务是针对微服务架构优化Enterprise Java 。 开发人员可以利用这种体系结构&#xff0c;通过Enterprise Java平台以标准化的方式构建和开发微服务应用程序。 API构建…

crash recovery mysql_InnoDB crash recovery 完整过程

mysql Innodb在发生意外宕机&#xff0c;重启之后&#xff0c;要经历哪些过程&#xff0c;以下是详细过程。• Tablespace discoveryTablespace discovery is the process that InnoDB uses to identify tablespaces that require redo log application. See Tablespace Discov…

Java –远景JDK 8

世界正在缓慢但肯定地发生变化。 在进行了更改之后&#xff0c;使Java有了JDK 7的全新外观&#xff0c;Java社区期待JDK 8以及JDK 9附带的其余改进。 JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题&#xff0c;应该在2013年底之前为广大读者所用&#xff0c…

python三大结构、顺序结构_Python学习笔记3——三大结构:顺序,分支,循环3

顺序自上而下&#xff0c;依次执行分支分支的基本语法if 条件表达式&#xff1a;语句1语句2语句3......条件表达式就是计算结果必须为布尔值的表达式表达式后面的冒号不能少注意if后面的出现的语句&#xff0c;如果属于if语句块&#xff0c;则必须同一个锁紧等级条件表达式结果…

网络布线和数据转换

T568A 白绿 绿 白橙 蓝 白蓝 橙 白棕 棕 T568B 白橙 橙 白绿 蓝 白蓝 绿 白棕 棕 同种设备用交叉线 不同设备用直通线相连 PC与路由器为同种设备 交换机自成一派 转载于:https://www.cnblogs.com/qingqing1/p/11166632.html

Java 9模块系统(拼图)@ LJC的HackTheTower

今天&#xff0c;我们花了半天时间参加了第一次HackTheTower活动。 伦敦的Java用户组&#xff08;aka LJC &#xff09;的成员应伦敦市的邀请&#xff0c;聚集在伦敦市SalesForceTower&#xff08;aka Heron Tower &#xff09;26楼。 Heather VanCura是Java社区流程的主席 马…

在命令行下对ntfs分区文件夹权限的设置

随着Windows XP/Server 2003的流行&#xff0c;越来越多的用户开始选择NTFS文件系统&#xff0c;NTFS的好处自然是大大增强了系统的安全性&#xff0c;在“安全”标签页下&#xff0c; 我们可以在这里为不同级别的用户设置相应的访问控制权限&#xff0c;包括完全控制、修改、读…

uglifyjs报错 webpack_webpack3里使用uglifyjs压缩js时打包报错的解决

环境&#xff1a;webpac<4的下&#xff0c;安装uglifyjs。cnpm install uglifyjs-webpack-plugin -D安装完毕后&#xff0c;去npm里查看uglifyjs的使用方法并添加到代码中&#xff1a;const UglifyJsPlugin require(uglifyjs-webpack-plugin)module.exports {//...optimiz…

描述一下JVM加载class文件的原理机制

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊的…

xtend怎么使用_使用Xtend构建Vaadin UI

xtend怎么使用今天&#xff0c;我决定向Xtend打个招呼。 我希望学习一些新的编程语言。 选择一个标准的清单并不多。 它必须是在JVM上运行的编程语言&#xff0c; 如果我不需要学习用于建筑应用的全新生态系统&#xff0c;那就太好了。 我检查了几个选项。 JVM的编程语言列表…

linux mysql 写shell_Linux—编写shell脚本操作数据库执行sql

修改数据库数据在升级应用时&#xff0c;我们常常会遇到升级数据库的问题&#xff0c;这就涉及到sql脚本的编写。一般我们会通过写sql脚本&#xff0c;然后将xxx.sql脚本放到数据库中进行source xxx.sql执行。本篇文章&#xff0c;我们可以通过写shell脚本来执行数据库操作。配…

DMN 1.1 XML:使用Drools 7.0从建模到自动化

我是一名自由顾问&#xff0c;但今天我是一名博士生。 本文的全球背景是企业架构&#xff08;EA&#xff09;&#xff0c;它需要对企业进行建模。 由于EA的一个方面是业务流程建模&#xff0c;所以我使用BPMN已有数年之久&#xff0c;但是这种表示方式并不十分适合表示决策标准…

mysql安装模块解释_MySQL的模块不能安装的解决方法_MySQL

我们最常用的 DBD::mysql 模块,我发现是难住很多人的地方.因为安装老是失败,下面我介绍一下解决方法,比如我使用 cpanm 安装,有时就出 /home/nue2501j/work/DBD-mysql-4.010/blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: DBIc_TRACE_LEVEL at /usr/lib/perl5/5.8.5/i…

nginx访问目录是没加/的重定向控制

static 模块提供了root与alias功能&#xff1b;发现目标是目录时&#xff1b;但URI末尾未加/时&#xff1b;会返回301重定向&#xff1b;重定向后会加/ 指令 Syntax: server_name_in_redirect on | off;# 控制返回那个域名 Default: server_name_in_redirect off; Context: ht…

oracle mysql 字段_Oracle和MySQL修改字段

一、修改字段名&#xff1a;Oracle&#xff1a;ALTER TABLE tableName RENAME COLUMN oldColumnName TO newColumnName;eg: ALTER TABLE web RENAME COLUMN wen_name TO web_name;MySQL&#xff1a;ALTER TABLE tableName CHANGE oldColumnName newColumnName newColumnDataTyp…

Kafka REST Proxy for MapR Streams入门

介绍 MapR生态系统软件包2.0&#xff08;MEP&#xff09;随附了一些与MapR流有关的新功能&#xff1a; MapR Streams的Kafka REST代理为MapR Streams和Kafka集群提供RESTful接口&#xff0c;以使用和生成消息并执行管理操作。 Kafka Connect for MapR Streams是一个实用程序&…

开张大吉

在Windows的天地中做了五年开发之后&#xff0c;又跑到了开源的Linux/Java世界遨游了五年&#xff0c;于最近半年&#xff0c;又重新回到M$阵营。这半年来&#xff0c;迫于项目进度的压力&#xff0c;较少与他人交流&#xff0c;项目中虽然采用了VS2003&#xff0c;但是运用的思…